2016-08-22 8 views
5

से ऐरे पॉइंटर मैं डी का उपयोग कर रहा हूं और कुछ सी पुस्तकालयों के साथ इंटरफेसिंग कर रहा हूं। नतीजतन मुझे सी (एक्स। शॉर्ट *) के लिए डी एरे को पॉइंटर्स में कनवर्ट करना होगा। वर्तमान में मैंने उन्हें इस तरह डाला:सी से डी

int[] dArray = [0, 1, 2, 3, 4]; 
myCFunction(cast(int*) dArray); 

क्या यह असुरक्षित है? मैंने करने की कोशिश की:

myCFunction(&dArray); 

लेकिन ऐसा करने से यह कार्य int * के बजाय int [] * देता है। मुझे लगता है कि C++ कुछ लोगों को इस तरह पहला तत्व ले:

myCFunction(&dArray[0]); 

लेकिन उस सूचक केवल पहला तत्व को इंगित नहीं है? मैं पॉइंटर्स और संदर्भों के लिए नया हूं क्योंकि मैं जावा की दुनिया से आया हूं।

मैं एक सरणी को एक सूचक में कैसे परिवर्तित करूं ताकि मैं इसे सी फ़ंक्शन में पास कर सकूं?

+2

सिर्फ 'myCFunction (dArray)' काम नहीं करेगा? –

+1

किसी सरणी में तत्व स्मृति में संगत होते हैं, इसलिए '& dArray [0]' वास्तव में केवल पहले तत्व के लिए एक पता है; हालांकि, उस ऑफसेट से शेष तत्व +1, +2, आदि हैं। इसके अलावा, सरणी को पास करने से पहले तत्व को पॉइंटर में विघटित कर दिया जाता है। 'myCFunction (dArray)' या 'myCFunction (& dArray [0]) 'दोनों को – yano

+0

@EugeneSh काम करना चाहिए। यह नहीं है संकलक शिकायत करता है कि myCFunction (int *) पैरामीटर myCFunction (int []) स्वीकार नहीं करता है; – jython234

उत्तर

11

डी में, एक सरणी वास्तव में (धारणात्मक) है यह:

struct { 
    size_t length; 
    void* ptr; 
}; 

एक सरणी से एक सूचक होने का हमेशा की तरह .ptr क्षेत्र का प्रयोग है। आपके मामले में: myCFunction(dArray.ptr);

लेकिन उस सूचक केवल पहला तत्व

को इंगित नहीं होता क्योंकि तत्वों स्मृति में समीपवर्ती जमा हो जाती है, पहला तत्व के लिए सूचक हम सभी की जरूरत है। अगर हम अन्य तत्वों के पते प्राप्त करना चाहते हैं तो हम उस सूचक को केवल ऑफसेट जोड़ दें।

एक अन्य बिंदु: आमतौर पर यदि कोई सी फ़ंक्शन एक सरणी सूचक चाहता है, तो इसमें सरणी की लंबाई के लिए भी एक तर्क है। ज्यादातर मामलों में आप इसे dArray.length दे सकते हैं, लेकिन कभी-कभी यह वास्तव में तत्वों की संख्या के बजाय बाइट्स में आकार मांग रहा है।

+1

यहां भी spec का एक लिंक है: https://dlang.org/spec/arrays.html#array-properties – WebFreak001