使用函数中的定义调​​用脚本

时间:2017-09-13 09:58:20

标签: matlab

我们有一个脚本,用于定义类似于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

编辑: 在我不知道的函数下面有一个嵌套函数。这解释了这个问题。

2 个答案:

答案 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;将脚本转换为函数并使用参数"传递变量,如文档所示。

编辑:我应该已经明确表示即使在嵌套函数中没有调用脚本也会发生错误。类似的情况是,在调试模式下(通过设置断点),如果尝试创建时态变量来测试某些内容,则会出错。