我有幾個同事在Excel VBA中看一些錯誤的代碼,想知道是否有一個調用堆棧中的級別數量限制是否存在調用堆棧級別限制?
回答
除非函數是尾遞歸和VBA就可以搞定(它不能),你會遇到堆棧溢出。
作爲一個簡單的測試,我砍死在一起,下面的代碼片段:
Dim count As Integer
Sub Rec()
count = count + 1
Cells(1, 1) = count
Call Rec
End Sub
告訴我們,這個極限是4007次迭代,至少在我的版本的Excel 2007年在這裏。
簡短回答是肯定的,最終你會得到一個堆棧溢出異常。
不知道限制是什麼。
根據其他答案,似乎限制可能取決於一些因素,所以你不應該依賴任何特定的數字。只要你沒有做大規模的遞歸,你應該沒問題,沒有達到極限。 –
該限制將與Excel在進程運行時(VBA)中可用的內存有關,該進程受操作系統分配的用戶模式空間量的進一步限制。在實踐中,我不認爲你可以捕捉這個錯誤(由於AV),但我可能是錯的。不要寫蹩腳的遞歸函數。 –
我只是跑這個宏在Excel 2003中,並得到了深刻的4775個電話之前,我有錯誤28,「外出時的堆棧空間」:
Sub Macro1()
recurse (0)
End Sub
Sub recurse(level As Long)
ActiveCell.FormulaR1C1 = Str$(level)
Call recurse(level + 1)
End Sub
我在Excel 2013中運行了Anders的代碼,結果只有1180.不知道他們是否已經降低了新版本Excel中的遞歸限制,或者如果問題是依賴於機器的或不是什麼的。
編輯:另外,改: ActiveCell.FormulaR1C1 =海峽$(水平) 到 範圍( 「A1」)FormulaR1C1 =海峽$(水平)
,並調用的#跌至807。我還添加了Option Explicit。
堆棧內存消耗。
正如我所理解的堆棧,如果用於存儲過程的參數和過程中的局部變量。
因此會消耗棧空間,與遞歸調用次數成正比。
所以堆棧所需大小是一樣的東西: 數遞歸調用*(調用參數爲局部變量+空間的大小)
- 1. iOS中的堆棧項目是否存在內存限制?
- 2. 在C#中調用堆棧限制
- 3. .NET堆棧內存限制
- 4. 堆棧大小的最大使用限制是否有限制?
- 5. Rails控制檯:用戶不會保存 - 堆棧級別太深
- 6. 在PhantomJS中,函數調用堆棧限制是什麼?
- 7. Parslet:SystemStackError:堆棧級別太深
- 8. @ page.title:SystemStackError(堆棧級別太深)
- 9. SystemStackError - 堆棧級別太深
- 10. SystemStackError(堆棧級別太深)
- 11. 堆棧級別太深ActionMailer
- 12. rspec堆棧級別太深
- 13. rake_test_loader.rb - 堆棧級別太深
- 14. 在所有計算機上,程序的調用堆棧限制是否一致?
- 15. 'this'引用是否存儲在Java的調用堆棧中?
- 16. Google Analytics中是否存在任何頁面級別的限制?
- 17. Excel中的分組深度級別是否存在限制?
- 18. YAML縮進級別是否有限制?
- 19. 是否可以在JavaScript中保存/恢復調用堆棧?
- 20. 內存限制堆棧的名稱?
- 21. 在遞歸調用API時保持堆棧級別太深
- 22. Symbian的堆棧限制是否也適用於PyS60?
- 23. Django是否具有調製級別?
- 24. DevC++(Mingw)堆棧限制
- 25. 在MEAN堆棧中實現權限級別的最佳方式是什麼?
- 26. 是否可以在應用程序級別限制請求域?
- 27. Perl程序返回兩個堆棧調用級別
- 28. 僅在級別調試時打印堆棧跟蹤
- 29. Linux中進程的堆棧大小是否有限制
- 30. Rails無限循環 - 堆棧級別太深
它只是我認爲,提出這個網站上的所謂的計算器是莫名其妙滑稽? –