अनंत लूप: Difference between revisions
No edit summary |
No edit summary |
||
Line 229: | Line 229: | ||
| ... | | ... | ||
|} | |} | ||
समाप्ति की स्थिति का | समाप्ति की स्थिति का मानांकन करने में अप्रत्याशित व्यवहार भी इस समस्या का कारण बन सकता है। यहाँ C (प्रोग्रामिंग भाषा) में एक उदाहरण दिया गया है:<syntaxhighlight lang="d"> | ||
float x = 0.1; | float x = 0.1; | ||
while (x != 1.1) { | while (x != 1.1) { | ||
Line 242: | Line 242: | ||
print(x) | print(x) | ||
x += 0.1 | x += 0.1 | ||
</syntaxhighlight> | </syntaxhighlight>समानता या गैर-समानता के परीक्षणों की अप्रत्याशित रूप से विफल होने की संभावना के कारण, फ़्लोटिंग-पॉइंट मानों से निपटने के दौरान परीक्षण से अधिक या कम से अधिक का उपयोग करना सुरक्षित है। उदाहरण के लिए, यह परीक्षण करने के बजाय कि क्या <code>x</code> 1.1 के बराबर है, कोई यह परीक्षण कर सकता है कि क्या <code>(x <= 1.0)</code>, या <code>(x < 1.1)</code> के बराबर है, जिनमें से कोई भी निश्चित संख्या में पुनरावृत्तियों के बाद बाहर निकलना निश्चित होगा। इस विशेष उदाहरण को ठीक करने का एक अन्य तरीका एक [[पूर्णांक (कंप्यूटर विज्ञान)]] को एक नियंत्रण प्रवाह के रूप में उपयोग करना होगा, जो किए गए पुनरावृत्तियों की संख्या की गणना करता है। | ||
इसी तरह की समस्या अक्सर [[संख्यात्मक विश्लेषण]] में होती है: एक निश्चित परिणाम की गणना करने के लिए, एक पुनरावृत्ति का इरादा तब तक किया जाता है जब तक कि त्रुटि एक चुनी हुई सहनशीलता से छोटी | इसी तरह की समस्या अक्सर [[संख्यात्मक विश्लेषण]] में होती है: एक निश्चित परिणाम की गणना करने के लिए, एक पुनरावृत्ति का इरादा तब तक किया जाता है जब तक कि त्रुटि एक चुनी हुई सहनशीलता से छोटी नहीं होना चाहिए। हालांकि, पुनरावृत्ति के दौरान राउंडिंग त्रुटियों के कारण, निर्दिष्ट सहिष्णुता तक कभी नहीं पहुंचा जा सकता है, जिसके परिणामस्वरूप एक अनंत लूप होता है। | ||
== मल्टी-पार्टी लूप == | == मल्टी-पार्टी लूप == | ||
एक अनंत लूप कई संस्थाओं के परस्पर क्रिया के कारण हो सकता है। एक सर्वर पर विचार करें जो हमेशा एक त्रुटि संदेश के साथ उत्तर देता है यदि वह अनुरोध को नहीं समझता है। यहां तक कि अगर सर्वर के भीतर एक अनंत लूप की कोई संभावना नहीं है, उनमें से दो ( | एक अनंत लूप कई संस्थाओं के परस्पर क्रिया के कारण हो सकता है। एक सर्वर पर विचार करें जो हमेशा एक त्रुटि संदेश के साथ उत्तर देता है यदि वह अनुरोध को नहीं समझता है। यहां तक कि अगर सर्वर के भीतर एक अनंत लूप की कोई संभावना नहीं है, तो उनमें से दो (A और B) वाली प्रणाली अंतहीन रूप से लूप कर सकती है: यदि A को B से अज्ञात प्रकार का संदेश प्राप्त होता है, तो A एक त्रुटि संदेश के साथ B को उत्तर देता है। यदि B त्रुटि संदेश को नहीं समझता है, तो वह A को अपने स्वयं के त्रुटि संदेश के साथ उत्तर देता है; यदि A, B के त्रुटि संदेश को नहीं समझता है, तो वह एक और त्रुटि संदेश भेजता है, और इसी तरह आगे भी होता हैं। | ||
ऐसी स्थिति का एक सामान्य उदाहरण [[ईमेल पाश]] है। ईमेल लूप का एक उदाहरण यह है कि यदि किसी व्यक्ति को बिना उत्तर वाले इनबॉक्स से मेल प्राप्त होता है, लेकिन उनका ऑटो-प्रतिक्रिया चालू है। वे नो रिप्लाई इनबॉक्स का जवाब देंगे, यह ट्रिगर करते हुए यह नो रिप्लाई इनबॉक्स रिस्पांस है। यह उपयोगकर्ता को भेजा जाएगा, जो तब नो-रिप्लाई इनबॉक्स में एक ऑटो रिप्लाई भेजता है, और इसी तरह आगे | ऐसी स्थिति का एक सामान्य उदाहरण [[ईमेल पाश|ईमेल लूप]] है। ईमेल लूप का एक उदाहरण यह है कि यदि किसी व्यक्ति को बिना उत्तर वाले इनबॉक्स से मेल प्राप्त होता है, लेकिन उनका ऑटो-प्रतिक्रिया चालू है। वे नो रिप्लाई इनबॉक्स का जवाब देंगे, यह ट्रिगर करते हुए यह नो रिप्लाई इनबॉक्स रिस्पांस है। यह उपयोगकर्ता को भेजा जाएगा, जो तब नो-रिप्लाई इनबॉक्स में एक ऑटो रिप्लाई भेजता है, और इसी तरह आगे भी होता हैं। | ||
== छद्म-अनंत लूप == | == छद्म-अनंत लूप == | ||
छद्म-अनंत लूप एक ऐसा लूप है जो अनंत दिखाई देता है लेकिन | छद्म-अनंत लूप एक ऐसा लूप है जो अनंत दिखाई देता है लेकिन वास्तविक में यह बहुत लंबा लूप है। | ||
=== बहुत बड़ी संख्या === | === बहुत बड़ी संख्या === | ||
[[बैश (यूनिक्स शेल)]] में एक उदाहरण: | [[बैश (यूनिक्स शेल)]] में एक उदाहरण:<syntaxhighlight lang="d"> | ||
< | for x in $(seq 1000000000); do | ||
x | #loop code | ||
# | done | ||
</syntaxhighlight> | |||
</ | |||
=== असंभव समाप्ति की स्थिति === | === असंभव समाप्ति की स्थिति === | ||
सी (प्रोग्रामिंग भाषा) में लूप के लिए एक उदाहरण: | सी (प्रोग्रामिंग भाषा) में लूप के लिए एक उदाहरण:<syntaxhighlight lang="d"> | ||
< | unsigned int i; | ||
for (i = 1; i != 0; i++) { | |||
/* loop code */ | |||
/* | |||
} | } | ||
</ | </syntaxhighlight>ऐसा प्रतीत होता है कि यह अनिश्चित काल तक चलेगा, लेकिन वास्तविक में इसका मान <code>i</code> अंततः एक <code>unsigned int</code> में संग्रहीत अधिकतम मान तक पहुंच जाएगा और उस संख्या में 1 जोड़ने से लूप को तोड़ते हुए 0 के आसपास लपेटा जाएगा। <code>i</code> की वास्तविक सीमा उपयोग किए गए सिस्टम और [[संकलक|कंपाइलर]] के विवरण पर निर्भर करता है। [[मनमाना-सटीक अंकगणित]] के साथ, यह लूप तब तक जारी रहेगा जब तक कि कंप्यूटर की [[मेमोरी (कंप्यूटर)]] <code>i</code> को होल्ड नहीं कर सकती, अगर <code>i</code> एक अहस्ताक्षरित पूर्णांक के बजाय एक हस्ताक्षरित पूर्णांक था, तो अतिप्रवाह अपरिभाषित होगा। इस मामले में, कंपाइलर कोड को अनंत लूप में अनुकूलित कर सकता है। | ||
ऐसा प्रतीत होता है कि यह अनिश्चित काल तक चलेगा, लेकिन | |||
=== अनंत पुनरावर्तन === | === अनंत पुनरावर्तन === | ||
अनंत पुनरावर्तन अनंत लूप का एक विशेष मामला है जो पुनरावर्तन के कारण होता है। | अनंत पुनरावर्तन अनंत लूप का एक विशेष मामला है जो पुनरावर्तन के कारण होता है। | ||
अनुप्रयोगों के लिए Visual Basic में निम्न उदाहरण [[स्टैक ओवरफ़्लो]] त्रुटि देता है: | अनुप्रयोगों के लिए Visual Basic में निम्न उदाहरण [[स्टैक ओवरफ़्लो]] त्रुटि देता है:<syntaxhighlight lang="d"> | ||
< | Sub Test1() | ||
Call Test1 | |||
End Sub | |||
</syntaxhighlight> | |||
</ | |||
=== | === कथन का उल्लंघन === | ||
एक <code>while (true)</code>लूप पहली दृष्टि में अनंत दिखता है, लेकिन [[ब्रेक स्टेटमेंट]] या [[वापसी कथन]] के माध्यम से लूप से बचने का एक तरीका हो सकता है। | |||
[[PHP]] में उदाहरण: | [[PHP|पीएचपी]] में उदाहरण:<syntaxhighlight lang="d"> | ||
< | while (true) { | ||
if ($foo->bar()) { | |||
return; | |||
} | } | ||
} | } | ||
</ | </syntaxhighlight> | ||
=== एल्डर्सन लूप === | === एल्डर्सन लूप === | ||
एल्डर्सन लूप एक अनंत लूप के लिए एक दुर्लभ स्लैंग या [[शब्दजाल फ़ाइल]] शब्द है, जहां एक निकास स्थिति उपलब्ध है, लेकिन कोड के वर्तमान कार्यान्वयन में दुर्गम है, आमतौर पर एक प्रोग्रामर की त्रुटि के कारण। [[प्रयोक्ता इंटरफ़ेस]] कोड डीबग करते समय ये सबसे आम और दृश्यमान हैं। | एल्डर्सन लूप एक अनंत लूप के लिए एक दुर्लभ स्लैंग या [[शब्दजाल फ़ाइल]] शब्द है, जहां एक निकास स्थिति उपलब्ध है, लेकिन कोड के वर्तमान कार्यान्वयन में दुर्गम है, आमतौर पर एक प्रोग्रामर की त्रुटि के कारण। [[प्रयोक्ता इंटरफ़ेस]] कोड डीबग करते समय ये सबसे आम और दृश्यमान हैं। | ||
एल्डर्सन लूप का एक सी-जैसा स्यूडोकोड उदाहरण, जहां कार्यक्रम को उपयोगकर्ता द्वारा दी गई संख्याओं को शून्य तक दिए जाने तक माना जाता है, लेकिन जहां प्रोग्रामर ने गलत ऑपरेटर का उपयोग किया है: | एल्डर्सन लूप का एक सी-जैसा स्यूडोकोड उदाहरण, जहां कार्यक्रम को उपयोगकर्ता द्वारा दी गई संख्याओं को शून्य तक दिए जाने तक माना जाता है, लेकिन जहां प्रोग्रामर ने गलत ऑपरेटर का उपयोग किया है:<syntaxhighlight lang="d"> | ||
< | int sum = 0; | ||
int i; | |||
int | while (true) { | ||
printf("Input a number to add to the sum or 0 to quit"); | |||
i = getUserInput(); | |||
if (i * 0) { // if i times 0 is true, add i to the sum. Note: ZERO means FALSE, Non-Zero means TRUE. "i * 0" is ZERO (FALSE)! | |||
if (i * 0) { // | sum += i; // sum never changes because (i * 0) is 0 for any i; it would change if we had != in the condition instead of * | ||
} | } | ||
if (sum > 100) { | |||
break; // terminate the loop; exit condition exists but is never reached because sum is never added to | |||
} | } | ||
} | } | ||
</ | </syntaxhighlight>इस शब्द को कथित तौर पर एक प्रोग्रामर (अंतिम नाम एल्डरसन) से अपना नाम मिला, जिसने 1996 में<ref>{{cite web | ||
इस शब्द को कथित तौर पर एक प्रोग्रामर (अंतिम नाम एल्डरसन) से अपना नाम मिला, जिसने 1996 में<ref>{{cite web | |||
|url=https://www.lee-dohm.com/2013/05/24/alderson-loop | |url=https://www.lee-dohm.com/2013/05/24/alderson-loop | ||
|title=Alderson loop | |title=Alderson loop |
Revision as of 08:48, 7 February 2023
Loop constructs |
---|
कंप्यूटर प्रोग्रामिंग में, एक अनंत लूप (या अंतहीन लूप)[1][2] निर्देशों का एक क्रम है, जो लिखित रूप में, अंतहीन रूप से जारी रहेगा, जब तक कि कोई बाहरी हस्तक्षेप नहीं होता (प्लग खींचो) है। यह इच्छानुरूप हो सकता है।
अवलोकन
यह इससे भिन्न है:
- एक प्रकार का कंप्यूटर प्रोग्राम जो एक ही निर्देश को लगातार तब तक चलाता है जब तक कि इसे बंद या बाधित नहीं किया जाता है।[3]
निम्नलिखित स्यूडोकोड पर विचार करें:
how_many = 0
while is_there_more_data() do
how_many = how_many + 1
end
display "the number of items counted = " how_many
एक ही निर्देश लगातार तब तक चलाए जाते थे जब तक कि . . द्वारा किसी बिंदु पर लौटाए गए फ़ालसे द्वारा रोका या बाधित नहीं किया जाता है क्या अधिक डेटा है।
इसके विपरीत, निम्न लूप अपने आप समाप्त नहीं होगा:
birds = 1
fish = 2
while birds + fish > 1 do
birds = 3 - birds
fish = 3 - fish
end
बर्ड्स वैकल्पिक रूप से 1 या 2 होंगे, जबकि फिश वैकल्पिक रूप से 2 या 1 होगी। लूप तब तक नहीं रुकेगा जब तक कि कोई बाहरी हस्तक्षेप नहीं होता (प्लग को खींचें)।
विवरण
एक अनंत लूप एक कंप्यूटर प्रोग्राम में निर्देशों का एक क्रम है जो या तो लूप के बिना समाप्त होने वाली स्थिति के कारण अंतहीन रूप से लूप करता है,[4] जिसमें कभी भी पूरा नहीं किया जा सकता है या जो लूप को फिर से शुरू करने का कारण बनता है। सहकारी मल्टीटास्किंग के साथ पुराने ऑपरेटिंग सिस्टम में,[5] अनंत लूप सामान्य रूप से पूरे सिस्टम को अनुत्तरदायी बना देते हैं। अब प्रचलित प्रीमेप्टिव मल्टीटास्किंग मॉडल के साथ, अनंत लूप आमतौर पर प्रोग्राम को सभी उपलब्ध प्रोसेसर समय का उपभोग करने का कारण बनते हैं, लेकिन आमतौर पर उपयोगकर्ता द्वारा इसे समाप्त किया जा सकता है। व्यस्त प्रतीक्षा लूप को कभी-कभी अनंत लूप भी कहा जाता है। कंप्यूटर फ्रीजिंग (कंप्यूटिंग) के लिए अनंत लूप एक संभावित कारण हैं; अन्य में थ्रैशिंग (कंप्यूटर विज्ञान), डेडलॉक और एक्सेस उल्लंघन शामिल हैं।
उद्देश्य बनाम अनपेक्षित लूपिंग
लूपिंग निर्देशों का एक सेट दोहरा रहा है जब तक कि एक विशिष्ट शर्त पूरी नहीं हो जाती है। एक अनंत लूप तब होता है जब लूप की कुछ अंतर्निहित विशेषता के कारण स्थिति कभी पूरी नहीं होती है।
जानबूझकर लूपिंग
ऐसी कुछ स्थितियाँ होती हैं जब यह वांछित व्यवहार होता है। उदाहरण के लिए, कार्ट्रिज-आधारित गेम कंसोल पर आमतौर पर उनके मुख्य लूप में कोई निकास स्थिति नहीं होती है, क्योंकि कंसोल के बंद होने तक प्रोग्राम के लूप से बाहर निकलने के लिए कोई ऑपरेटिंग सिस्टम नहीं होता है।
आधुनिक इंटरएक्टिव कंप्यूटरों के लिए आवश्यक है कि कंप्यूटर उपयोगकर्ता इनपुट या डिवाइस गतिविधि के लिए लगातार निगरानी रखे ताकि कुछ मौलिक स्तर पर एक अनंत प्रोसेसिंग आइडल लूप होता है जो डिवाइस के बंद या रीसेट होने तक जारी रहना चाहिए। उदाहरण के लिए, अपोलो गाइडेंस कंप्यूटर में यह बाहरी लूप Exec प्रोग्राम में समाहित था,[6] और अगर कंप्यूटर के पास करने के लिए बिल्कुल कोई दूसरा काम नहीं था तो यह लूप एक डमी जॉब चलाएगा जो कंप्यूटर गतिविधि सूचक प्रकाश को बंद कर देगा।
आधुनिक कंप्यूटर भी आमतौर पर क्रैश होने पर प्रोसेसर या मदरबोर्ड सर्किट-ड्राइविंग घड़ियों को रोकते नहीं हैं। इसके बजाय वे ऑपरेटर को संदेश प्रदर्शित करने वाली एक त्रुटि स्थिति में वापस आ जाते हैं, और एक अनंत लूप में प्रवेश करते हैं, जो उपयोगकर्ता को या तो जारी रखने के लिए या डिवाइस को रीसेट करने के लिए एक संकेत का जवाब देने के लिए प्रतीक्षा कर रहा है।
मल्टी-थ्रेडिंग
बहु-थ्रेडेड प्रोग्राम में कुछ थ्रेड अनंत लूप के अंदर पूरे प्रोग्राम को अनंत लूप में अटके बिना निष्पादित कर सकते हैं। यदि मुख्य धागा बाहर निकलता है तो प्रक्रिया के सभी धागे बलपूर्वक रोक दिए जाते हैं, इस प्रकार सभी निष्पादन समाप्त हो जाते हैं और प्रक्रिया/कार्यक्रम समाप्त हो जाता है। अनंत लूप के अंदर के धागे हाउसकीपिंग कार्य कर सकते हैं या वे इनपुट (सॉकेट/कतार से) की प्रतीक्षा में अवरुद्ध स्थिति में हो सकते हैं और हर बार इनपुट प्राप्त होने पर निष्पादन फिर से शुरू कर सकते हैं।
अपरिचित में लूपिंग
अक्सर, इस शब्द का प्रयोग उन स्थितियों के लिए किया जाता है जब यह अभीष्ट परिणाम नहीं होता है; यानी जब यह एक सॉफ्टवेयर बग है।[7] नोविस प्रोग्रामरों में ऐसी त्रुटियां सबसे आम हैं, लेकिन अनुभवी प्रोग्रामर द्वारा भी की जा सकती हैं, क्योंकि उनके कारण काफी सूक्ष्म हो सकते हैं।
एक सामान्य कारण, उदाहरण के लिए, यह है कि प्रोग्रामर एक लिंक्ड सूची या ट्री (डेटा संरचना) जैसे डेटा संरचना में नोड्स के अनुक्रम पर पुनरावृति करना चाहता है, प्रत्येक नोड के लिए एक बार लूप कोड निष्पादित करता है। अनुचित रूप से गठित लिंक डेटा संरचना में एक संदर्भ लूप बना सकते हैं, जहां एक नोड दूसरे से लिंक होता है जो पहले अनुक्रम में होता है। यह डेटा संरचना का हिस्सा एक रिंग (डेटा संरचना) में बनाता है, जिससे सरल कोड हमेशा के लिए लूप हो जाता है।
जबकि कोड के गहन निरीक्षण से अधिकांश अनंत लूप पाए जा सकते हैं, यह निर्धारित करने के लिए कोई सामान्य तरीका नहीं है कि क्या दिया गया प्रोग्राम कभी रुकेगा या हमेशा के लिए चलेगा; यह हॉल्टिंग समस्या की अनिश्चितता है।[8]
व्यवधान
जब तक सिस्टम उत्तरदायी है, अनंत लूप को अक्सर प्रक्रिया को सिग्नल भेजकर बाधित किया जा सकता है (जैसे कि यूनिक्स में सिगिनट (पॉज़िक्स)), या प्रोसेसर के लिए बाधा, जिससे वर्तमान प्रक्रिया को निरस्त किया जा सकता है। इसे टर्मिनल के नियंत्रण-सी कमांड के साथ[9] के साथ या किल (आदेश) कमांड या सिस्टम कॉल का उपयोग करके कार्य प्रबंधक में किया जा सकता है। हालांकि, यह हमेशा काम नहीं करता है, क्योंकि हो सकता है कि प्रक्रिया संकेतों का जवाब नहीं दे रही हो या प्रोसेसर अबाधित स्थिति में हो सकता है, जैसे कि सिरिक्स कोमा बग (एक निर्देश पाइपलाइन में अबाधित निर्देशों को ओवरलैप करने के कारण)। कुछ मामलों में सिगकिल जैसे अन्य सिग्नल काम कर सकते हैं, क्योंकि उन्हें प्रतिक्रियात्मक होने के लिए प्रक्रिया की आवश्यकता नहीं होती है, जबकि अन्य मामलों में लूप को सिस्टम शटडाउन से कम नहीं किया जा सकता है।
भाषा समर्थन
विभिन्न नियंत्रण प्रवाह निर्माणों का उपयोग करके अनंत लूपों को लागू किया जा सकता है। आमतौर पर, असंरचित प्रोग्रामिंग में यह जम्प बैक अप (के लिए जाओ) होता है, जबकि संरचित प्रोग्रामिंग में यह एक अनिश्चित लूप (जबकि लूप) होता है जो या तो स्थिति को छोड़ कर या स्पष्ट रूप से इसे while (true) ...
के रूप में सेट करके कभी समाप्त नहीं होता है।
कुछ भाषाओं में अनंत लूप के लिए विशेष रूप से एक अनिश्चित लूप से शर्त को हटाकर विशेष निर्माण होते हैं। उदाहरणों में एडा (loop ... end loop
),[10] फोरट्रान (DO ... END DO
), गो (for { ... }
), रूबी (loop do ... end
), और रस्ट (loop { ... }
) शामिल हैं।
जानबूझकर अनंत छोरों के उदाहरण
एक साधारण उदाहरण (सी (प्रोग्रामिंग भाषा) में):
#include <stdio.h>
int main()
{
for (;;) // or equivalently, while (1)
;
return 0;
}
एक अनंत for (;;)
का रूप पारंपरिक है, जो सी प्रोग्रामिंग लैंग्वेज के मानक संदर्भ में दिखाई देता है, और अक्सर इसका स्पष्ट रूप से हमेशा के लिए उच्चारण किया जाता है।[11]
यह एक लूप है जो अनंत लूप को बिना रुके प्रिंट करेगा।
1980 के दशक की बेसिक प्रोग्रामिंग भाषा में एक समान उदाहरण:
10 PRINT "INFINITE LOOP"
20 GOTO 10
डॉस बैच फ़ाइलों में एक समान उदाहरण:
:A
echo Infinite Loop
goto :A
यहां लूप काफी स्पष्ट है, क्योंकि अंतिम पंक्ति बिना शर्त निष्पादन को पहले वाले को वापस भेजती है। जावा (प्रोग्रामिंग भाषा) में एक उदाहरण
while (true) {
System.out.println("Infinite Loop");
}
बोर्न अगेन शैल में एक उदाहरण
for ((;;)); do
echo "Infinite Loop"
done
रस्ट (प्रोग्रामिंग भाषा) में एक उदाहरण
loop {
println!("Infinite loop");
}
अनजाने अनंत लूप के उदाहरण
गणितीय त्रुटियाँ
यहाँ Visual Basic में अनंत लूप का एक उदाहरण दिया गया है:
dim x as integer
do while x < 5
x = 1
x = x + 1
loop
यह एक ऐसी स्थिति बनाता है जहां x
कभी भी 5 से अधिक नहीं होगा क्योंकि लूप कोड की शुरुआत में x
कों 1 का मान दिया जाता है, इस प्रकार, लूप हमेशा 2 में समाप्त होगा और लूप कभी नहीं टूटेगा। इसे x = 1
निर्देश को लूप के बाहर ले जाकर ठीक किया जा सकता है। अनिवार्य रूप से यह अनंत लूप क्या करता है एक कंप्यूटर को 5 तक पहुंचने तक 1 से 1 जोड़ने के लिए निर्देश देना है। चूंकि 1+1 हमेशा 2 के बराबर होता है, ऐसा कभी नहीं होगा।
कुछ भाषाओं में, गणितीय प्रतीकों के बारे में प्रोग्रामर का भ्रम अनजाने में अनंत लूप का कारण बन सकता है। उदाहरण के लिए, यहाँ C (प्रोग्रामिंग भाषा) में एक स्निपेट है:
#include <stdio.h>
int main(void)
{
int a = 0;
while (a < 10) {
printf("%d\n", a);
if (a = 5)
printf("a equals 5!\n");
a++;
}
return 0;
}
अपेक्षित आउटपुट 0 से 9 तक की संख्या है, जिसमें एक इंटरजेक्टेड "a बराबर 5!" 5 और 6 के बीच है। हालांकि, लाइन मेंif (a = 5)
ऊपर, प्रोग्रामर ने = (असाइनमेंट) ऑपरेटर को == (समानता परीक्षण) ऑपरेटर के साथ भ्रमित कर दिया है। यह प्रोग्राम में a
बिंदु पर 5 का मान असाइन करेगा। इस प्रकार, a
कभी भी 10 तक आगे बढ़ने में सक्षम नहीं होगा, और यह लूप समाप्त नहीं हो सकता।
राउंडिंग त्रुटियाँ
C output on an AMD Turion processor: |
x = 0.10000000149011611938 |
x = 0.20000000298023223877 |
x = 0.30000001192092895508 |
x = 0.40000000596046447754 |
x = 0.50000000000000000000 |
x = 0.60000002384185791016 |
x = 0.70000004768371582031 |
x = 0.80000007152557373047 |
x = 0.90000009536743164062 |
x = 1.00000011920928955078 |
x = 1.10000014305114746094 |
x = 1.20000016689300537109 |
... |
समाप्ति की स्थिति का मानांकन करने में अप्रत्याशित व्यवहार भी इस समस्या का कारण बन सकता है। यहाँ C (प्रोग्रामिंग भाषा) में एक उदाहरण दिया गया है:
float x = 0.1;
while (x != 1.1) {
printf("x = %22.20f\n", x);
x += 0.1;
}
कुछ प्रणालियों पर, यह लूप अपेक्षा के अनुरूप दस बार निष्पादित होगा, लेकिन अन्य प्रणालियों पर यह कभी समाप्त नहीं होगा। समस्या यह है कि दो फ्लोटिंग पॉइंट मानों की सटीक समानता के लिय लूप टर्मिनेटिंग कंडीशन (x!= 1.1)
परीक्षण और जिस तरह से कई कंप्यूटरों में फ्लोटिंग पॉइंट वैल्यू का प्रतिनिधित्व किया जाता है, वह इस परीक्षण को विफल कर देगा, क्योंकि वे मान 0.1 का सटीक रूप से प्रतिनिधित्व नहीं कर सकते हैं, इस प्रकार प्रत्येक वेतन वृद्धि (cf. बॉक्स) पर राउंडिंग त्रुटियों का परिचय देते हैं।
पायथन (प्रोग्रामिंग भाषा) में भी ऐसा ही हो सकता है:
x = 0.1
while x != 1:
print(x)
x += 0.1
समानता या गैर-समानता के परीक्षणों की अप्रत्याशित रूप से विफल होने की संभावना के कारण, फ़्लोटिंग-पॉइंट मानों से निपटने के दौरान परीक्षण से अधिक या कम से अधिक का उपयोग करना सुरक्षित है। उदाहरण के लिए, यह परीक्षण करने के बजाय कि क्या x
1.1 के बराबर है, कोई यह परीक्षण कर सकता है कि क्या (x <= 1.0)
, या (x < 1.1)
के बराबर है, जिनमें से कोई भी निश्चित संख्या में पुनरावृत्तियों के बाद बाहर निकलना निश्चित होगा। इस विशेष उदाहरण को ठीक करने का एक अन्य तरीका एक पूर्णांक (कंप्यूटर विज्ञान) को एक नियंत्रण प्रवाह के रूप में उपयोग करना होगा, जो किए गए पुनरावृत्तियों की संख्या की गणना करता है।
इसी तरह की समस्या अक्सर संख्यात्मक विश्लेषण में होती है: एक निश्चित परिणाम की गणना करने के लिए, एक पुनरावृत्ति का इरादा तब तक किया जाता है जब तक कि त्रुटि एक चुनी हुई सहनशीलता से छोटी नहीं होना चाहिए। हालांकि, पुनरावृत्ति के दौरान राउंडिंग त्रुटियों के कारण, निर्दिष्ट सहिष्णुता तक कभी नहीं पहुंचा जा सकता है, जिसके परिणामस्वरूप एक अनंत लूप होता है।
मल्टी-पार्टी लूप
एक अनंत लूप कई संस्थाओं के परस्पर क्रिया के कारण हो सकता है। एक सर्वर पर विचार करें जो हमेशा एक त्रुटि संदेश के साथ उत्तर देता है यदि वह अनुरोध को नहीं समझता है। यहां तक कि अगर सर्वर के भीतर एक अनंत लूप की कोई संभावना नहीं है, तो उनमें से दो (A और B) वाली प्रणाली अंतहीन रूप से लूप कर सकती है: यदि A को B से अज्ञात प्रकार का संदेश प्राप्त होता है, तो A एक त्रुटि संदेश के साथ B को उत्तर देता है। यदि B त्रुटि संदेश को नहीं समझता है, तो वह A को अपने स्वयं के त्रुटि संदेश के साथ उत्तर देता है; यदि A, B के त्रुटि संदेश को नहीं समझता है, तो वह एक और त्रुटि संदेश भेजता है, और इसी तरह आगे भी होता हैं।
ऐसी स्थिति का एक सामान्य उदाहरण ईमेल लूप है। ईमेल लूप का एक उदाहरण यह है कि यदि किसी व्यक्ति को बिना उत्तर वाले इनबॉक्स से मेल प्राप्त होता है, लेकिन उनका ऑटो-प्रतिक्रिया चालू है। वे नो रिप्लाई इनबॉक्स का जवाब देंगे, यह ट्रिगर करते हुए यह नो रिप्लाई इनबॉक्स रिस्पांस है। यह उपयोगकर्ता को भेजा जाएगा, जो तब नो-रिप्लाई इनबॉक्स में एक ऑटो रिप्लाई भेजता है, और इसी तरह आगे भी होता हैं।
छद्म-अनंत लूप
छद्म-अनंत लूप एक ऐसा लूप है जो अनंत दिखाई देता है लेकिन वास्तविक में यह बहुत लंबा लूप है।
बहुत बड़ी संख्या
बैश (यूनिक्स शेल) में एक उदाहरण:
for x in $(seq 1000000000); do
#loop code
done
असंभव समाप्ति की स्थिति
सी (प्रोग्रामिंग भाषा) में लूप के लिए एक उदाहरण:
unsigned int i;
for (i = 1; i != 0; i++) {
/* loop code */
}
ऐसा प्रतीत होता है कि यह अनिश्चित काल तक चलेगा, लेकिन वास्तविक में इसका मान i
अंततः एक unsigned int
में संग्रहीत अधिकतम मान तक पहुंच जाएगा और उस संख्या में 1 जोड़ने से लूप को तोड़ते हुए 0 के आसपास लपेटा जाएगा। i
की वास्तविक सीमा उपयोग किए गए सिस्टम और कंपाइलर के विवरण पर निर्भर करता है। मनमाना-सटीक अंकगणित के साथ, यह लूप तब तक जारी रहेगा जब तक कि कंप्यूटर की मेमोरी (कंप्यूटर) i
को होल्ड नहीं कर सकती, अगर i
एक अहस्ताक्षरित पूर्णांक के बजाय एक हस्ताक्षरित पूर्णांक था, तो अतिप्रवाह अपरिभाषित होगा। इस मामले में, कंपाइलर कोड को अनंत लूप में अनुकूलित कर सकता है।
अनंत पुनरावर्तन
अनंत पुनरावर्तन अनंत लूप का एक विशेष मामला है जो पुनरावर्तन के कारण होता है।
अनुप्रयोगों के लिए Visual Basic में निम्न उदाहरण स्टैक ओवरफ़्लो त्रुटि देता है:
Sub Test1()
Call Test1
End Sub
कथन का उल्लंघन
एक while (true)
लूप पहली दृष्टि में अनंत दिखता है, लेकिन ब्रेक स्टेटमेंट या वापसी कथन के माध्यम से लूप से बचने का एक तरीका हो सकता है।
पीएचपी में उदाहरण:
while (true) {
if ($foo->bar()) {
return;
}
}
एल्डर्सन लूप
एल्डर्सन लूप एक अनंत लूप के लिए एक दुर्लभ स्लैंग या शब्दजाल फ़ाइल शब्द है, जहां एक निकास स्थिति उपलब्ध है, लेकिन कोड के वर्तमान कार्यान्वयन में दुर्गम है, आमतौर पर एक प्रोग्रामर की त्रुटि के कारण। प्रयोक्ता इंटरफ़ेस कोड डीबग करते समय ये सबसे आम और दृश्यमान हैं।
एल्डर्सन लूप का एक सी-जैसा स्यूडोकोड उदाहरण, जहां कार्यक्रम को उपयोगकर्ता द्वारा दी गई संख्याओं को शून्य तक दिए जाने तक माना जाता है, लेकिन जहां प्रोग्रामर ने गलत ऑपरेटर का उपयोग किया है:
int sum = 0;
int i;
while (true) {
printf("Input a number to add to the sum or 0 to quit");
i = getUserInput();
if (i * 0) { // if i times 0 is true, add i to the sum. Note: ZERO means FALSE, Non-Zero means TRUE. "i * 0" is ZERO (FALSE)!
sum += i; // sum never changes because (i * 0) is 0 for any i; it would change if we had != in the condition instead of *
}
if (sum > 100) {
break; // terminate the loop; exit condition exists but is never reached because sum is never added to
}
}
इस शब्द को कथित तौर पर एक प्रोग्रामर (अंतिम नाम एल्डरसन) से अपना नाम मिला, जिसने 1996 में[12] माइक्रोसॉफ्ट पहुंच में एक मोडल विंडो संवाद बॉक्स को ओके या कैंसल बटन के बिना कोडित किया था, जिससे जब भी बॉक्स आया तो पूरे प्रोग्राम को अक्षम कर दिया।[13]
यह भी देखें
- साइकिल का पता लगाना
- गतिरोध
- डाइवर्जेंस (कंप्यूटर साइंस)
- कांटा बम (एक अनंत लूप दो प्रमुख घटकों में से एक है)
- के लिए जाओ
- अनंत प्रतिगमन
- पुनरावृत्ति (कंप्यूटर विज्ञान)
संदर्भ
- ↑ "Endless loop dictionary definition". Archived from the original on 2020-08-01. Retrieved 2020-01-22.
- ↑ "What is infinite loop (endless loop)". Archived from the original on 2019-07-15. Retrieved 2020-01-22.
- ↑ Denise Caruso (August 16, 1999). "Overload of Hangers-On Creates Bumpy Ride for Internet Stocks". The New York Times. Archived from the original on December 27, 2019. Retrieved December 27, 2019.
- ↑ "Codes and Modes: The Character of Documentary Culture". Flow Journal. November 2014. Archived from the original on 2020-08-01. Retrieved 2020-01-23.
an infinite loop is one that lacks .. an exit condition
- ↑ also known as non-preemptive-multitasking: "Non-preemptive Multitasking". PC Magazine. Archived from the original on July 26, 2019. Retrieved August 15, 2015.
- ↑ David Hoag (September 1976). "The History of Apollo On-board Guidance, Navigation, and Control" (PDF). Charles Stark Draper Laboratory. Archived (PDF) from the original on 2016-11-05. Retrieved 2020-01-23.
- ↑ "New York Times Crossword Answers". October 13, 2013. Archived from the original on August 2, 2020. Retrieved January 22, 2020.
computing .. a defect .. which .. to loop
- ↑ "Halting Problem in Theory of Computation". 3 October 2018. Archived from the original on 9 August 2020. Retrieved 22 January 2020.
- ↑ "A Buffer Overflow Exploit Against the DameWare Remote Control software". December 19, 2003. Archived from the original on July 24, 2020. Retrieved January 22, 2020.
As soon as the command shell is closed with a control-c combination ...
- ↑ Ada Programming: Control: Endless Loop
- ↑ "Endless loop in C/C++". Archived from the original on 2016-08-03.
- ↑ Lee Dohm (May 24, 2013). "Alderson loop". Archived from the original on June 19, 2020. Retrieved January 22, 2020.
- ↑ "Alderson Loop". The Jargon File, Version 4.4.7. Archived from the original on 2006-05-15. Retrieved 2006-05-21.
बाहरी कड़ियाँ
- Make an infinite loop in several languages, on programming-idioms.org.