2009-07-25 15 views
7

मैं MATLAB में C++ कोड चलाने के लिए MEX इंटरफ़ेस का उपयोग कर रहा हूं। मैं एक System वस्तु से निपटने के लिए MATLAB के लिए कई कार्य जोड़ना चाहते हैं:कई कार्यों के साथ क्लास ऑब्जेक्ट में MATLAB MEX इंटरफ़ेस

sysInit() 
sysRefresh() 
sysSetAttribute(name, value) 
String = sysGetAttribute(value) 
sysExit() 

प्रत्येक MEX dll के बाद से एक समारोह हो सकते हैं, मैं वैश्विक System वस्तु जो जब तक उपलब्ध नहीं होगा करने के लिए सूचक स्टोर करने के लिए एक रास्ता खोजने की जरूरत है sysExit पर कॉल द्वारा हटा दिया गया।

मैं MATLAB में इसे ठीक से कैसे कर सकता हूं? क्या एमएक्स फ़ंक्शंस में कॉल पर वैश्विक पॉइंटर्स स्टोर करने के कोई तरीके हैं?

उत्तर

8

एक आम तरीका है कि कई एम-फाइल फ़ंक्शन हैं जो सार्वजनिक इंटरफ़ेस प्रदान करते हैं, उदा। sysInit.m, sysRefresh.m, आदि

इनमें से प्रत्येक एम-फाइल मैक्स फ़ंक्शन को किसी प्रकार के हैंडल, एक स्ट्रिंग (या संख्या) को कॉल करने के लिए फ़ंक्शन की पहचान करने और किसी भी अतिरिक्त तर्क के साथ कॉल करती है। उदाहरण के लिए, sysRefresh.m प्रकार दिखाई देंगे:

function sysRefresh(handle) 
return sysMex(handle, 'refresh') 

अपने Sysmex MEX समारोह में, आप या तो संभाल होना एक कच्चे ढेर सूचक (आसान है, लेकिन बहुत ही सुरक्षित नहीं) हो सकता है, या आप में एक मानचित्रण बनाए रख सकते हैं हैंडल आईडी से वास्तविक ऑब्जेक्ट पॉइंटर्स तक सी/सी ++। इस समाधान के लिए थोड़ा अतिरिक्त काम की आवश्यकता है, लेकिन यह अधिक सुरक्षित है। इस तरह कोई व्यक्ति गलती से एक मनमानी संख्या को संभाल नहीं सकता है, जो एक खतरनाक सूचक के रूप में कार्य करता है। साथ ही, जब आप मैक्स फ़ंक्शन को अनलोड करते हैं तो सभी मेमोरी और संसाधनों को रिलीज़ करने के लिए ऑन क्लीनन फ़ंक्शन का उपयोग करने जैसे फैनसीयर फ़ंक्शन कर सकते हैं (उदा। इसलिए जब आप मैक्स फ़ंक्शन को पुन: संकलित करते हैं तो आपको मैटलैब को पुनरारंभ करने की आवश्यकता नहीं होती है)।

यदि आप मैटलैब कक्षा के पीछे हैंडल पसंद करते हैं और छुपाते हैं तो आप थोड़ा और आगे जा सकते हैं। यदि आप रुचि रखते हैं तो दस्तावेज़ों में मैटलैब के लिए ओओ सुविधाओं पर पढ़ें। यदि आप हाल के संस्करण का उपयोग कर रहे हैं, तो आप अपने क्लीनर हैंडल ऑब्जेक्ट्स का लाभ उठा सकते हैं।

+1

धन्यवाद श्री फूज़। मैंने हैंडल (सीधे पॉइंटर के रूप में) के साथ कार्यान्वित किया है और ऐसा लगता है कि यह काम कर रहा है। यह मेरे लिए थोड़ा आश्चर्यजनक है कि ढेर में आवंटित वर्ग वस्तु, मैक्स फ़ंक्शन लौटने पर हटाई नहीं जाती है। क्या यह एक सामान्य व्यवहार है जिसे मैं विंडोज (एक्सपी, विस्टा और 7) पर भरोसा कर सकता हूं? बहुत बहुत धन्यवाद। – Paul

+1

यदि आप मैटलैब के आवंटक का उपयोग करके ऑब्जेक्ट आवंटित करते हैं, तो वे मेक्सिको फ़ंक्शन से लौटने पर स्वचालित रूप से हटा दिए जाते हैं। यदि आप मॉलोक या नए का उपयोग करते हैं, तो मैटलैब उनके बारे में नहीं जानता है और इस प्रकार इसे आवंटित नहीं किया जाता है। –

3

वैकल्पिक रूप से, आप एमएक्स का उपयोग न करने से दूर हो सकते हैं। मैटलैब (विंडोज़ पर) में आप loadlibrary के साथ किसी जेनेरिक डीएल लोड कर सकते हैं और callib के साथ अपने किसी भी फ़ंक्शन को कॉल कर सकते हैं। यह शायद ऑपरेटिंग सिस्टम में पोर्टेबल नहीं है, हालांकि।

+0

यह भी एक अच्छा संकेत है। मैं मैक्स इंटरफेस का उपयोग करना पसंद करूंगा क्योंकि यह MATLAB का विस्तार करने का आधिकारिक तरीका है और मैं MATLAB के साथ कसकर एकीकृत करने की उम्मीद कर रहा हूं। बहुत बहुत धन्यवाद। – Paul

+0

यह ऐसा करने का एक समर्थित तरीका प्रतीत होता है। कार्यों को यहां दस्तावेज किया गया है: http://www.mathworks.com/help/matlab/using-c-shared-library-functions-in-matlab-.html उनका उपयोग करने का एक उदाहरण यहां है: https: // github .com/smitec/rustlab/ब्लॉब/d239e23a57c6c53dffd1b11c3e0e4fc193a3a0f7/src/test.m –

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