2010-11-08 19 views
7

मैं इसमें एक निश्चित आकार सरणी के साथ संरचना कैसे घोषित कर सकता हूं?मैं संरचना में सरणी कैसे घोषित कर सकता हूं?

मुझे समाधान मिला, लेकिन यह केवल आदिम डेटा-प्रकारों के लिए काम करता है। मुझे MyStruct टाइप करने के लिए मेरी सरणी चाहिए।

तो मैं इसमें अन्य structs की एक सरणी के साथ एक संरचना कैसे घोषित कर सकता हूं?

पूर्व।

unsafe struct Struct1{ 
     fixed int arrayInt[100]; // works properly 
     fixed Struct2 arrayStruct[100]; //not compile 
    } 

उत्तर

9

मेरे सहयोगी को ऐसा करने का काम करने का तरीका मिला। मुझे लगता है कि यह सही तरीका है।

[StructLayout(LayoutKind.Sequential)] 
    public struct Struct1 
    { 
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = sizeOfarray)] 
      private Struct2[] arrayStruct; 
    } 
5

आप नहीं कर सकते। फिक्स्ड एरे बूल, बाइट, चार, शॉर्ट, इंट, लांग, एसबीटी, यूहॉर्ट, यूंट, उलंग, फ्लोट या डबल तक ही सीमित हैं।

देखें http://msdn.microsoft.com/en-us/library/zycewsya%28v=VS.80%29.aspx

एक दृष्टिकोण अपने इंटरॉप करने के लिए C++ में एक आवरण विधानसभा कोड करने के लिए जो एक और अधिक सी # -interop के अनुकूल संरचना करने के लिए अनुवाद करता है हो सकता है।

+0

क्या कोई जानता है कि केवल आदिम प्रकार क्यों हैं, और हर ब्लिटेबल प्रकार की अनुमति नहीं है? – CodesInChaos

+0

बस अनुमान लगा रहा है: यदि आप प्रश्न में निर्माण की अनुमति देते हैं, तो उनमें से प्रत्येक स्ट्रक्चर 2-इंस्टेंस के सभी सदस्यों को भी निश्चित रूप से तय किया जाना था। तो घोंसले के कुछ स्तरों के साथ आपने पूरे स्थान पर वस्तुओं को ठीक किया है जो कचरा कलेक्टर को एक प्रमुख सिरदर्द देगा। – TToni

0

आप निश्चित सरणी के साथ कस्टम प्रकार का उपयोग नहीं कर सकते हैं। (विवरण के लिए टीटीओनिस जवाब देखें।)

एक विशिष्ट मेमोरी लेआउट के साथ सी # में संरचना बनाने की कोशिश करने के बजाय, मुझे लगता है कि आपको MarshalAs विशेषता का उपयोग यह निर्दिष्ट करने के लिए करना चाहिए कि सदस्यों को कैसे मार्शल किया जाना चाहिए। भले ही आप उन सदस्यों को प्राप्त करने में कामयाब हों जो सही मात्रा में स्मृति पर कब्जा करते हैं, फिर भी आपके पास उन तत्वों के बीच पैडिंग है जो आपको संरेखण की समस्याएं उत्पन्न करती हैं।

आप संरचना में नियमित सरणी का संदर्भ ले सकते हैं, और निर्दिष्ट करते हैं कि इसे ByValArray के रूप में चिह्नित किया जाना चाहिए।

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