我试图在我的八度环境中使用名为optprop的matlab模块。似乎代码有一些兼容性问题。特别是当我试着打电话时
xyz_image = rgb2xyz(rgb_image)
我收到以下错误:
error: 'cwf' undefined near line 1809 column 15
error: called from
astm>getcwf at line 1809 column 4
astm at line 1843 column 5
makecwf>tryastm at line 74 column 5
makecwf at line 59 column 9
wpt at line 33 column 6
i_xyz2xyz at line 28 column 6
i_rgb2xyz at line 54 column 5
optproc at line 315 column 7
rgb2xyz at line 49 column 33
rgb2xyz_norm2 at line 10 column 12
导致错误的代码在astm.m文件中。该文件定义了函数:
function z=astm(op,varargin)
persistent cwf lam
%cwf initialization
%nested function
function z=getcwf(name, varargin)
%...
z=cwf; %here cwf is undefined
%...
%actual nested function call
z=getcwf(varargin{:});
%...
从我的观点来看,这里的一切都很好。嵌套函数应该看到cwf。即使我使用octave,它也应该支持所有内容,因为optprop包已经在2007年上次更新了。我还尝试了嵌套函数,下面的代码工作正常:
function nested_function_test()
disp('inside outer function');
local_variable = 'local string content';
function nested_function()
disp('inside nested function');
disp(local_variable);
end
disp('after nested function declaration');
nested_function();
end
我认为这些代码块之间没有任何区别。为什么cwf未定义?
更新:
以防万一。当前的解决方法对我有用:
function z=getcwf(name, varargin)
cwf = varargin{end - 1};
lam = varargin{end};
%...
varargin{end + 1} = cwf;
varargin{end + 1} = lam;
z=getcwf(varargin{:});
答案 0 :(得分:3)
这似乎是八度音中的明确错误。在你的MWE中,如果你使local_variable
持久化,那么将会复制错误的行为。即。
function nested_function_test()
disp('inside outer function');
persistent local_variable; % <-- change here, make local_variable persistent
local_variable = 'local string content';
function nested_function()
disp('inside nested function');
disp(local_variable); % <-- local_variable no longer visible
end
disp('after nested function declaration');
nested_function();
end
以上将在matlab中工作,并在八度音程中失败。
特别是在matlab中,在嵌套函数内部的调试会话期间,如果键入whos
,您将看到两个变量堆栈,一个(空)工作空间本地嵌套函数,另一个对应于外部函数,嵌套的内部函数可以访问,包含持久变量。
在八度音程中,在嵌套函数中键入whos
只会返回一个空的本地工作空间而不会返回任何其他内容。 (如果删除persistent
行,您会看到八度音阶似乎只是将外部局部变量导入本地工作空间,而不是同时访问内部和外部,所以它似乎八度音程有不同的方法来创建嵌套函数)。
我建议您将此文件作为octave bug tracker 1 中的正式错误提交。似乎开发人员可能将持久变量视为一种特殊情况,并忘记在嵌套函数的特定实现中考虑这种行为。大概是&#39; import&#39; step查看特定位置的变量,持久变量存储在别处并丢失?
1:啊,看来这个bug已经被报告并确认,但尚未修复:https://savannah.gnu.org/bugs/index.php?42126