संपादित करें:
R2015b में, उत्पन्न स्टैंडअलोन पुस्तकालयों और निष्पादनयोग्य का पता लगाने और रिपोर्ट क्रम त्रुटियों ऐसे कर सकते हैं:As of Matlab 2015b, सांकेतिक शब्दों में बदलनेवाला अब रनटाइम त्रुटि एक विकल्प के रूप जाँच (मैटलैब रिलीज नोट्स से) है आउट-ऑफ-बाउंड सरणी इंडेक्सिंग के रूप में। पिछली रिलीज में, केवल जेनरेट किए गए एमएक्स का पता चला और रन-टाइम त्रुटियों की सूचना दी।
डिफ़ॉल्ट रूप से, मेक्स के लिए रन-टाइम त्रुटि पहचान सक्षम है। डिफ़ॉल्ट से, रन-टाइम त्रुटि पहचान स्टैंडअलोन लाइब्रेरी और निष्पादन योग्य के लिए अक्षम है।
स्टैंडअलोन पुस्तकालयों और निष्पादनयोग्य के लिए रन-टाइम त्रुटि का पता लगाने को सक्षम करने के लिए:
कमांड लाइन पर, कोड विन्यास संपत्ति RuntimeChecks
का उपयोग करें।
cfg = coder.config ('lib'); % या 'डीएल' या 'exe'
cfg.RuntimeChecks = true;
codegen -config cfg myfunction
MATLAB सांकेतिक शब्दों में बदलनेवाला एप्लिकेशन का उपयोग करना, परियोजना का निर्माण सेटिंग्स में, डिबगिंग टैब पर , उत्पन्न रन-टाइम त्रुटि जाँच बॉक्स की जांच का चयन करें।
जेनरेट किए गए लाइब्रेरीज़ और एक्जिक्यूटिव्स त्रुटि संदेश लिखने के लिए fprintf का उपयोग करते हैं और एप्लिकेशन को समाप्त करने के लिए निरस्त करते हैं। यदि fprintf और abort उपलब्ध नहीं हैं, तो आपको उन्हें प्रदान करना होगा। त्रुटि संदेश अंग्रेजी में हैं।
Run-Time Error Detection and Reporting in Standalone C/C++ Code और Generate Standalone Code That Detects and Reports Run-Time Errors देखें।
मूल जवाब: एक वर्ग डबल से subclassed घोषित जिसमें subsref विधि से बढ़ रहा यह करने के लिए एक अच्छा तरीका होगा अस्वीकृत करने के लिए ओवरलोड हो गया है के बारे में टिप्पणी में जवाब।
ऐसा करने का एक और आसान तरीका यह है कि पूरे कोड (प्रत्येक लूप पुनरावृत्ति या फ़ंक्शन के निचले भाग में) में assert
आदेशों को छिड़काव करें ताकि यह आवंटित किया जा सके कि आकार आवंटित आकार में वृद्धि नहीं हुई है।
उदाहरण के लिए, यदि आप का एक प्रारूप में कोड था:
x = zeros(a,1)
x(a+1) = 1
... lots of other operations
if coder.target('MATLAB')
assert(isequal(size(x), [a,1]), 'x has been indexed out of bounds')
end
यह आप यदि कोई मूल्य सौंपा गया है कि सरणी बढ़ाया दावे विफल डालते हैं जाएगा।
इसे थोड़ा सा बनाने के लिए, आप एक ऐसा फ़ंक्शन भी बना सकते हैं जो आपके द्वारा देखी जाने वाली सभी चरों को चेक करता है, फिर से coder.target
को इसके चारों ओर कथन को लपेटकर। फिर आप इसे अपने पूरे कोड में छिड़क सकते हैं।
यह डबल क्लास को अधिभारित करने के रूप में सुरुचिपूर्ण नहीं है, लेकिन दूसरी ओर यह संकलित कोड पर कोई ओवरहेड नहीं जोड़ता है। जब ओवररन होता है तो यह आपको त्रुटियों को बिल्कुल ठीक नहीं करेगा, लेकिन यह आपको विश्वास दिलाएगा कि कोड विभिन्न स्थितियों में अच्छी तरह से काम कर रहा है।
एक और तरीका है कि आप असाइनमेंट के बारे में अधिक भरोसा कर सकते हैं, यह ऐसी स्थितियों में असाइनमेंट पर जांच कर अपनी सीमाएं करना है जहां यह उपयुक्त हो। असाइनमेंट में मैंने देखा एक आम समस्या इस तरह कुछ जाती है। हमारे पास एक आवंटित सरणी है और एक वेक्टर असाइनमेंट के साथ किसी अन्य सरणी से डेटा में प्रतिलिपि बना रही है। उदाहरण के लिए, निम्नलिखित परिस्थिति पर विचार:
t = char(zeros(5,7)); % Allocate a 5 by 7 char array
tempstring = 'hello to anyone'; % Here's a string we want to put into it.
t(1, 1:numel(tempstring)) = tempstring; % A valid assignment in MATLAB
>> size(t)
ans =
5 15
उह ओह, वास्तव में क्या आप के बारे में में सवाल हुआ है चिंतित हैं: t
सरणी स्वचालित रूप से काम है, जो MATLAB में काम करता है के दौरान आकार दिया गया है, लेकिन सांकेतिक शब्दों में बदलनेवाला में बनाया गया कोड एक segfault या MEX त्रुटि का कारण बन जाएगा। (। लेकिन छोटा कर दिया) एक वैकल्पिक हम करने के लिए काम में बदलते हैं तो काम सुथरा रखने के लिए end
समारोह की शक्ति का उपयोग करने के लिए है:
t(1,1:min(end,numel(tempstring))) = tempstring(1:size(t, 2));
t
का आकार अपरिवर्तित रहेगा, लेकिन काम काट दिया जाएगा। end
का उपयोग असाइनमेंट के दौरान सीमाओं की जांच की अनुमति देता है। कुछ स्थितियों के लिए, यह समस्या को संभालने का एक अच्छा तरीका हो सकता है और आपको विश्वास दिलाएगा कि सीमाएं कभी पार नहीं की जाएंगी, लेकिन जाहिर है कि कुछ परिस्थितियों में यह बहुत अवांछनीय है (और आपको MATLAB में त्रुटि संदेश नहीं देगा।)
एक अन्य उपयोगी टूल MATLAB प्रदान करता है संपादक में ही है। यदि आप अपने कोड में %#codegen
टैग का उपयोग करते हैं, तो यह विभिन्न कोड जनरेटिंग समस्याओं को हाइलाइट करने के लिए संपादक के सिंटैक्स चेकर को सिग्नल करेगा, जिसमें वे स्थान शामिल हैं जहां आप स्पष्ट रूप से अनुक्रमण द्वारा सरणी के आकार को बढ़ा रहे हैं। यह हर स्थिति को पकड़ नहीं सकता है, लेकिन यह एक अच्छी मदद है।
एक आखिरी टिप्पणी। जैसा कि प्रश्न में बताया गया है, कोडर द्वारा उत्पन्न एक एमएक्स फ़ाइल आपको असाइनमेंट के समय "इंडेक्स आयाम से अधिक" त्रुटि प्रदान करेगी, और गहराई से बाहर निकल जाएगी और आपको त्रुटि की स्थिति की मूल पंक्ति भी बताएगी। कोडर से उत्पन्न सी सी लाइब्रेरी में ऐसा कोई अच्छा व्यवहार या सीमा जांच नहीं है और बिना किसी निदान के पूरी तरह से बाहर निकल जाएगा।इंटरमीडिएट उत्तर ठीक वही करना है जो आप कर रहे हैं, जो कोड को मेक्स के रूप में चलाने के लिए है। यह आपके प्रश्न के लिए बहुत उपयोगी नहीं है (जैसा कि आप कहते हैं, एमईएक्स का पुनर्निर्माण समय ले सकता है), लेकिन हमारे उन लोगों के लिए जो बाहरी सी कोड की ठंड, क्रूर दुनिया के लिए कोड करते हैं, एमएक्स चलाने के लिए मध्यवर्ती परीक्षण ये त्रुटियां एक lifesaver है।
नीचे की रेखा यह MATLAB और कोडर उत्पन्न सी कोड के बीच व्यवहार में भिन्नता है, और यह महत्वपूर्ण समस्याओं का स्रोत हो सकता है। अपने कोड में, मैं इस कारण से सरणी पहुंच और विकास के साथ बहुत सावधान हूं। यह एक ऐसा क्षेत्र है जहां मैं कोडर टूल में सुधार देखना चाहता हूं, लेकिन कोडर के लिए लक्षित MATLAB कोड लिखते समय बहुत सावधान रहने के तरीके हैं।
दिलचस्प सवाल। "_ अगर आप आउट-ऑफ-बाउंड इंडेक्स_ को असाइन करते हैं तो स्वचालित रूप से आकार बदलें" मैटलैब की एक आवश्यक विशेषता है। इस व्यवहार को रोकना मुश्किल लगता है –
क्या आप _single-dimension_, _single-index_ असाइनमेंट में रुचि रखते हैं? यही है, क्या आपके कोड में 'x = zeros (a, 1) x (ए + 1: ए +10) = 1;' कुछ शामिल हो सकता है? या 'x = शून्य (ए, बी) एक्स (ए + 1, बी) = 1;'? –
मैं लगभग यह संभव नहीं कहना चाहता हूं क्योंकि मुझे लगता है कि मैटलैब के कुछ मुख्य टूलबॉक्स इस कार्यक्षमता पर भरोसा करते हैं .... –