2010-09-23 10 views
11

मैं Delphi: array of Char and TCharArray "Incompatible Types" पर देख रहा था और प्रयोग करना शुरू कर दिया था। जो मैंने खोजा वह दिलचस्प है।पैरामीटर की गतिशील सरणी है जब पैरामीटर प्रकार चार की खुली सरणी है?

procedure Clear(AArray: array of Integer); 
var 
    I: Integer; 
begin 
    for I := Low(AArray) to High(AArray) do 
    AArray[I] := 0; 
end; 

var 
    MyArray: array of Integer; 
begin 
    Clear(MyArray); 
end. 

यह सरल छोटे से उदाहरण दिखाता है कि आप एक ओपन सरणी पैरामीटर का उपयोग कर एक प्रक्रिया के लिए एक गतिशील सरणी पारित कर सकते हैं। यह संकलित करता है और अपेक्षित रूप से चलता है।

procedure Clear(AArray: array of Char); 
var 
    I: Integer; 
begin 
    for I := Low(AArray) to High(AArray) do 
    AArray[I] := #0; 
end; 

var 
    MyArray: array of Char; 
begin 
    Clear(MyArray); 
end. 

यहाँ लगभग समान कोड केवल यह Char बजाय Integer की एक सरणी उपयोग कर रहा है जा रहा है अंतर है। यह संकलित नहीं करता है। इसके बजाय संकलक बाहर निकलता है:

E2010 Incompatible types: 'Array' and 'Dynamic array' 

यह क्यों होगा?

थोड़ी देर के लिए खोज करने के बाद मैंने this क्यूसी रिपोर्ट की खोज की। मैं डेल्फी 200 9 चला रहा हूं और यह अभी भी हो रहा है।

+0

"अपेक्षित" क्या है? पहले मामले में सरणी को मंजूरी नहीं दी गई है। –

+0

फिर भी, +1, केवल एक मामले संकलित करते हैं (भले ही हम 'AnsiChar' का उपयोग करें), जो कि अजीब है, क्योंकि पूर्णांक और' AnsiChar' के बीच बहुत कम अंतर होता है। –

+0

@ एंड्रियास, ठीक है, तुमने मुझे वहां पहुंचाया। एक खाली सरणी को साफ़ करने के लिए कुछ भी नहीं है। मेरे टेस्ट कोड में सेटलेथैथ पर कॉल था लेकिन मैंने इसे हटा दिया क्योंकि यह संकलन त्रुटि के लिए सीधे प्रासंगिक नहीं था। –

उत्तर

4

के बाद से विशेष रूप से प्रलेखन प्रकार चार के खुले सरणी मापदंडों का उल्लेख है गतिशील सरणियों के साथ संगत होना करने के लिए, यह एक बग होना चाहिए। 'Open Array Parameters' से:

function Find(A: array of Char): पूर्णांक;
[...]
नोट: [...] पिछले उदाहरण एक समारोह कि सहित चार तत्वों में से किसी सरणी, लेता है (लेकिन सीमित नहीं) गतिशील सरणियों पैदा करता है। [...]

2

मुझे लगता है कि कारण यह है कि array of CharPChar के साथ संगत है, के रूप में इस कोड को संकलित करता है:

procedure Clear(AArray: array of Char); 
var 
    I: Integer; 
begin 
    for I := Low(AArray) to High(AArray) do 
    AArray[I] := #0; 
end; 

var 
    MyArray: array of Char; 
    P: PChar; 
begin 
    Clear(P^); 
end. 

कि ऐतिहासिक कारणों के लिए शायद है।
उम्मीद है कि Barry Kelly या Danny Thorpe इसमें लाएगा और इस पर कुछ और प्रतिक्रिया प्रदान करेगा।

--jeroen

+0

'पी' को 'मायएरे' से कैसे पता चलता है? पॉइंटर्स के साथ धोखा मत करो! ;-) – splash

+3

हालांकि यह संकलित करता है, यह वास्तव में काम नहीं करता है। इस प्रक्रिया में कोई सुराग नहीं है कि पीसीहर की उच्च सीमा क्या है। –

+0

@Sertac: मैं पूरी तरह से सहमत हूं कि यह कहीं एक बग है; बस यह इंगित करना चाहता था कि यह कहां से आ सकता है। उम्मीद है कि बैरी या डैनी यहां कुछ प्रकाश डालेगी। –

4

आप सरणी के इस प्रकार के साथ काम कर सकते हैं, अपने स्वयं के प्रकार को परिभाषित:

type 
    TCharDynArray = array of char; 

procedure Clear(AArray: TCharDynArray); 
var 
    I: Integer; 
begin 
    for I := Low(AArray) to High(AArray) do 
    AArray[I] := #0; 
end; 

procedure test; 
var 
    MyArray: TCharDynArray; 
begin 
    Clear(MyArray); 
end; 

इस कोड को ठीक संकलित कर देगा। यह निश्चित रूप से कुछ भी उपयोगी नहीं करता है (AArray पैरामीटर "var" के रूप में सेट नहीं है, इसलिए यह प्रत्येक आइटम को # 0 निर्दिष्ट करने से पहले स्टैक पर कॉपी किया गया है)। लेकिन कम से कम, यह संकलित करता है।

प्रैक्टिस में, मुझे गतिशील सरणी (जैसे TIntegerDynArray) के लिए उच्च स्तर के प्रकार को परिभाषित या उपयोग करना अधिक आसान लगता है, क्योंकि कम से कम यह आपको एक var का उपयोग करके सरणी को संदर्भ के रूप में पारित करने की अनुमति देता है, इसलिए इसे बनाने से परहेज करता है ढेर पर एक प्रति, और अपने कोड को तेजी से बनाते हैं।

एक PChar के मानचित्रण के बारे में, यह सब गतिशील सरणियों के लिए हमेशा की तरह है: आप एक सूचक के लिए एक TIntegerDynArray मैप कर सकते हैं, तो एक PInteger या एक PIntegerArray के रूप में उपयोग:

procedure AddInteger(var Values: TIntegerDynArray; Value: integer); 
var n: integer; 
begin 
    n := Length(Values); 
    SetLength(Values,n+1); 
    Values[n] := Value; 
end; 

procedure Loop(V: PInteger); 
begin 
    if V<>nil then 
    while V^<>0 do begin 
     write(V^,' '); 
     inc(V); // go to next integer in array 
    end; 
end; 

var IntArray: TIntegerDynArray; 
begin 
    Loop(pointer(IntArray)); // will display nothing, since pointer(IntArray)=nil for IntArray=[] 
    AddInteger(IntArray,2); 
    AddInteger(IntArray,3); 
    AddInteger(IntArray,0); 
    Loop(pointer(IntArray)); // will display '2 3 ' 
end. 

समस्या "सरणी है चार "कोड की बीइंग" पूर्णांक की सरणी "के साथ असंगत है निश्चित रूप से कंपाइलर इंट्रिनिक्स में है, और तथ्य यह है कि एक पीसीहर को स्ट्रिंग में टाइप-कास्ट किया जा सकता है।

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