दिलचस्प पोस्ट
java.util.zip.ZipException: डुप्लिकेट प्रविष्टि आईओएस स्थिति पट्टी को कैसे छिपाएंगे I परमाणु / अस्थिर / सिंक्रनाइज़ में अंतर क्या है? सी ++ 0x मोड में लिबसी ++ के साथ रगड़ क्यों नहीं कर सकते हैं इस बढ़ावा :: प्रोग्राम_पोपेंस उदाहरण? जावा अपरिवनीय संग्रह मैं HTML विशेषता मानों में उद्धरणों से कैसे बच सकता हूं? डाउनलोड करने के लिए PHP उत्पन्न फ़ाइल तब पुनर्निर्देशित करें अजगर के साथ सेलेनियम का उपयोग कैसे करें? एंड्रॉइड स्टूडियो डिबगर गलत रेखाएं रेखांकित करता है ईएस 6 जावास्क्रिप्ट में प्रतीक (@) पर क्या होता है? (ECMAScript 2015) PHP: कैसे एक तत्व से विशिष्ट तत्व को हटाने के लिए? एंड्रॉइड रिकॉर्डिंग इनकमिंग और आउटगोइंग कॉल पटकथाओं को अपनी वेबसाइट सैकड़ों बार एक दूसरे से बंद करने से रोकना लोगो के साथ 3 नेविबार बूटस्ट्रैप यह कैसे जाँचें कि कोई संग्रहीत कार्यविधि इसे बनाने से पहले मौजूद है या नहीं

डेल्फी में कौन सी चर का उपयोग किया जाता है?

इसलिए मैंने हमेशा सुना है कि क्लास फ़ील्ड (हीप आधारित) प्रारंभिक थे, लेकिन स्टैक आधारित चर नहीं थे। मैंने यह भी सुना है कि रिकॉर्ड सदस्य (स्टैक आधारित) भी प्रारंभ नहीं किए गए थे। कंपाइलर चेतावनी देता है कि स्थानीय चर आरंभ नहीं किए गए हैं ([डीसीसी चेतावनी] W1036 वैरिएबल 'एक्स' को प्रारंभ नहीं किया गया हो सकता है), लेकिन रिकॉर्ड सदस्यों के लिए चेतावनी नहीं देता है। इसलिए मैंने एक परीक्षण चलाने का फैसला किया।

मुझे हर इंटेजर्स से 0 और बॉलियस से सभी रिकॉर्ड सदस्यों के लिए झूठी बातें मिलती हैं।

मैंने विभिन्न कंपाइलर विकल्प (डीबगिंग, अनुकूलन इत्यादि) चालू और बंद करने की कोशिश की, लेकिन इसमें कोई अंतर नहीं था। मेरे सभी रिकॉर्ड सदस्यों को आरंभ किया जा रहा है।

मैं क्या खो रहा हूँ? मैं डेल्फी 2009 अपडेट 2 पर हूं

program TestInitialization; {$APPTYPE CONSOLE} uses SysUtils; type TR = Record Public i1, i2, i3, i4, i5: Integer; a: array[0..10] of Integer; b1, b2, b3, b4, b5: Boolean; s: String; End; var r: TR; x: Integer; begin try WriteLn('Testing record. . . .'); WriteLn('i1 ',R.i1); WriteLn('i2 ',R.i2); WriteLn('i3 ',R.i3); WriteLn('i4 ',R.i4); WriteLn('i5 ',R.i5); Writeln('S ',Rs); Writeln('Booleans: ', R.b1, ' ', R.b2, ' ', R.b3, ' ', R.b4, ' ', R.b5); Writeln('Array '); for x := 0 to 10 do Write(Ra[x], ' '); WriteLn; WriteLn('Done . . . .'); except on E:Exception do Writeln(E.Classname, ': ', E.Message); end; ReadLn; end. 

आउटपुट:

 परीक्षण रिकॉर्ड  ।  ।  ।
 i1 0
 i2 0
 i3 0
 i4 0
 i5 0
 एस
 बूलियन: झूठी झूठी गलत झूठी झूठी
 सरणी
 0 0 0 0 0 0 0 0 0 0 0
 किया हुआ ।  ।  ।  ।

वेब के समाधान से एकत्रित समाधान "डेल्फी में कौन सी चर का उपयोग किया जाता है?"

ग्लोबल वैरिएबल शून्य-आरंभीकृत हैं। मुख्य begin के संदर्भ में प्रयुक्त चर। एक प्रोग्राम का end ब्लॉक एक विशेष मामला हो सकता है; कभी-कभी उन्हें स्थानीय चर के रूप में माना जाता है, खासकर -loop इंडेक्सर्स के लिए। हालांकि, आपके उदाहरण में, r एक वैश्विक वैरिएबल है और निष्पादन योग्य के .bss खंड से आवंटित किया गया है, जो कि Windows लोडर सुनिश्चित करता है शून्य-भरा है।

स्थानीय चर आरंभिक रूप से आरंभ किए जाते हैं जैसे कि वे आरंभिक नियतकाल में पास किए गए थे। Initialize रूटिन शून्य-आउट फ़ील्ड के लिए रनटाइम टाइप-इन्फो (आरटीटीआई) का उपयोग करता है (फिर से – यदि कोई फ़ील्ड एक सरणी या रिकॉर्ड प्रकार का है) और arrays (recursively – यदि तत्व प्रकार एक सरणी या रिकॉर्ड है) एक प्रबंधित प्रकार की , जहां एक प्रबंधित प्रकार है:

  • AnsiString
  • UnicodeString
  • WideString
  • एक इंटरफ़ेस प्रकार (विधि संदर्भों सहित)
  • गतिशील सरणी प्रकार
  • प्रकार

