2009-12-16 15 views
7

से प्रबंधित ऐरे बनाएं I बाइट्स की सरणी से युगल का प्रबंधित ऐरे बनाने की कोशिश कर रहा हूं। मुझे वर्तमान में काम करने में समस्या है, लेकिन मैं अनुकूलित करना चाहता था। यहां कुछ कोड है जो मैं काम करना चाहता हूं:सी # - पॉइंटर

private unsafe static double[] _Get_Doubles(byte[] _raw_data) 
{ 
    double[] ret; 
    fixed (byte* _pd = _raw_data) 
    { 
     double* _pret = (double*)_pd; 
     ret = (double[])*_pret; //FAILURE 
    } 
} 

कृपया मुझे बताएं कि इन समस्याओं का सामना कैसे करें।

-Aaron

+0

सामान्य तौर पर जब Interop के साथ काम कर, Marshaller अपने है दोस्त, सिस्टम पर आपकी सेवा पर। रनटाइम.इंटरोप सर्विसेज। मार्शल। मुझे नहीं पता कि विशेष रूप से आपको सरणी का उपयोग करने के लिए क्या चाहिए। हालांकि, आप पॉइंटर अंकगणितीय के साथ सरणी एक्सेस कर सकते हैं। शायद यह आपको सही दिशा में संकेत देता है। – OregonGhost

+0

@daGost - मुझे निश्चित रूप से पॉइंटर्स के साथ सरणी एक्सेस करने के बारे में पता है, लेकिन मुझे एक प्रबंधित सरणी marshalling में देखना होगा। धन्यवाद। –

+0

@ सीमित बात (कृपया मुझे daGhost दोबारा कॉल न करें): यदि आप पॉइंटर्स के साथ सरणी तत्वों तक पहुंच सकते हैं, तो आप मानों को एक प्रबंधित सरणी में कॉपी कर सकते हैं। – OregonGhost

उत्तर

2

अभी, मैंने सोचा कि stackalloc सही तरीका होगा, लेकिन यह विफल हो जाता है। सबसे महत्वपूर्ण बात यह है कि अब मुझे पता है कि यह असफल होने के लिए बर्बाद हो गया था। ऐसा करने का कोई तरीका नहीं है जो मैं करना चाहता हूं।

यह सवाल restating से देखा जा सकता है:

मैं एक 'असुरक्षित' सरणी के चारों ओर एक कामयाब सरणी कैसे बना सकते हैं?

चूंकि एक प्रबंधित सरणी में हेडर जानकारी है (क्योंकि यह स्मृति की चक के आसपास एक कक्षा है), इसे सरणी की तुलना में स्मृति में अधिक जगह की आवश्यकता होती है। तो, जवाब है:

(और/या बाद में) प्रबंधित एरे के तरीके के आधार पर अंतरिक्ष आवंटित किया जाता है) सरणी स्वयं और प्रबंधित जानकारी (लंबाई, (et cetera)) को 'असुरक्षित' 'सरणी

यह आसानी से संभव नहीं है क्योंकि यह सुनिश्चित करने के लिए कि सरणी के चारों ओर पर्याप्त डेटा सबसे अच्छा है। मेरे विशेष उदाहरण में इसके लिए पर्याप्त जगह हो सकती है क्योंकि एक प्रबंधित बाइट [] का अर्थ है कि सरणी के चारों ओर डेटा है, लेकिन यह दावा करने के लिए कि प्रबंधित डेटा के लिए समान डेटा उपयुक्त है [] सबसे अच्छा है, लेकिन अधिकांश संभवतः ग़लत, और प्रबंधित डबल के लिए इसे उचित बनाने के लिए डेटा को बदलने के लिए [] घृणास्पद है।

[संपादित करें]

यह Marshal.Copy की तरह दिखता है यहां जाने का रास्ता है। एक नई सरणी बनाएं और मार्शल कॉपी उन्हें (उम्मीद है कि वह मुझे से जल्दी हो जाएगा, या कि शायद कुछ बाद की तारीख में, वह जल्दी हो जाएगा):

var ret = new double[_raw_data.Length/sizeof(double)]; 
System.Runtime.InteropServices.Marshal.Copy(new System.IntPtr(_pret), ret, 0, ret.Length); 
3

महत्वपूर्ण बातें कोड आपने पोस्ट किया है के बारे में सूचना के लिए में से एक कोई रास्ता नहीं पता है कि कैसे कई मदों वापसी मान द्वारा की ओर इशारा कर रहे हैं कि वहाँ है, और एक कामयाब सरणी पता है कि कैसे की जरूरत है बड़ा यह है। आप double* वापस कर सकते हैं या new double[XXX] बना सकते हैं और मानों की प्रतिलिपि बना सकते हैं या यहां तक ​​कि (यदि गिनती स्थिर है) struct को public fixed double _data[2]; सदस्य के साथ बनाएं और उस प्रकार के कच्चे डेटा को कास्ट करें।

+0

यह मूल रूप से मैं क्या कर रहा हूँ। मैंने एक निश्चित लंबाई के साथ डबल सरणी बनाई, फिर एक समय में मेरे मूल्यों को कॉपी किया। सी ++ तरीके से, यह नया डबल सरणी आवंटित नहीं करना अच्छा होगा। हाँ, एक डबल [] और एक बाइट [] के साथ एक संरचना, अल, कुल्हाड़ी और ईएक्स रजिस्टरों की तरह ओवरलैप करने के लिए सेट है, लेकिन एक संरचना बनाने का ऊपरी भाग जो मैं कर रहा हूं उससे कहीं अधिक हो सकता है ... जो आपको बना सकता है सोचो, पृथ्वी पर क्यों आप अपनी सरणी प्रतिलिपि में इतनी गड़बड़ करनी चाहेंगे? जिसके लिए मैं जवाब देता हूं ''। –

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