我有一个结构的细胞阵列,每个都包含一个人的个性。我将它放入此函数中,以便将它们列在所选名称的文本文件中。
function store( filename, persons )
fid = fopen(filename,'w');
for i=1:length(persons)
fprintf(fid, '%s',serialize_person(persons{i}));
end
现在这个功能正常工作:我输入一个< 1x3 cell>并拿出一个包含三名列出人员的文本文件。但是,我想从另一个人那里调用这个函数:
function process_store()
list=input('Write in the list of persons you want listed: ');
fprintf('\n')
newfile=input('Give the text file a name: ','s');
store(filename,list)
end
这里我输入< 1x3 cell>的名称。像以前一样,但是我收到错误消息“使用输入错误,未定义函数或变量'人'。” 为什么是这样?我没有使用与'store'中使用的完全相同的数据吗?
答案 0 :(得分:4)
问题是函数persons
中无法访问变量process_store
。在Matlab(以及大多数其他编程语言)中,函数无法访问其调用函数中定义的变量。为了更好地理解这一点,我建议您阅读levels of scope上的维基百科文章。
你基本上有两个选择:
使用声明persons
使process_store
成为工作空间和函数global persons
中的全局变量。我不推荐这个。
使用函数evalin
允许process_store
访问其父工作区中的变量。
persons
。
>> persons = {'John', 'Jack', 'Jill'};
现在说我们有以下功能
function example()
x = input('Give me a variable name: ');
disp(x)
end
如果我们尝试使用它会发生什么?
>> example()
Give me a variable name: persons
Error using input
Undefined function of variable 'persons'
Error in example (line 2)
x = input('Give me a variable name: ');
亲爱的,亲爱的。那是因为函数example
无法访问全局工作空间,而这是定义persons
的地方。但相反,我们可以存储我们想要访问的变量的名称,然后使用evalin
在全局工作区中查看其值,就像这样
function example()
s = input('Give me a variable name: ', 's');
x = evalin('caller', s);
disp(x)
end
现在,如果我们使用它:
>> example()
Give me a variable name: persons
'John' 'Jack' 'Jill'
它按预期工作!太好了!
几乎没有充分的理由使用像evalin
(或eval
或assignin
这样的函数或任何其他函数来解决执行字符串作为代码的问题。几乎可以肯定有一种更好的方式来做你想做的事情。但是不知道你想要做什么,很难给你更好的建议。
答案 1 :(得分:1)
在提示
Write in the list of persons you want listed:
如果你输入
persons
如果没有定义变量人员,那么你会得到完全错误信息。