我正在为现有脚本开发GUI,希望在Base中有一些Struct值。GUI应将用户值传输到Base,然后启动脚本并立即关闭自身。这听起来很简单,而且这些值与转让人和evalin一起使用,但是我花了几天时间处理这个问题,如果脚本后来创建了它自己,我就会得到这样的消息:
试图将var_name添加到静态工作区。有关详细信息,请参阅MATLAB编程,对变量分配的限制。
有什么问题吗?GUI被关闭,脚本将不受限制地使用Base。这是如何做到的呢?脚本是不可触摸的(不是来自我的),它期望基本工作区中的变量,所以GUI应该将值传递到工作区,而不是其他任何东西。不需要静态工作区。工作区不受任何限制。简短:我想删除“静态工作区”中的“静态”
发布于 2014-10-10 14:47:58
MATLAB文件规定:
如果试图动态地向匿名函数、嵌套函数或包含嵌套函数的函数的工作区添加变量,MATLAB将发出错误。
因此,您的问题很可能是直接从GUI中某个按钮的匿名回调(没有细节我只能猜测)调用脚本造成的。如果是这样的话,那么将它包装到另一个函数中,这样您就可以将脚本创建的变量与anon函数工作区隔离开来。
设计包装器函数,将要传递给脚本的变量作为参数接受,这样脚本就有了它所需要的。另外,确保不要在包装器中嵌套函数,因为您会遇到同样的问题。
注释:与您预期的相反,函数调用的脚本不会在基本工作区中创建变量,而是在函数的工作区中创建变量。只有从另一个脚本调用时,它才会使用Base工作区来创建变量。
示例:假设脚本"his_script.m“要求变量invar1和invar2已经在其可访问的工作区中;脚本的输出(即创建的变量)是变量outvar3和outvar4
% his_script.m
outvar3 = invar1 + invar2;
outvar4 = invar1 - invar2;因为没有assignin和evalin,所以我们可以将其包装成一个函数my_wrapper.m
% my_wrapper.m
function [outvar3, outvar4] = my_wrapper(invar1, invar2)
% Pre-create the outputs if the script cannot promise with
% the hand on the Holy Book of Execution Paths that it will
% create all the output variables.
outvar3 = [];
outvar4 = [];
% Call the script
his_script;
end函数参数将作为脚本的输入,函数的返回值将是脚本的输出。
现在,您可以在按钮的匿名回调中使用调用包装器函数,例如:
% initialization function of your GUI
% ...
set(action_button_handle, 'Callback', action_button_callback);
% ...
% somewhere deep in your GUI code, nested function for
% manipulating the script
function action_button_callback(hObject, callbackdata)
[out1, out2] = my_wrapper(5,3);
display(out1);
display(out2);
end
% ...我希望现在的想法更清楚。请让我知道它是如何为你工作的。
进一步评论:脚本和函数的主要区别之一是脚本没有自己的工作区,而函数有。脚本使用调用它们的上下文的工作区。
这意味着您的目标“GUI应该将值传递到工作区,没有其他东西”是误导的,因为您不知道脚本的工作区在哪里,除非您首先调用它。
如果您真的希望GUI在Base工作区中编写,那么您可以这样做,但是您应该从控制台窗口手动调用脚本,因为控制台窗口的上下文是基本工作区。或者尝试使用evalin('base', 'script_name;');,但您需要进行测试(到目前为止,我抵制了使用这样的东西的诱惑--这正是因为很容易搞砸,而且我不想被诅咒。
https://stackoverflow.com/questions/26300121
复制相似问题