هل هناك حد مستوى مكدس المكدس؟
سؤال
لدي اثنين من الزملاء الذين ينظرون إلى بعض الكود السيئ في Excel VBA، أتساءل هل هناك حد لعدد المستويات في مكدس المكالمات
المحلول
ما لم تتمكن الوظيفة من الذيل العريض ويمكن أن تتعامل VBA التعامل مع ذلك (الذي لا يستطيع)، فسوف تعمل في تجاوز سعة مكدس.
كاختبار بسيط اخترقتهما معا المقتطف التالي:
Dim count As Integer
Sub Rec()
count = count + 1
Cells(1, 1) = count
Call Rec
End Sub
الذي يخبرنا أن الحد من هذا هو 4007 تكرار، على الأقل في الإصدار الخاص بي من Excel 2007 هنا.
نصائح أخرى
الجواب القصير هو نعم، في النهاية ستحصل على استثناء تجاوز سعة مكدس.
لست متأكدا ما هو الحد على الرغم من.
أنا فقط ركضت هذه الماكرو في 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
سؤال قديم أعرفه، لكنني اعتقدت أنه قد يكون من المفيد أن يكون هناك معلومات محدثة حول هذا السؤال كما كنت أبحث عنه اليوم.
يبدو أن الحد الأقصى الصعب هو 6801 مكالمات عميقة لإجراء أقل معلمة في Excel 2016. كما يقول VBA_INTRATETER، يقلل هذا الرقم مع عدد المعلمات إلى الإجراء التكريبي.
ركضت الاختبارات التالية في Excel 2016:
Sub Recuresestatic (بدون معلمات) تفيض بعد 6801 إلغاء.
Sub Recurse1 (مع 1 معلمة) تفيض بعد 6442 إلغاء القيادة.
Sub Recurse2 (مع 2 معلمات) تفيض بعد 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
ركضت رمز أندرز في Excel 2013 وكانت النتيجة فقط 1180. لست متأكدا مما إذا كان قد قلل من الحد الأقصى العريض في الإصدارات الأحدث من Excel أو إذا كانت المشكلة تعتمد على الجهاز أو Whatnot.
تحرير: أيضا، تغيرت: activecell.formular1c1c1 = str $ (المستوى) إلى النطاق ("A1"). Formular1c1 = Str $ (المستوى)
وانخفض عدد المكالمات إلى 807. كما أنني قد أضافت صريح الخيار.
مكدس استهلاك الذاكرة.
كما أفهم المكدس إذا استخدمت لتخزين المعلمات للإجراءات، والمتغيرات المحلية في الإجراءات.
لذلك سوف يكون استهلاك مساحة المكدس، يتناسب مع عدد المكالمات العودية.
لذلك الحجم اللازم للمكدسة هو شيء مثل: عدد المكالمات العودية * (حجم معلمات الاتصال + مساحة للمتغيرات المحلية)