2010-07-06 16 views
8

मेरे पास गतिशील सरणी है। लेकिन शुरुआत में मैं सरणी की लंबाई नहीं जान रहा हूं। क्या मैं पहले ऐसा कर सकता हूं कि मैंने इसकी लंबाई 1 के रूप में सेट की है और फिर लंबाई बढ़ाएं क्योंकि मुझे पहले से संग्रहीत डेटा खोए बिना चाहिए?
मुझे पता है कि मैं टीएलिस्ट का उपयोग करके ऐसा कार्य कर सकता हूं। लेकिन मैं जानना चाहता हूं कि मैं इसे सरणी के साथ कर सकता हूं या नहीं?क्या मैं अपनी पिछली सामग्री खोए बिना डेल्फी सरणी का आकार बदल सकता हूं?

+0

क्या आपने गतिशील सरणी के बारे में प्रलेखन पढ़ा था? आप किस हिस्से को समझ नहीं पाए? –

उत्तर

15

गतिशील Arrays को निहित डेटा खोए बिना बड़े आकार में आकार में बदला जा सकता है।

निम्नलिखित प्रोग्राम इसे क्रिया में प्रदर्शित करता है।

program Project7; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 
var 
A : Array of Integer; 
I : Integer; 
begin 
    for I := 0 to 19 do 
    begin 
    SetLength(A,I+1); 
    A[I] := I; 
    end; 
    for I := Low(A) to High(A) do 
    begin 
    writeln(A[I]); 
    end; 
    readln; 
end. 
+10

बस जागरूक रहें कि यह एक स्मृति गहन ऑपरेशन हो सकता है, क्योंकि पूरे सरणी को स्थानांतरित किया जा सकता है यदि इसे आवंटित करने के लिए पर्याप्त जगह नहीं है। सूचियों के विपरीत, एक सरणी, एक contiguos स्मृति ब्लॉक में आवंटित किया जाना चाहिए। यही कारण है कि सूची (और अन्य कंटेनर) मौजूद हैं। अपनी जरूरतों के लिए सबसे अच्छा कंटेनर का प्रयोग करें। –

+5

@ldsandon: सावधान रहें: डेल्फी में कई "सूचियां" सरणी के रूप में लागू की जाती हैं या कम से कम संगत मेमोरी ब्लॉक उसी तरह से "हुड के नीचे" सरणी के रूप में लागू होती हैं। टीएलिस्ट, टॉब्जेक्टलिस्ट, टीस्ट्रिंगलिस्ट ... इन सबसे आम तौर पर सामने आने वाली सूचियां ऑब्जेक्ट रैपर के अंदर सभी प्रभावी ढंग से सरणी हैं। इन "सरणी" की "लंबाई" में "असली" सरणी की तुलना में अधिक लचीला प्रबंधन उपकरण होते हैं, क्योंकि वे क्षमता ("सरणी" का आकार) और गणना (वास्तव में उपयोग किए जाने वाले तत्वों की संख्या) का समर्थन करते हैं ताकि आप पूर्व-आवंटित कर सकें इसे भरने से पहले आपको आवश्यक स्मृति (क्षमता के माध्यम से) की आवश्यकता होती है। – Deltics

+1

स्पष्टीकरण का एक बिंदु जो आप पहले ही जानते हैं। मुझे नहीं पता कि इस अनुकूलन में से कोई भी आधुनिक मशीनों पर कोई फर्क नहीं पड़ता है, लेकिन उपरोक्त उदाहरण * प्रत्येक * नए तत्व के लिए SetLength() को कॉल करता है। Idsandon की टिप्पणी नोट्स के रूप में, SetLength मेमोरी गहन हो सकता है। यदि ऐसा है, तो SetLength() को कॉल करना अक्सर कम हो सकता है। उदाहरण के लिए, आप इसे हर 100 (या यहां तक ​​कि 1000) तत्वों में एक बार कॉल कर सकते हैं। बेशक, आपको इसे कॉल करने की आवश्यकता होने पर ट्रैक करना होगा: यदि (लंबाई (ए) <(I + 1) तो सेटलेथेंथ (ए, आई + 100); – RobertFrank

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