سؤال

في 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 السابقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top