2011-11-14 14 views
5

में सरणी की सरणी को ठीक करना मैं समाधान के साथ आने का प्रयास कर रहा हूं कि मैं सी # से मूल कार्यों में सरणी के सरणी को कैसे पार कर सकता हूं। मेरे पास पहले से ही फ़ंक्शन (मार्शल.गेटडिलेगेटफोरफंक्शन पॉइंटर) के प्रतिनिधि हैं, लेकिन अब मैं एक बहुआयामी सरणी (या बल्कि; सरणी की सरणी) को पारित करने की कोशिश कर रहा हूं।सी # (असुरक्षित कोड)

यह कोड उदाहरण तब काम करता है जब इनपुट में 2 सब-एरे होते हैं, लेकिन मुझे किसी भी उप-सरणी को संभालने में सक्षम होना चाहिए। ऐसा करने का सबसे आसान तरीका क्या है? मैं इस रूप में सरणियों बीच डेटा की प्रतिलिपि को नहीं देखना चाहते एक वास्तविक समय पाश में हो रहा हो जाएगा (मैं एक ऑडियो प्रभाव के साथ संवाद स्थापित कर रहा हूँ)

public void process(float[][] input) 
{ 
    unsafe 
    { 
     // If I know how many sub-arrays I have I can just fix them like this... but I need to handle n-many arrays 
     fixed (float* inp0 = input[0], inp1 = input[1]) 
     { 
      // Create the pointer array and put the pointers to input[0] and input[1] into it 
      float*[] inputArray = new float*[2]; 
      inputArray[0] = inp0; 
      inputArray[1] = inp1; 
      fixed(float** inputPtr = inputArray) 
      { 
       // C function signature is someFuction(float** input, int numberOfChannels, int length) 
       functionDelegate(inputPtr, 2, input[0].length); 
      } 
     } 
    } 
} 

उत्तर

11

आप प्रश्न में ऑब्जेक्ट के लिए पिन किए गए GCHandle को प्राप्त करके fixed का उपयोग किए बिना किसी ऑब्जेक्ट को पिन कर सकते हैं। बेशक, यह कहकर जाना चाहिए कि ऐसा करके आप यह सुनिश्चित करने के लिए ज़िम्मेदारी लेते हैं कि पॉइंटर उस बिंदु से पहले जीवित नहीं रहता है जहां ऑब्जेक्ट अनपिन किया गया है। हम इसे किसी कारण के लिए "असुरक्षित" कोड कहते हैं; आप सुरक्षित स्मृति प्रबंधन के लिए जिम्मेदार हो जाते हैं, रनटाइम नहीं।

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.gchandle.aspx

+0

मैंने जीसीएचंडल क्लास के बारे में पढ़ा था। अपना जवाब पढ़ने के बाद मैंने इसे अपने कॉल के लिए कार्यान्वित करने की कोशिश की और ऐसा लगता है कि यह बहुत अच्छी तरह से काम कर रहा है। त्वरित उत्तर के लिए धन्यवाद। – Valdemar

0

यह संदर्भ की सरणी लॉक करने के लिए कोशिश कर रहा है कोई मतलब नहीं है प्रबंधित सरणी के लिए।

वहां संदर्भ संदर्भ शायद पहले तत्व के पते को इंगित नहीं करते हैं, और यहां तक ​​कि यदि उन्होंने किया, तो यह एक कार्यान्वयन विस्तार होगा। यह रिलीज से रिलीज में बदल सकता है।

बहुत सारे डेटा में पॉइंटर्स की एक सरणी की प्रतिलिपि बनाना धीमा नहीं होना चाहिए, जब आप मल्टीमीडिया प्रोसेसिंग के साथ तुलना कर रहे हैं तो तुलनात्मक रूप से नहीं।

यदि यह महत्वपूर्ण है, तो प्रबंधित डेटा के बाहर अपना डेटा आवंटित करें, फिर कोई पिनिंग या प्रतिलिपि नहीं है। लेकिन अधिक बहीखाता।

0

सबसे आसान तरीका मैं जानता हूँ कि एक आयाम सरणी का प्रयोग है। यह जटिलता, स्मृति विखंडन को कम करता है और बेहतर प्रदर्शन भी करेगा। मैं वास्तव में अपनी परियोजना में ऐसा करता हूं। आप मैनुअल इंडेक्सिंग का उपयोग array[i][j] = oneDimArray[i *n + j] जैसे कर सकते हैं और एन को फंक्शन के लिए पैरा के रूप में पास कर सकते हैं। और आप केवल एक फिक्सिंग जैसे आप अपने उदाहरण में किया क्या करेंगे:

public void process(float[] oneDimInput, int numberOfColumns) 
{ 
    unsafe 
    { 
     fixed (float* inputPtr = &oneDimInput[0]) 
     { 
       // C function signature is someFuction(
       // float* input, 
       // int number of columns in oneDimInput 
       // int numberOfChannels, 
       // int length) 
       functionDelegate(inputPtr, numberOfColumns, 2, oneDimInput[0].length); 
     } 
    } 
} 

इसके अलावा, मैं नोट करने के लिए, कि दो आयाम सरणियों शायद ही कभी इंटेल MKL, इंटेल IPP और कई अन्य लोगों के रूप में उच्च प्रदर्शन अभिकलन पुस्तकालयों में इस्तेमाल की जरूरत है। यहां तक ​​कि बीएलएएस और लैपैक इंटरफेस में केवल एक आयाम सरणी होती है और मैंने वर्णित अप्राच का उपयोग करके दो आयाम का अनुकरण किया है (प्रदर्शन कारणों से)।

+0

यह सवाल का जवाब नहीं देता है। यह संभावना है कि पोस्टर मूल कार्य के हस्ताक्षर को बदल नहीं सकता है। – Odrade

+0

यह जवाब देता है अगर वह कर सकता है, और यह वास्तव में उस मामले में सबसे आसान तरीका है। मूल उत्तर में कोई जानकारी नहीं है कि वह कर सकता है या नहीं। –

+0

मैं वास्तव में हस्ताक्षर बदल सकता हूं, और इस जवाब ने मुझे यह विचार करने के लिए प्रेरित किया कि क्या कार्य का हस्ताक्षर जाने का सबसे अच्छा तरीका है। हालांकि यह मुझसे पूछे गए प्रश्न का उत्तर नहीं देता है, लेकिन उसने मुझे किसी तरह से मदद की। – Valdemar

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