问题: (问题的完整描述如下)
db*
代码文件的位置(如果存在)? Matlab中有几个函数允许在调试/运行程序时进行流控制:dbstop
,dbcont
,dbstep
等...我试图找到一个{ {1}}函数可以跳过Matlab脚本中的下一行,db*
也许,但遗憾的是没有这样的内置功能,看起来这个feature似乎永远都不会实施(10年和计数)。
编辑使用示例:
以下脚本dbskip
可以调用函数myScript
,它根据输入的值决定是否跳过调用者脚本中的下一行,如下所示:
myFunc
修改
正如@Michael Smith建议的那样,实现这一目标的一种方法是编写一个程序,该程序将读取% myScript.m
x = 1;
myFunc(x);
x = 2;
x = 3;
% myFunc.m
function myFunc(u)
if u == 1
% skip next line in caller -- how to?
% ... do more stuff ...
else
% ... do other stuff ...
disp('Business as usual.')
end
% ... do even more stuff ...
end
并逐行执行它,跳过运行时指定的任何行。我相信这个解决方案是一个良好的开端;但是,在更复杂的情况下,函数调用中会有函数调用。因此,使用这种方法制作一个真正通用的解决方案,需要编写一个完整的Matlab代码解释器,它具有Matlab的所有功能以及我自己的一些要求。如果我可以使用Matlab的一些固有反射功能或者通过入侵调试系统,我想避免这种情况。
与此同时,我试图找到myScript.m
的实施方式和位置。在调试任何dbstep
函数时,结果是以下错误:
db*
我能找到的唯一Error using <db*>
Debug commands only allowed when stopped in debug mode.
文件,包含没有任何代码的文档,因此我假设它是一个已编译的内置文件。
答案 0 :(得分:1)
好吧,这可能会有点混乱。我可以想到两种可能的方法来做到这一点。其中之一涉及编辑脚本以使每行都有一个if语句,查看可以在工作区中修改的局部变量。我打算把它叫出来。让我们看看下一个想法。
matlab有一个命令eval(EXPRESSION),它接受一个字符串并执行。这是想法。让我们使用以下内容创建一个脚本/函数进行调试:
FID = fopen('<filename here>');
no_skip = true;
line_no = 1;
executing_script = 1;
while(executing_script == 1)
line_no %Print the line number
line = fgetl(FID) %removed the ; so it will write the line
if(no_skip)
eval(line)
end
line_no = line_no + 1;
end
在断点处有一个断点,允许你在断点处修改no_skip的值,使脚本不执行下一行。
如果有帮助,请告诉我。
进一步查看它似乎你必须确保你的while循环被关闭...所以如果你在脚本中使用if / while,这可能会有点复杂......抱歉。< / p>