C'è un limite di chiamata di livello di stack?
Domanda
Ho un paio di colleghi guardando un po 'di codice cattivo in Excel VBA, chiedendosi c'è un limite al numero di livelli in uno stack di chiamate
Soluzione
A meno che la funzione è ricorsiva in coda e VBA può gestire questo (che non può), si incorrerà in un overflow dello stack.
Come un semplice test ho messo insieme il seguente frammento:
Dim count As Integer
Sub Rec()
count = count + 1
Cells(1, 1) = count
Call Rec
End Sub
che ci dice che il limite per questo è 4007 iterazioni, almeno nella mia versione di Excel 2007 qui.
Altri suggerimenti
La risposta è sì, alla fine si otterrà un'eccezione di overflow dello stack.
Non sono sicuro che il limite è però.
Ho appena eseguito questa macro in Excel 2003, ed ha ottenuto 4775 chiamate in profondità prima ho avuto l'errore 28, "Out of spazio di stack":
Sub Macro1()
recurse (0)
End Sub
Sub recurse(level As Long)
ActiveCell.FormulaR1C1 = Str$(level)
Call recurse(level + 1)
End Sub
Old domanda lo so, ma ho pensato che potrebbe essere utile avere un po 'di informazioni aggiornate su questa questione come stavo cercando per oggi.
Il limite rigido sembra essere 6801 chiamate profondo per una procedura di parametri-less in Excel 2016. Come dice VBA_interested, questo numero si riduce con il numero di parametri alla procedura ricorsiva.
Ho eseguito le seguenti prove in Excel 2016:
Sub RecurseStatic (senza parametri) traboccato dopo 6801 ricorsioni.
Sub Recurse1 (con 1 il parametro) traboccato dopo 6442 ricorsioni.
Sub Recurse2 (con 2 parametri) traboccato dopo 6120.
Option Explicit
Sub RecurseStatic()
Static i As Long
Debug.Print i
i = i + 1
RecurseStatic
End Sub
Sub RunRecurse1()
Recurse1 0
End Sub
Sub Recurse1(i As Long)
Debug.Print i
Recurse1 i + 1
End Sub
Sub RunRecurse2()
Recurse2 0, 0
End Sub
Sub Recurse2(i As Long, j As Long)
Debug.Print i, j
Recurse2 i + 1, j + 1
End Sub
Ho eseguito il codice Anders' in Excel 2013 e il risultato è stato 1180. Non è sicuro solo se hanno ridotto il limite di ricorsione nelle versioni più recenti di Excel o se il problema è dipendente dalla macchina o roba del genere.
Edit: Inoltre, modificata: ActiveCell.FormulaR1C1 = Str $ (livello) per Range ( "A1"). FormulaR1C1 = Str $ (livello)
E il # di chiamate è sceso a 807. Avevo anche aveva aggiunto Option Explicit.
il consumo di memoria stack.
Come capisco la pila se utilizzato per la memorizzazione di parametri delle procedure, e per le variabili locali nelle procedure.
Pertanto sarà il consumo di spazio di stack, essere proporzionale al numero di chiamate ricorsive.
Quindi la dimensione necessaria dello stack è qualcosa di simile: numero di chiamate ricorsive * (dimensioni di chiamare parametri + spazio per le variabili locali)