ढेर से आवंटन जरूरी शुरूआत नहीं कर रहे हैं; यह निर्भर करता है कि मेमोरी आवंटन के लिए किस तंत्र का उपयोग किया गया था। TObject.InitInstance ऑब्जेक्ट डेटा के भाग के रूप में आवंटन TObject.InitInstance द्वारा शून्य से भरे TObject.InitInstanceAllocMem से आवंटन शून्य-भरे हुए हैं, जबकि GetMem आवंटन शून्य-भरे नहीं हैं। New से आवंटन आरंभ किए गए हैं जैसे कि वे Initialize करने के लिए पारित किए गए थे।

मुझे हर इंटेजर्स से 0 और बॉलियस से सभी रिकॉर्ड सदस्यों के लिए झूठी बातें मिलती हैं।

मैंने विभिन्न कंपाइलर विकल्प (डीबगिंग, अनुकूलन इत्यादि) चालू और बंद करने की कोशिश की, लेकिन इसमें कोई अंतर नहीं था। मेरे सभी रिकॉर्ड सदस्यों को आरंभ किया जा रहा है।

मैं क्या खो रहा हूँ?

ठीक है, स्थानीय परीक्षणों के बजाय वैश्विक रूप से आपके परीक्षण के अलावा: महत्वपूर्ण बात जो आप याद कर रहे हैं, चर के बीच का अंतर है जो संयोग से प्रारंभिक रूप से प्रतीत होता है, और वे चर जो प्रारंभिक रूप से प्रारंभ होते हैं
बीटीडब्ल्यू : यही कारण प्रोग्रामर हैं जो अपनी चेतावनियों की जांच नहीं करते हैं, उनके खराब लिखित कोड को संभालने की सामान्य गलती को सही तरीके से व्यवहार करना है, जब वे कुछ परीक्षण करते हैं; 0 और झूठे चूक हो सकते हैं …. Want To Buy: random initialisation of local variables for debug builds.

अपने परीक्षण कोड पर निम्न भिन्नता पर विचार करें:

 program LocalVarInit; {$APPTYPE CONSOLE} procedure DoTest; var I, J, K, L, M, N: Integer; S: string; begin Writeln('Test default values'); Writeln('Numbers: ', I:10, J:10, K:10, L:10, M:10, N:10); Writeln('S: ', S); I := I + 1; J := J + 2; K := K + 3; L := L + 5; M := M + 8; N := N + 13; S := 'Hello'; Writeln('Test modified values'); Writeln('Numbers: ', I:10, J:10, K:10, L:10, M:10, N:10); Writeln('S: ', S); Writeln(''); Writeln(''); end; begin DoTest; DoTest; Readln; end. 

निम्नलिखित नमूना आउटपुट के साथ:

 Test default values Numbers: 4212344 1638280 4239640 4239632 0 0 S: Test modified values Numbers: 4212345 1638282 4239643 4239637 8 13 //Local vars on stack at end of first call to DoTest S: Hello Test default values Numbers: 4212345 1638282 4239643 4239637 8 13 //And the values are still there on the next call S: Test modified values Numbers: 4212346 1638284 4239646 4239642 16 26 S: Hello 

टिप्पणियाँ

  • यदि आप ऑप्टिमाइज़ेशन बंद के साथ संकलन करते हैं तो उदाहरण सबसे अच्छा काम करता है। अन्यथा, यदि आपके पास अनुकूलन है:
    • कुछ स्थानीय वार्स को CPU रजिस्टरों में हेरफेर किया जाएगा।
    • और अगर आप कोड के दौरान कदम करते समय सीपीयू स्टैक देखते हैं तो आप उदाहरण के लिए ध्यान देंगे कि I := I + 1 भी ढेर को संशोधित नहीं करता है। तो जाहिर है कि परिवर्तन के माध्यम से नहीं किया जा सकता।
  • आप विभिन्न कॉलिंग सम्मेलनों के साथ प्रयोग करके यह देख सकते हैं कि चीजें कैसे प्रभावित करती हैं।
  • आप स्थानीय वार्स को उनके वेतनमान के बजाय शून्य पर सेट करने के प्रभाव का परीक्षण भी कर सकते हैं।
  • यह दिखाता है कि आप पूरी तरह से निर्भर हैं कि आपकी विधि को कैसे कहा जाता है इससे पहले स्टैक पर अपना रास्ता दिखाया गया था।

ध्यान दें कि आपके द्वारा दिए गए उदाहरण कोड में, रिकॉर्ड वास्तव में एक वैश्विक चर है, इसलिए इसे पूरी तरह से प्रारंभ किया जाएगा। यदि आप उस कोड को किसी फ़ंक्शन पर ले जाते हैं, तो यह एक स्थानीय चर होगा, और इसलिए, बैरी केली द्वारा दिए गए नियमों के मुताबिक, केवल इसकी स्ट्रिंग फ़ील्ड प्रारंभ की जाएगी ('')

मेरे पास ऐसी ही स्थिति है, और मैंने सोचा भी था, लेकिन जब मैं रिकॉर्ड से पहले इस्तेमाल किए गए अन्य चर जोड़ता हूं, मान कचरा बन जाता है, इसलिए मेरे रिकॉर्ड का उपयोग करने से पहले मुझे इसका उपयोग करने के लिए आरम्भ करना होता था

 FillChar(MyRecord, SizeOf(MyRecord), #0)