2010-06-21 14 views
6

मैं तो हमारे अन्य एप्लिकेशन डेवलपर उस तक पहुँच सकते सी # करने के लिए बंदरगाह के लिए काम दिया गया है कुछ पुस्तकालय दिनचर्या के साथ करने के लिए है, लेकिन मैं चर घोषित करने के लिए कैसे तो वे दिनचर्या में आ पता नहीं है सही ढंग से। DLL आयातDll आयात सी ++ सी # सरणी

[DllImport(MODELAPP, EntryPoint = "SteadyFor", ExactSpelling = false)] 
public static extern int SteadyFor(
    ref double[] par, ref double[] inlet, ref double[] outlet, 
    [MarshalAs(UnmanagedType.LPStr)] string input, 
    [MarshalAs(UnmanagedType.LPStr)] string output); 

double[] Par = { 8, 16, 8, 0.61, 0.00635, ... }; // 29 variables 
double[] Inlet = { 22.18, 43.31, 1.13, 2.81, 0.43 }; // 5 variables 
double[] Outlet = { 0, 0, 0, 0, 0, 0 }; // placeholder for 6 variables 
SteadyFor(ref Par, ref Inlet, ref Outlet, FileIn, FileOut); 

:

समस्या यह है, जब मैं सी ++ कोड के साथ में इनपुट पढ़ने के माध्यम से कदम, मैं सभी विषम मूल्यों को प्राप्त का उपयोग करने के

प्रयास

सी ++ फ़ाइल:

extern "C" int SteadyFor(double Par[], double Inlet[], double Outlet[], char* FileIn, char* FileOut) 
{ 
    int n = (int)Par[0]; // Actual Reading: [0] 
    int nt = (int)Par[1]; // Actual Reading: [0] 
    int pass = (int)Par[2]; // Actual Reading: [0] 
    double l = Par[3]; // Actual Reading: [2.9581223236733198e+174] 
    double rTube = Par[4]; // Actual Reading: [2.121995790965e-314#DEN] 
    double tTube = Par[5]; // Actual Reading: [5.432309224896e-312#DEN] 
    double pl = Par[6]; // Actual Reading: [1.0253217546256438e-267] 
    double pt = Par[7]; // Actual Reading: [4.60629e-308] 
    // ... 
} 

जाहिर है, मानों मैं हो रही है सब गलत कर रहे हैं - लगभग जैसी गैर-प्रारंभ स्मृति।

कोई मुझे बता सकते हैं मैं गलत क्या कर रही हूं और इसे ठीक करने के लिए?

सादर,

~ जो

उत्तर

7

ड्रॉप घोषणा में "रेफरी" कीवर्ड, वे सही नहीं हैं। कि सी ++ कोड एवी के साथ दुर्घटनाग्रस्त नहीं है थोड़ा रहस्यमय है।

[MarshalAs] तारों पर विशेषता अनावश्यक है।

+0

वह काम करता है, हंस। अब क्यों? सी ++ पॉइंटर्स में ला रहा है, और सी # गुजर रहा है ... क्या? संकेत दिए गए? – jp2code

+4

एक सरणी के लिए डिफ़ॉल्ट मार्शलिंग अपने पहले तत्व को पॉइंटर पास कर रहा है। बस सी ++ करता है। Arrays कभी मूल्य से पारित नहीं होते हैं, यह बहुत महंगा होगा और बड़े सरणी पर असफल होने के लिए बर्बाद हो जाएगा। जब आप "रेफरी" का उपयोग करते हैं तो यह उस पॉइंटर को पॉइंटर पास करता है। –

1

मूल रूप से आप एक मार्शलिंग विशेषता घोषित करने के लिए की जरूरत है। आपके मामले में, यह एक MarshalAs (UnmanagedType.LPArray) विशेषता होगी।

यहाँ देखो:
http://msdn.microsoft.com/en-us/library/z6cfh6e6%28VS.80%29.aspx#cpcondefaultmarshalingforarraysanchor3

+0

काम पर हमारे प्रॉक्सी MSDN साइटों पार्स करने में अक्षम है। मैं बाद में इसे देख लूंगा। अभी के लिए, मैं बस आपके जवाब के साथ कोड करने जा रहा हूँ! धन्यवाद। – jp2code

+0

@ jp2code, मुझे आशा है कि आपके स्थानीय रूप से स्थापित एमएसडीएन काम करता है ...! – code4life

+0

चूहों। वह काम नहीं किया। सभी मान अभी भी पूर्णांक के साथ आते हैं और युगल कुछ अजीब होता है। – jp2code

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