调用该函数不起作用

时间:2013-11-22 10:02:28

标签: matlab function compiler-errors

我有一个结构的细胞阵列,每个都包含一个人的个性。我将它放入此函数中,以便将它们列在所选名称的文本文件中。

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'中使用的完全相同的数据吗?

2 个答案:

答案 0 :(得分:4)

问题是函数persons中无法访问变量process_store。在Matlab(以及大多数其他编程语言)中,函数无法访问其调用函数中定义的变量。为了更好地理解这一点,我建议您阅读levels of scope上的维基百科文章。

你基本上有两个选择:

  1. 使用声明persons使process_store成为工作空间和函数global persons中的全局变量。我不推荐这个。

  2. 使用函数evalin允许process_store访问其父工作区中的变量。

  3. 如果我是你,我会选择2。这有点棘手,所以让我解释它是如何工作的。让我们在全局工作区中创建一个变量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(或evalassignin这样的函数或任何其他函数来解决执行字符串作为代码的问题。几乎可以肯定有一种更好的方式来做你想做的事情。但是不知道你想要做什么,很难给你更好的建议。

答案 1 :(得分:1)

在提示

Write in the list of persons you want listed: 

如果你输入

persons

如果没有定义变量人员,那么你会得到完全错误信息。