مكدس الاتصال في Matlab المترجمة
-
21-09-2019 - |
سؤال
في MATLAB ، يمكن للمرء استخدام DBSTACK لاسترداد مكدس الاتصال في الوقت الحالي ، ومع ذلك ، فإن DBSTACK غير متوفر في الإصدارات المترجمة بذاتها من برامج MATLAB ، هل هناك بديل للحصول على مكدس المكالمات ، أو على الأقل الوظيفة التي تستدعي الوظيفة الحالية؟ أريد أن أكتب وظيفة منشأة تحتاج إلى معرفة من الذي تم استدعاؤه ، ولكن من الأفضل أن تكون مكدس المكالمات الكامل.
المحلول
إليك المكان الذي تقف فيه الحلول حتى الآن:
- كما ذكرت ، الوظيفة DBSTACK هو على قائمة الوظائف التي لا تدعمها برنامج التحويل البرمجي MATLAB, ، لذلك لا يمكن استخدامه.
- لقد ذكرت أيضًا في تعليق أنه على الرغم من الوظيفة evalin ليس في قائمة الوظائف غير المدعومة ، لا يزال المترجم الخاص بك لن يسمح لك باستخدامه. انتهى الأمر برفض بعض الحلول السابقة التي اقترحتها.
- الاضطرار إلى الحفاظ على تتبع المكدس الخاص بك عن طريق تمرير الحجج على طول سلسلة مكالمات الوظائف (أو ربما عن طريق تخزينها في أ متغير عالمي) ليس خيارًا مثاليًا بسبب التعقيد والعمل الإضافي الذي سيستغرقه الحفاظ عليه.
ومع ذلك ، لدي حل آخر ممكن أعتقد أنه "أنظف" حتى الآن: استخدام آليات معالجة الأخطاء للوصول إلى تتبع المكدس. سيختلف هذا بناءً على إصدار MATLAB الذي تستخدمه ...
إصدارات MATLAB 7.5 (R2007B) وأحدث:
إمكانيات جديدة معالجة الأخطاء في شكل فئة mexception كانوا تم تقديمه في الإصدار 7.5. يمكنك الحصول على معلومات حول تتبع المكدس من كائنات Mexception عن طريق إنشاء ورمي استثناء "وهمية" ، ثم اصطياده على الفور والوصول إلى stack
ميدان. إذا قمت بما يلي في وظيفة:
try
throw(MException('phony:error',''));
catch ME
callerStack = {ME.stack.name};
end
ثم صفيف الخلية callerStack
سيحتوي على أسماء جميع الوظائف في مكدس الاتصال ، مع اسم الوظيفة الحالي في العنصر الأول واسم المتصل الأعلى في العنصر الأخير.
إصدارات MATLAB 7.1 (R14SP3) إلى 7.4 (R2007A):
لهذه الإصدارات السابقة يمكنك استخدام خطأ وظيفة لرمي خطأ و Lasterror وظيفة لالتقاط الخطأ والحصول على معلومات المكدس:
try
error('phony:error','');
catch
s = lasterror;
callerStack = {s.stack.name};
end
إصدارات MATLAB 7.0.4 (R14SP2) وما قبل:
لسوء الحظ، ال Lasterror بدأت الوظيفة فقط في إرجاع معلومات تتبع المكدس في MATLAB الإصدار 7.1, ، لذلك لا يوجد إصدار من الحلول المذكورة أعلاه يمكنني التوصل إليه لإصدارات MATLAB السابقة.