मैं इसे पोस्ट करके एक अंग पर जा रहा हूं, लेकिन मुझे लगता है कि इसका जवाब है:
550 और 575 के बीच
Visual Studio 2015 में डिफ़ॉल्ट सेटिंग्स के साथ
मैंने एक छोटा सा प्रोग्राम बनाया जो नेस्टेड for
लूप्स उत्पन्न करता है ...
for (int i0=0; i0<10; i0++)
{
for (int i1=0; i1<10; i1++)
{
...
...
for (int i573=0; i573<10; i573++)
{
for (int i574=0; i574<10; i574++)
{
Console.WriteLine(i574);
}
}
...
...
}
}
500 नेस्टेड छोरों के लिए, कार्यक्रम अभी भी संकलित किया जा सकता है। 575 छोरों के साथ, संकलक बाहर निकलता है:
चेतावनी AD0001 विश्लेषक 'Microsoft.CodeAnalysis.CSharp.Diagnostics.SimplifyTypeNames.CSharpSimplifyTamesNiDiagnosticAnalyzer' ने 'System.InsufficExecutionStackException' के एक अपवाद को फेंक दिया, संदेश के साथ अपर्याप्त स्टैक को सुरक्षित रूप से प्रोग्राम को जारी रखने के लिए। यह कॉल स्टैक पर बहुत अधिक फ़ंक्शन होने या स्टैक पर फ़ंक्शन बहुत अधिक स्टैक स्पेस का उपयोग करने से हो सकता है। '।
अंतर्निहित संकलक संदेश के साथ
CS8078 त्रुटि: एक अभिव्यक्ति संकलन के लिए बहुत लंबा या जटिल है
बेशक, यह एक विशुद्ध रूप से काल्पनिक परिणाम है। यदि अंतरतम लूप एक से अधिक हैConsole.WriteLine
, तो स्टैक आकार से अधिक होने से पहले कम नेस्टेड लूप संभव हो सकते हैं। इसके अलावा, यह एक कड़ाई से तकनीकी सीमा नहीं हो सकती है, इस अर्थ में कि "विश्लेषक" के लिए अधिकतम स्टैक आकार बढ़ाने के लिए छिपी हुई सेटिंग्स हो सकती हैं, जो त्रुटि संदेश में उल्लिखित है, या (यदि आवश्यक हो) जिसके परिणामस्वरूप निष्पादन योग्य हो। हालांकि, उत्तर का यह हिस्सा उन लोगों के लिए छोड़ दिया गया है, जो C # को गहराई से जानते हैं।
अपडेट करें
टिप्पणी में सवाल के जवाब में :
मुझे यह साबित करने में दिलचस्पी होगी कि प्रयोगात्मक रूप से "साबित" किए गए इस जवाब को देखें कि क्या आप स्टैक पर 575 स्थानीय चर डाल सकते हैं, यदि उनका उपयोग लूप में नहीं किया जाता है, और / या आप 575 गैर-नेस्टेड -लूप में डाल सकते हैं या नहीं एक एकल समारोह
दोनों मामलों के लिए, उत्तर है: हां, यह संभव है। 575 ऑटो-जनरेटेड स्टेटमेंट के साथ विधि को भरने पर
int i0=0;
Console.WriteLine(i0);
int i1=0;
Console.WriteLine(i1);
...
int i574=0;
Console.WriteLine(i574);
यह अभी भी संकलित किया जा सकता है। बाकी सब मुझे हैरान कर देते। int
चरों के लिए आवश्यक स्टैक का आकार सिर्फ 2.3 KB है। लेकिन मैं उत्सुक था, और आगे की सीमाओं के लिए परीक्षण करने के लिए, मैंने इस संख्या को बढ़ाया। आखिरकार, यह संकलित नहीं हुआ , जिससे त्रुटि हुई
त्रुटि CS0204: केवल 65534 स्थानीय लोगों, जिनमें कंपाइलर द्वारा उत्पन्न किया गया है, की अनुमति है
जो एक दिलचस्प बिंदु है, लेकिन पहले से ही कहीं और देखा गया है: विधि में चर की अधिकतम संख्या
इसी तरह, 575 गैर-नेस्टेड- for
फ्लॉप, जैसा कि
for (int i0=0; i0<10; i0++)
{
Console.WriteLine(i0);
}
for (int i1=0; i1<10; i1++)
{
Console.WriteLine(i1);
}
...
for (int i574=0; i574<10; i574++)
{
Console.WriteLine(i574);
}
साथ ही संकलित किया जा सकता है। यहाँ, मैंने भी सीमा खोजने की कोशिश की, और इनमें से अधिक छोरों का निर्माण किया। विशेष रूप से, मुझे यकीन नहीं था कि क्या इस मामले में लूप चर भी "स्थानीय लोगों" को गिनते हैं, क्योंकि वे अपने स्वयं के हैं { block }
। लेकिन फिर भी, 65534 से अधिक संभव नहीं है। अंत में, मैंने एक परीक्षण जोड़ा जिसमें पैटर्न के 40000 लूप शामिल थे
for (int i39999 = 0; i39999 < 10; i39999++)
{
int j = 0;
Console.WriteLine(j + i39999);
}
इसमें लूप में एक अतिरिक्त वैरिएबल था , लेकिन ये "लोकल" के रूप में भी गिने जाते हैं, और इसे संकलित करना संभव नहीं था।
इसलिए संक्षेप में: ~ 550 की सीमा वास्तव में छोरों की घोंसले की गहराई के कारण होती है। यह भी त्रुटि संदेश द्वारा इंगित किया गया था
CS8078 त्रुटि: एक अभिव्यक्ति संकलन के लिए बहुत लंबा या जटिल है
त्रुटि CS1647 के प्रलेखनदुर्भाग्यवश (लेकिन समझ से) जटिलता के "माप" को निर्दिष्ट नहीं करता है, लेकिन केवल व्यावहारिक सलाह देता है
आपके कोड को संसाधित करने वाले कंपाइलर में स्टैक ओवरफ़्लो था। इस त्रुटि को हल करने के लिए, अपने कोड को सरल बनाएं।
इसे फिर से जोर देने के लिएfor
: विशेष रूप से नेस्टेड- लूप के विशेष मामले के लिए , यह सब बल्कि अकादमिक और काल्पनिक है । लेकिन CS1647 के त्रुटि संदेश के लिए वेबसर्च करने से कई मामलों का पता चलता है, जहां यह त्रुटि कोड के लिए दिखाई दी, जो कि संभवतः सबसे जटिल रूप से जटिल नहीं थी, लेकिन यथार्थवादी परिदृश्यों में बनाई गई थी।