2010-10-21 11 views
8

मेरे पास एक गतिशील सरणी myArr है। myArr में मेमोरी में क्या संग्रहीत किया जाता है जब हम SetLength का उपयोग करते हैं? क्या यह '00' है? या अपरिभाषित?डेल्फी में सेटलेथेंथ के साथ उपयोग किए जाने पर गतिशील सरणी की स्मृति में क्या है?

SetLength इस मामले में myArr के लिए स्मृति के 16 बाइट आवंटित करता है।

myArr : array of byte; 

SetLength(myArr, 16); 

उत्तर

13

, डेल्फी 7 मदद से उद्धरित "एक लंबी स्ट्रिंग या गतिशील सरणी चर के लिए, SetLength स्ट्रिंग या सरणी में तत्वों में स्ट्रिंग या सरणी दिया लंबाई के एसद्वारा संदर्भित पुनर। मौजूदा वर्ण संरक्षित हैं, लेकिन नए आवंटित स्थान की सामग्री को अपरिभाषित किया गया है। एक अपवाद तब होता है जब एक गतिशील सरणी की लंबाई बढ़ती है जिसमें तत्व प्रकार होते हैं जिन्हें प्रारंभ किया जाना चाहिए (तार, वेरिएंट, वेरिएंट सरणी, या ऐसे रिकॉर्ड प्रकार)। एस एक गतिशील सरणी है जिसे प्रारंभ किया जाना चाहिए, नई आवंटित स्थान 0 या nil पर सेट है। "

मेरे अवलोकन के लिए, स्थिर सरणी के लिए, प्रारंभिक तत्वों में यादृच्छिक डेटा होता है। गतिशील सरणी के लिए, डेल्फी 7 के बाद AFAIK, प्रारंभिक तत्वों में उनके डिफ़ॉल्ट कुछ भी नहीं मान शामिल हैं। हालांकि, आपको इस तथ्य पर भरोसा नहीं करना चाहिए क्योंकि यह SetLength का कार्यान्वयन विवरण था। आपको इसके बजाय आधिकारिक दस्तावेज़ीकरण का पालन करना चाहिए।

+0

-1 यह डेल्फी 7 में सच नहीं है - जो भी दस्तावेज़ कहता है, System.pas में कोड शून्य बाइट्स –

+4

के साथ गतिशील सरणी डेटा प्रारंभ करता है क्या आप इस तरह के व्यवहार को डेल्फी के भविष्य के संस्करणों में अब तक रहेंगे? डेल्फी 7 की अपनी टिप्पणी के लिए, कृपया दूसरा पैराग्राफ पढ़ें। – Vantomex

+0

मौजूदा अनुप्रयोगों में किसी भी प्रतिगमन से बचने के लिए, मैं गारंटी नहीं दे सकता कि ईएमबी कोड नहीं बदल सका ... लेकिन वे इस तरह के विचारों के बारे में काफी रूढ़िवादी हैं ...वे जानते हैं कि बहुत से कोड इस अनियंत्रित व्यवहार पर भरोसा करते हैं। चूंकि संबंधित डेल्फी 5/6/7 ... 2010/XE system.pas कोड शुद्ध पास्कल में है, और 64 बिट में कनवर्ट करना आसान है (पीसीहर को नेटिवइन्ट या इस तरह कनवर्ट करें), मुझे कोई कारण नहीं मिला कि वे क्यों भविष्य में कार्यान्वयन को बदलना चाहिए: एक बार में सभी नई मेमोरी भरना व्यक्तिगत स्ट्रिंग, वेरिएंट और ऐसे आरंभ करने से तेज है। –

7

प्रैक्टिस में, यह शून्य के साथ शुरू किया गया है।

विधि SetLength आंतरिक रूप से System.DynArraySetLength पर कॉल करती है।
Delphi 5 का उपयोग करके, स्मृति #0 से भर जाती है।

// Set the new memory to all zero bits 
FillChar((PChar(p) + elSize * oldLength)^, elSize * (newLength - oldLength), 0); 

मुझे लगता है कि डेल्फी के हाल के संस्करणों में यह व्यवहार नहीं बदला है।

+0

+1 यह डेल्फी 7 में सच है - जो भी दस्तावेज़ कहता है, System.pas में कोड शून्य बाइट्स के साथ गतिशील सरणी डेटा प्रारंभ करता है। –

+1

सच है लेकिन आप वास्तव में उस पर भरोसा नहीं कर सकते हैं। यह विनिर्देशों (प्रारंभिक प्रकारों के विपरीत) का हिस्सा नहीं है और बिना किसी सूचना के बदल सकता है। –

+0

सच है लेकिन विकल्प क्या है? इसे स्वयं शुरू करना, इसे समय की बर्बादी के बारे में जानना? मैं इस पर भरोसा करता हूं और हमारे दैनिक निर्माण के साथ हर दिन एक टेस्टकेस सत्यापित करता हूं। इसे बदलना चाहिए (नोटिस के बिना), दैनिक निर्माण इसे उठाता है। –

संबंधित मुद्दे

 संबंधित मुद्दे