Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
说我有一个在独立应用程序中使用的函数foo (即,用mcc -m编译成可执行文件),它具有重要的中间结果bar 。通常,在函数完成后,我不需要此中间结果,因此它不是返回值。但是,出于开发和调试目的,使中间结果可访问是很有用的,我可以通过使用assignin将中间结果放入某些调试工作区来实现。
现在的问题是, assignin是不可能在一个独立的编译和mcc将因错误而抱怨,如果有一个assignin代码。我想做的是仅在代码以交互方式运行时才包含assignin ,而不是在作为独立应用程序编译时才包含assignin 。另外,这将加快处理速度,因为无论如何我都不需要独立应用程序中的中间结果,因此可以通过在独立应用程序中不执行assignin来节省相同的时间和/或内存。在任何其他编程环境中,都可以在调试和发布模式下将其称为编译。 在伪Matlab中: function res = foo() bar = some complicated formula if ~standalone assignin('debug', 'foo_bar', bar) end res = some complicated formula involving bar 问题是我无法表达if ~standalone ,首先我不知道如何测试是否处于独立模式,但更关键的是,这需要某种代码构造,实际上会导致mcc完全忽略受保护的代码块并且不尝试对其进行编译,因为assignin不能以独立模式进行编译。 顺便说一句,这不仅对于中间结果有价值,而且对于额外的数据收集也很有价值,在额外的数据收集中,额外的数据将在受保护的块中计算并通过assignin导出。显然,这样的额外数据不应该在独立版本中计算,因为它没有任何作用。 在matlab中是否有任何这样的代码构造可以做到这一点,还是有更好的选择?到目前为止,我在开发过程中一直在处理注释的代码,取消注释和重新注释调试代码。 回答: 可以使用全局调试结构而不是使用assignin填充调试工作区,并将变量存储在同名字段中。所有有效的变量名称也是有效的结构字段名称。您可以使用全局变量来实现此功能,但最好使用函数内部的持久变量来实现。这将在已编译或未编译的代码中工作。 首先,具有定义调试模式的功能。 function out = isdebugging(value) %ISDEBUGGING Get or set the global debugging state persistent state if isempty(state) state = false; end switch nargin case 0 % Getter out = state; case 1 % Setter state = value; end 然后是用于存储调试值的函数,该函数仅在调试模式打开时才保留值。 function out = debugval(action, name, value) %DEBUGVAL Stash values for debugging persistent stash if isempty(stash) stash = struct; end % Short-circuit when not in debugging mode to save space if ~isdebugging() return; end switch action case 'get' out = stash.(name); case 'getall' out = stash; case 'set' stash.(name) = value; case 'list' out = fieldnames(stash); case 'remove' stash = rmfield(stash, name); case 'clear' stash = struct; end 默认情况下,调试是禁用的,因此它将在编译版本中短路并且不累加值。使用isdebugging(true)在交互式Matlab会话中手动启用它。这绕过了检测您是否正在运行部署的问题。这也意味着,如果您想测试已编译的代码以查看其在该上下文中的工作方式,则可以在已编译的应用程序中启用和使用它。您可以使用GUI按钮或环境变量来告诉编译的应用程序启用调试。 isdebugging()调用可以保护其他代码。但是使用isdebugging()来保护日志输出或值累加之外的任何东西,我都不会太过分。您不希望调试机制对代码的正确性产生副作用。 还可以看一下Java的log4j作为如何在应用程序中合并运行时可配置调试输出的模型。您可以将其原理应用于Matlab。 更多&回答... |
![]() |
![]() |