2009-04-10 11 views
26

मुझे निम्न फ़ंक्शन मिल गया है:सी #: रेफरी की अपेक्षा रखने वाले फ़ंक्शन को कैसे पास किया जाए?

public static extern uint FILES_GetMemoryMapping(
    [MarshalAs(UnmanagedType.LPStr)] string pPathFile, 
    out ushort Size, 
    [MarshalAs(UnmanagedType.LPStr)] string MapName, 
    out ushort PacketSize, 
    ref Mapping oMapping, 
    out byte PagesPerSector); 

जिसे मैं इस तरह कॉल करना चाहता हूं:

FILES_GetMemoryMapping(MapFile, out size, MapName, 
    out PacketSize, null, out PagePerSector); 

दुर्भाग्यवश, मैं उस क्षेत्र में null पास नहीं कर सकता जिसके लिए ref Mapping टाइप करें और कोई कलाकार नहीं है I मैंने इसे ठीक करने की कोशिश की है।

कोई सुझाव?

+0

संभावित डुप्लिकेट [मैं सी # में वैकल्पिक सी ++ डीएलएल संरचना तर्क कैसे संभाल सकता हूं] (https://stackoverflow.com/questions/47997942/how-do-i-handle-optional-c-dll-struct-arguments- इन-सी-तेज) – River

उत्तर

30

मुझे लगता है कि मानचित्रण संभालने कर रहा हूँ एक संरचना है? यदि ऐसा है तो आपके पास विभिन्न हस्ताक्षरों के साथ FILES_GetMemoryMapping() प्रोटोटाइप के दो संस्करण हो सकते हैं।

FILES_GetMemoryMapping(MapFile, out size, MapName, 
    out PacketSize, IntPtr.Zero, out PagePerSector); 

तो मानचित्रण वास्तव में एक संरचना के बजाय एक वर्ग है, बस सेट: दूसरे अधिभार जहां null पास करना चाहते हैं के लिए, पैरामीटर एक IntPtr बनाने के लिए और IntPtr.Zero

public static extern uint FILES_GetMemoryMapping(
    [MarshalAs(UnmanagedType.LPStr)] string pPathFile, 
    out ushort Size, 
    [MarshalAs(UnmanagedType.LPStr)] string MapName, 
    out ushort PacketSize, 
    IntPtr oMapping, 
    out byte PagesPerSector); 

कॉल उदाहरण का उपयोग इसे पार करने से पहले शून्य करने के लिए मूल्य।

+0

एक आकर्षण की तरह काम करता है! – Nick

+3

और यदि आप 8 पॉइंटर से structs के साथ कोई फ़ंक्शन रखते हैं और उनमें से कोई भी शून्य हो सकता है तो आप क्या सुझाव देते हैं? क्या मुझे 256 अधिभार लिखना चाहिए? निरर्थक मान प्रकार का उपयोग डमी परिवर्तनीय काम करेगा? – Calmarius

+0

@ कलमियस क्यों 'इंटिप्टर' के साथ सभी 'रेफरी ' की जगह एक परिभाषा लिखना नहीं है? हां, यह कम सुरक्षित है, लेकिन ऐसा लगता है कि यदि आप पी/कोड कोड सुरक्षा के साथ सौदा करते हैं तो पहले से ही बिंदु नहीं है। – SerG

6

एक तरह से, एक डमी चर बना यह शून्य असाइन करें और में पारित करने के लिए है।

2
Mapping oMapping = null; 

FILES_GetMemoryMapping(MapFile, out size, MapName, out PacketSize, ref oMapping, out PagePerSector); 
+1

मानचित्रण वास्तव में एक संरचना है इसलिए मैं इसे शून्य पर सेट नहीं कर सकता। – Nick

+0

@ निक, संरचना मामले – JaredPar

+3

के लिए मेरा उत्तर देखें मुझे लगता है कि यह इस बिंदु को याद करता है। कभी-कभी फ़ंक्शंस में रेफ पैरामीटर होते हैं जिनकी आपको परवाह नहीं है। बेकार परिवर्तनीय अव्यवस्था कोड को परिभाषित करने और परेशान करने के लिए। –

23

कारण आप null पास नहीं कर सकते हैं क्योंकि ref पैरामीटर सी # कंपाइलर द्वारा विशेष उपचार दिया जाता है। कोई भी ref पैरामीटर एक संदर्भ होना चाहिए जिसे आप जिस फ़ंक्शन पर कॉल कर रहे हैं उसे पारित किया जा सकता है। चूंकि आप null पास करना चाहते हैं, इसलिए संकलक इसे अनुमति देने से इंकार कर रहा है क्योंकि आप उस संदर्भ को प्रदान नहीं कर रहे हैं जिस पर फ़ंक्शन की अपेक्षा है।

आपका एकमात्र वास्तविक विकल्प स्थानीय चर बनाने के लिए होगा, इसे null पर सेट करें, और उसमें पास करें। कंपाइलर आपको उससे अधिक कुछ करने की अनुमति नहीं देगा।

1

जबकि @ JaredPar के answer निस्संदेह सही जवाब है, नहीं है एक और जवाब: unsafe कोड और संकेत:

unsafe { 
    Mapping* nullMapping = null; 
    FILES_GetMemoryMapping(
      MapFile, 
      out size, 
      MapName, 
      out PacketSize, 
      ref *nullMapping, // wat? 
      out PagePerSector); 
} 

कि लगता है कि यह क्रम में असफल चाहिए, लेकिन यह 'नहीं करता है टी, क्योंकि ref और * एक-दूसरे को रद्द कर देते हैं, और ref *nullMapping का परिणामी मान शून्य सूचक है, जो FILES_GetMemoryMapping() उस पैरामीटर के लिए प्राप्त होगा।

शायद यह का अच्छा विचार नहीं है, लेकिन यह संभव है।

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

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