2011-10-02 6 views
8

मेरे पास एक सी # प्रोजेक्ट है जो सी ++ डीएल का उपयोग कर रहा है। (विजुअल स्टूडियो 2010 में)

मुझे सी # कोड से सी ++ फ़ंक्शन में int की एक सरणी पास करनी है और सी ++ फ़ंक्शन सरणी में कुछ तत्व जोड़ देगा, जब नियंत्रण सी # कोड पर वापस आता है, सी # कोड उसी सरणी में तत्व भी जोड़ देगा ।

प्रारंभ में मैंने सी # कोड में एक सरणी (आकार 10000) घोषित की और सी ++ कोड तत्व जोड़ने में सक्षम है (क्योंकि यह केवल int की एक सरणी थी, स्मृति आवंटन समान है), लेकिन समस्याएं मुझे रन टाइम त्रुटि मिली है सरणी के बाहर की ओर पहुंचने के कारण।

सी # सरणी को सी ++ से कैसे पास करें और अतिरिक्त आइटम के साथ इसे वापस # पर वापस कर दें?

मैं आकार 100000 तक बढ़ा सकता हूं लेकिन फिर मुझे नहीं पता कि सी ++ कोड कितना तत्व जोड़ देगा (यहां तक ​​कि यह केवल 1 तत्व हो सकता है)।

तो क्या दोनों या अन्य तरीकों के लिए एक आम डेटा संरचना (गतिशील सरणी) मौजूद है? मैं विजुअल स्टूडियो 2010 का उपयोग कर रहा हूं।

ऐसा कुछ मैं करना चाहता हूं।
पीएस: संकलित कोड नहीं, और यहां मैंने int सरणी के बजाय चार सरणी का उपयोग किया।

सी # कोड

[DllImport("example1.dll")] 
private static extern int fnCPP (StringBuilder a,int size) 
... 

private void fnCSHARP(){ 
    StringBuilder buff = new StringBuilder(10000); 
    int size=0; 
    size = fnCPP (buff,size); 
    int x = someCSHARP_fu(); 
    for (int i=size; i < x+size; i++) buff[i]='x';// possibility of run time error 
} 

सी ++ कोड

int fnCPP (char *a,int size){ 
    int x = someOtherCpp_Function(); 
    for(int i=size; i < x+size ; i++) a[ i ] = 'x'; //possibility of run time error 
    return size+x; 
} 
+0

हमें कुछ कोड दिखाएं –

+2

क्या आप सी ++/सीएलआई का उपयोग कर सकते हैं? क्या आप सी ++/सीएलआई का उपयोग कर सकते हैं? –

+2

आप किसी सरणी में आइटम "जोड़" नहीं सकते हैं। Arrays आकार में तय कर रहे हैं। एक अलग डेटा संरचना का प्रयोग करें या बदलें कि आप दोनों के बीच इंटरफ़ेस कैसे करते हैं। –

उत्तर

3

वहाँ प्रबंधित और अप्रबंधित कोड Here के बीच सरणियों गुजर के बारे में एक अच्छा MSDN लेख है। सवाल यह है कि, आपको सरणी को सी # से सी ++ में पहली जगह क्यों पारित करने की आवश्यकता होगी? आप सी ++ पक्ष (आपके एफएनसीपीपी विधि में) पर आवंटन क्यों नहीं कर सकते हैं, और सी # कोड में पॉइंटर वापस कर सकते हैं, और का उपयोग yet another Stackoverflow question में करने के बजाय करें? आपकी fnCSHARP विधि से अधिक आप सरणी की सामग्री को कुछ विविध लंबाई डेटा संरचना (उदा। सूची) में कॉपी कर सकते हैं।

+3

से साफ़ करने के लिए कोड जोड़ा है यदि आप सी ++ में मेमोरी आवंटित करते हैं और इसे सी # पर वापस कर देते हैं, तो आपको बाद में पॉइंटर को स्मृति मुक्त करने के लिए सी ++ पर वापस करने की आवश्यकता होती है। .NET कचरा कलेक्टर यहां आपकी सहायता नहीं कर सकता है। –

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

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