问题:(问题的完整描述如下)
- 是否有人对如何欺骗Matlab跳过一行或几行代码有建议?(Mex/Java/重写一些内部MATLAB功能?)
- 有人知道
db*
代码文件的位置(如果存在)吗?
MATLAB中有几个功能可以在调试/运行程序时允许流控制:dbstop
,dbcont
,dbstep
等...我正在尝试找到一个db*
函数,该函数会跳过MATLAB脚本中的下一行,也许dbskip
,但可悲的是,没有这样的内置功能,而且似乎不会实现此功能(10年并计数)。
编辑使用的示例:
以下脚本myScript
可以调用一个函数myFunc
,该函数根据其输入的值来决定是否跳过呼叫者脚本中的下一行,例如:
% 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
编辑
正如@michael Smith所建议的那样,实现这一目标的一种方法是编写一个程序,该程序将读取myScript.m
并通过行跳过行以运行时指定的任何行执行行执行IT行。我相信这个解决方案是一个良好的开始。但是,在更复杂的情况下,功能调用中会有函数调用。因此,使用这种方法制作真正的通用解决方案,需要编写一个完整的MATLAB代码解释器,具有MATLAB具有的所有功能以及我自己的某些要求。如果我可以使用MATLAB固有的反射功能或黑客入侵调试系统,这是我想避免的。
与此同时,我撞到了另一堵墙,试图找到dbstep
的实现方式。调试任何db*
功能时,结果是以下错误:
Error using <db*>
Debug commands only allowed when stopped in debug mode.
我能找到的唯一dbstep.m
文件包含文档,而没有任何代码,因此我认为它是内置的。
好吧,这可能会有些混乱。我可以想到两种可能的方法来做到这一点。其中之一涉及编辑脚本以使每行具有IF语句查看可以在工作区中修改的本地变量。我要把这个叫出来。因此,让我们看看下一个想法。
matlab具有一个命令est(表达式),该命令(表达式)吸用字符串并执行。这是想法。让我们创建一个脚本/函数,用于调试以下内容:
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的值,使脚本不执行下一行。
让我知道这是否有帮助。
进一步查找后,似乎必须确保您的循环关闭...因此,如果您在脚本中使用/时使用,这可能会更加复杂...对不起。<<。/p>