2012-10-18 13 views
6

मैं एक गतिशील सरणी की लंबाई निर्धारित करने के लिए निम्न फ़ंक्शन का उपयोग करने का प्रयास कर रहा हूं जो एक var param है। केवल कोई त्रुटि है जब मैं कोड को संकलित करने का प्रयास करें:मैं एक फ़ंक्शन में SetLength का उपयोग क्यों नहीं कर सकता जो सरणी पैरामीटर प्राप्त करता है?

[dcc64 त्रुटि] lolcode.dpr (138):

function execute(var command : array of string) : Boolean; 
begin 
    // Do something 
    SetLength(command,0); 
end; 
+0

चूंकि यह साइट अंग्रेजी में है, इसलिए अधिकांश लोगों के लिए आपके प्रश्न का उत्तर देना आसान होगा यदि आप अपने त्रुटि संदेश का अंग्रेजी अनुवाद पोस्ट करने में सक्षम थे - मुझे लगता है कि यह "असंगत टोकन" होगा? – RobV

+1

@RobV: "असंगत प्रकार", शायद जर्मन या डच में। –

+0

हां, क्षमा करें। लेकिन इस मामले में, अंग्रेजी अनुवाद इतना अलग नहीं है। असंगत प्रकार। –

उत्तर

7

एक प्रकार परिभाषित E2008 असंगत प्रकार

type 
    TStringArray = array of string; 

और आप

function Execute(var StringArray: TStringArray): boolean; 
begin 
    // Do something 
    SetLength(StringArray, 0); 
end; 
+0

पैरामीटर के लिए 'var' को न भूलें, या कॉलर में परिवर्तन दिखाई नहीं देंगे। – hvd

+0

@ एचवीडी: ओह, क्षमा करें! –

+0

काम करता है, thx! आप भयानक हैं –

13

आप एक सामान्य और मौलिक गलत-समझ से पीड़ित हैं सरणी पैरामीटर की nding। आप यहाँ है क्या:

function execute(var command: array of string): Boolean; 

तथ्य एक dynamic array में नहीं है। यह open array parameter है।

अब, आप एक गतिशील सरणी को एक फ़ंक्शन के पैरामीटर के रूप में पास कर सकते हैं जो एक खुली सरणी प्राप्त करता है। लेकिन आप गतिशील सरणी की लंबाई को संशोधित नहीं कर सकते हैं। आप केवल इसके तत्वों को संशोधित कर सकते हैं।

यदि आपको गतिशील सरणी की लंबाई को संशोधित करने की आवश्यकता है, तो प्रक्रिया को गतिशील सरणी प्राप्त करनी होगी। आधुनिक डेल्फी में लिखने के लिए मुहावरेदार तरीका है:

function execute(var command: TArray<string>): Boolean; 

आपको लगता है कि सामान्य सरणियों का समर्थन नहीं करता तो आप पैरामीटर के लिए एक प्रकार की घोषणा करने की जरूरत है डेल्फी के एक पुराने संस्करण का उपयोग कर रहे हैं:

type 
    TStringArray = array of string; 
.... 
function execute(var command: TStringArray): Boolean; 

आप कैसे चुन सकते हैं कि खुले सरणी या गतिशील सरणी पैरामीटर का उपयोग करना है या नहीं? मेरी राय में आपको हमेशा ऐसा करने के लिए खुले सरणी का उपयोग करना चाहिए। और यदि संभव नहीं है, तो अंतिम उपाय के रूप में गतिशील सरणी का उपयोग करें। एक खुले सरणी पैरामीटर के साथ एक फ़ंक्शन होने का कारण एक गतिशील सरणी पैरामीटर के साथ एक से अधिक सामान्य है। उदाहरण के लिए, आप निरंतर आकार वाले सरणी को खुले सरणी पैरामीटर के रूप में पास कर सकते हैं, लेकिन यदि फ़ंक्शन को गतिशील सरणी प्राप्त नहीं होती है।

+0

आपके स्पष्टीकरण के लिए धन्यवाद। यह वास्तव में दिलचस्प है! –

+0

@ मार्को अलाका जबकि एंड्रियास ने आपको एक समाधान दिया, मैंने यह बताने का प्रयास किया कि क्या हो रहा है। मेरे द्वारा शामिल दस्तावेज लिंक का एक पठन है। चूंकि आप आधुनिक डेल्फी का उपयोग कर रहे हैं, आप जेनेरिक सरणी का उपयोग कर सकते हैं और आपको चाहिए। उनके पास सबसे अच्छी प्रकार की संगतता गुण हैं। मैं वास्तव में यह सुनिश्चित करना चाहता था कि आप निष्कर्ष निकालें कि खुले सरणी से बचा जाना चाहिए। मैं हमेशा उनका उपयोग करता हूं क्योंकि वे भाषा में सबसे सामान्य सरणी पैरामीटर हैं। 'Var तर्क के लिए –

+1

+1: TArray ' idiom –