我们有一个脚本,用于定义类似于c中#define的名称的值。例如:
script.m:
ERR_NOERROR = 0;
ERR_FATAL = 1;
此脚本已存在,用于从文件读取数据时替换值。
现在我们有一个函数(或更多)进行一些分析,我们想在这个函数中使用相同的定义来避免幻数。但是当从函数调用脚本时,我们会收到错误。
Attempt to add "ERR_NOERROR" to a static workspace.
See MATLAB Programming, Restrictions on Assigning to Variables for details.
这对理解问题没有多大帮助。
问题是我们如何才能使这些定义在函数中可见/可用,每次都必须复制它。
示例:
function foo = bar(a)
run(script.m) %also tried running it without the run command
if a == ERR_NOERROR
foo = 5;
else
foo = 6;
end
end
编辑: 在我不知道的函数下面有一个嵌套函数。这解释了这个问题。
答案 0 :(得分:1)
这不是一个直接的答案,而是建议切换到另一种不会混合范围和工作空间的方法。
您可以创建一个仅包含常量属性的类,而不是在script
中定义常量。例如:error_codes.m
的代码:
classdef error_codes
% ---------------------------------------------------------------------
% Constant error code definition
% ---------------------------------------------------------------------
properties (Constant = true)
noerror = 0 ;
fatal = 1 ;
errorlvl2 = 2 ;
errorlvl3 = 3 ;
warning = -1 ;
% etc ...
end
end
我将这种风格用于许多不同类型的常量。为了整洁,我将它们全部分组到 Matlab包目录中(以+
字符开头的目录。
使用常量类属性的附加好处是在代码中间无法更改值的安全性(脚本中定义的变量很容易被粗心的用户覆盖)。
假设我的文件error_codes.m
放在一个文件夹中:
\...somepath...\+Constants\error_codes.m
当然文件夹+Constants
在MATLAB路径上,然后在示例中使用它,而不是调用脚本,只需初始化类的实例,然后在需要时使用常量值它们:
function foo = bar(a)
ERR = Constants.error_codes ;
if a == ERR.noerror
foo = 5;
else
foo = 6;
end
或它也适用于switch
声明:
switch a
case ERR.noerror
foo = 5 ;
case ERR.warning
foo = 42 ;
case ERR.fatal
foo = [] ;
end
答案 1 :(得分:0)
当您在函数中使用嵌套或匿名函数时,会发生这种范围错误。 The solution is well documented
对于您的情况,您可以避免嵌套函数,或者#34;将脚本转换为函数并使用参数"传递变量,如文档所示。
编辑:我应该已经明确表示即使在嵌套函数中没有调用脚本也会发生错误。类似的情况是,在调试模式下(通过设置断点),如果尝试创建时态变量来测试某些内容,则会出错。