Вот где решения пока стоят:
- Как вы упомянули, функция 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):
Для этих более ранних версий вы можете использовать функцию ERROR длявыдает ошибку и функцию LASTERROR , чтобы зафиксировать ошибку и получить информацию о стеке:
try
error('phony:error','');
catch
s = lasterror;
callerStack = {s.stack.name};
end
MATLAB Версии 7.0.4 (R14SP2) и более ранние:
К сожалениюфункция LASTERROR начала возвращать информацию трассировки стека только в MATLAB версии 7.1 , поэтому нет версии вышеупомянутых решений, которую я мог бы предложить для более ранних версий MATLAB.