2011-08-22 14 views
8

में कामयाब कोड से आयामी सरणी मैं निम्नलिखित करना चाहते हैं:पास बहु - अप्रबंधित कोड

  1. इस तरह सी # कोड में तीन dimesinal सरणी बनाएँ:

    var myArray = new short[x,y,z]; 
    UnanagedFunction(myArray); 
    
  2. करने के लिए इसे पारित अप्रबंधित कोड (C++) इस तरह:

    void UnmanagedFunction(short*** myArray) 
    { 
        short first = myArray[0][0][0]; 
    } 
    

UPDATED जब मैं निम्नलिखित कोड की कोशिश मैं रनटाइम त्रुटि है:

Attempted to read or write to protected memory.

धन्यवाद !!!

+0

आप सी ++ में कोड लिख नहीं सकते हैं। –

+0

कोड का पहला भाग सी # में है, दूसरा सी ++ में है और मैंने इसे आजमाया है संकलक मुझे सी ++ कोड –

+1

की अनुमति देता है शायद आप अपने कोड को ट्रिपल की सरणी में बदल सकते हैं। – Simon

उत्तर

7
IntPtr Array3DToIntPtr(short[, ,] Val) 
     { 
      IntPtr ret = Marshal.AllocHGlobal((Val.GetLength(0) + Val.GetLength(1) + Val.GetLength(2)) * sizeof(short)); 

      int offset = 0; 
      for (int i = 0; i < Val.GetLength(0); i++) 
      { 

       for (int j = 0; j < Val.GetLength(1); j++) 
       { 
        for (int k = 0; k < Val.GetLength(2); k++) 
        { 
         Marshal.WriteInt16(ret,offset, Val[i, j, k]); 
         offset += sizeof(short); 


        } 
       } 
      } 

      return ret; 
     } 

यह परीक्षण किया गया है और यह काम करता है, केवल सीमा है कि आप ठीक है ठीक है कर रहा हूँ जब आप इसके साथ काम करते हैं तो आपको Marshal.FreeHGlobal पर सरणी पॉइंटर पर कॉल करने के लिए या आपको मेमोरी रिसाव मिलेगा, मैं यह भी सुझाव दूंगा कि आप अपना सी ++ फ़ंक्शन बदल दें ताकि यह सरणी आयाम स्वीकार कर सके या आप केवल विशिष्ट 3 डी सरणी का उपयोग कर सकें आकार

+0

बहुत बहुत धन्यवाद! !! –

2

मैं इसे शुद्ध सी # में लिख रहा हूं, लेकिन यदि आप Func से Func को सी/सी ++ में काम करना चाहिए। ध्यान रखें कि मैं टिप्पणी के लिए सुनिश्चित करें कि वह यह :-) लिखने के लिए मैं उपयोग कर रहा हूँ इस Indexing into arrays of arbitrary rank in C#

static unsafe void Main(string[] args) { 
    var myArray = new short[5, 10, 20]; 

    short z = 0; 

    for (int i = 0; i < myArray.GetLength(0); i++) { 
     for (int j = 0; j < myArray.GetLength(1); j++) { 
      for (int k = 0; k < myArray.GetLength(2); k++) { 
       myArray[i, j, k] = z; 
       z++; 
      } 
     } 
    } 

    // myArray[1, 2, 3] == 243 

    fixed (short* ptr = myArray) { 
     Func(ptr, myArray.GetLength(0), myArray.GetLength(1), myArray.GetLength(2)); 
    } 
} 

// To convert to C/C++ take away the static unsafe 
static unsafe void Func(short* myArray, int size1, int size2, int size3) { 
    int x = 1, y = 2, z = 3; 
    int el = myArray[x * size2 * size3 + y * size3 + z]; // el == 243 
} 
संबंधित मुद्दे