2011-11-01 21 views
8

कैसे मैं सी # में एक संरचना प्रकार का निश्चित-आकार सरणी की घोषणा करते हैं:फिक्स्ड आकार सरणी

[StructLayout(LayoutKind.Sequential,Pack=1), Serializable] 
public unsafe struct MyStruct{ 
    ... 
} 

public class MyClass { 
    ... 
    public fixed MyStruct myStruct[256]; 
} 

इस CS1663 के लिए परिणाम होगा: struct प्रकार का तय आकार बफ़र्स अनुमति नहीं है, मैं कैसे कर ? वैकल्पिक हल इस, मैं सी # या "प्रबंधित संग्रह डेटा संरचना" प्रकार उपयोग नहीं करना चाहते, मैं जरूरत के रूप में करने के लिए बार-बार मार्शल यह देशी सी ++ के

उत्तर

9

यदि आपका सी # में होना चाहिए है struct केवल आदिम डेटा प्रकार का उपयोग करता है और C++ में अपनी मूल struct के रूप में बिल्कुल एक ही लेआउट है, तो आपको नियमित स्मृति मीटर के साथ इन प्रतिबंधों के आसपास प्राप्त कर सकते हैं सगाई और असुरक्षित कोड। बोनस के रूप में, आप marshalling से परहेज करके प्रदर्शन में सुधार होगा।

स्मृति का आवंटन:

IntPtr arr = Marshal.AllocHGlobal (sizeof (MyStruct) * 256); 

यह मूलतः malloc है, इसलिए आबंटित स्मृति जीसी के बारे में जागरूकता के बाहर है।

आप इंटिप्ट को मूल कोड में पास कर सकते हैं जैसे कि यह MyStruct[256] था और केवल इंटिप्टर को मार्शल किया जाएगा, न कि स्मृति को इंगित करता है। मूल और प्रबंधित कोड सीधे उसी स्मृति तक पहुंच सकते हैं।

पढ़ने के लिए/साथ सी # सरणी में structs लिखते हैं, का उपयोग सी # संकेत:

static unsafe MyStruct GetMyStructAtIndex (IntPtr arr, int index) 
{ 
    MyStruct *ptr = ((MyStruct *)arr) + index; 
    return *ptr; 
} 

static unsafe void SetMyStructAtIndex (IntPtr arr, int index, MyStruct value) 
{ 
    MyStruct *ptr = ((MyStruct *)arr) + index; 
    *ptr = value; 
} 

Marshal.FreeHGlobal (arr); 

के लिए मत भूलना जब आप स्मृति के साथ पूरा कर लें, free को यह।

3

आप नहीं कर सकते हैं, per the definition

केवल प्रतिबंध यह है कि सरणी प्रकार bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float, या double.

+0

कोई समाधान नहीं? तो मैं इसे सी ++ में कर सकता हूं? – uray

+0

@uray केवल एक चीज जो मैं सुझा सकता हूं वह एक नियमित सरणी है। यदि यह संभव नहीं है, तो ... –

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