2015-04-20 57 views
2

假设我想调用一个函数两次,但我需要该函数记住第一次调用它时初始化的变量,以便可以在后续调用中更改执行。函数调用之间的变量持续存在

例如,如果我有这样的一段代码:

function random 
if exist('a','var') == 0 
    fprintf('hello\n'); 
    a = 1; 
else 
    disp('goodbye\n'); 
end 
end 

我怎么能拿MATLAB记住a等于1时,当我再次调用的代码?具体来说,我希望在我正在编写的程序中使用这个按钮来实现按钮回调函数。

+1

静态变量通常不是一个好主意,请考虑一个'class'? – user3528438

+0

'class'如何解决这个问题? –

回答

5

MATLAB支持关键字persistent,您可以按如下方式使用:

function toggleval_persist 
    % Set up the persistent variable and initialize it. 
    persistent a; 
    if isempty(a) 
     a = 0; 
    end  

    if (a == 0) 
     disp('hello'); 
     a = 1; 
    else 
     a = 0; 
     disp('goodbye'); 
    end 
end 

而且,我不建议使用持久性变量,用于切换按钮的状态。如果您使用的是MATLAB的UI系统,那么该按钮的状态通常在GUI的对象结构中可用。

+0

非常感谢! – Amit

+2

您还可以使用'setappdata' /'getappdata'在句柄上存储任意的用户定义状态,例如在按钮上。如果你想在每个小部件的基础上切换某些东西,而不是这个函数是否被* anything *之前调用过,那将是这样做的方法。 –

-1

您可以做什么(在GUI中使用此代码的光学器件中)设置一个标志,告诉您是否已初始化a并将其作为参数传递给函数random。例如,在GUI的句柄结构中存储标志(我们称之为a_flag)将允许您跟踪其值(例如实际存储在handles.a_flag中)。

所以,换句话说,你可以创建GUI的过程中设置的标志为0(或在其Opening_Fcn如果您使用的GUIDE)如下:

handles.a_flag = false; 

,然后叫random功能,你可以用拨打:random(handles.a_flag)

function random(a_flag) 

if ~a_flag 

    %// Update the flag 
    a_flag = true; 

    fprintf('hello\n'); 
    a = 1; 
else 
    fprintf('goodbye\n'); 
end 

end 

即使简单的办法是使用全局变量...但我喜欢这个主意好:)

EDIT

我的代码的重点是要证明我们可以使用GUI的句柄结构(如OP所要求的)来存储标志的值。由于可以从每个回调中访问结构,因此按钮将按照持久变量相同的方式更新它。

请试试这个代码,看看我的意思:

function TestGUI 

clear 
clc 

hFigure = figure('Position',[200 200 200 150]); 

handles.Disp_a_title = uicontrol('Style','text','String','a','Position',[20 100 60 20]); 
handles.Disp_aflag = uicontrol('Style','text','String','0','Position',[100 100 60 20]); 

handles.Button = uicontrol('Style','Push','Position',[50 50 60 20],'String','Update a','Callback',@(s,e) PushCb); 

a = 0; 
handles.a_flag = false; 

guidata(hFigure,handles) 

    function PushCb(~,~) 


     handles = guidata(hFigure); 

     fprintf('Flag is %i\n',handles.a_flag) 


     if handles.a_flag == false; 

      disp('hello\n'); 

      a = 1; 
      handles.a_flag = true; 

     else 
      disp('goodbye\n'); 
     end 

     guidata(hFigure,handles) 
    end 
end 

按两下按钮可以导致在命令窗口中下面的输出:

Flag is 0 
hello\n 
Flag is 1 
goodbye\n 

我的理解,从是预期行动OP正在寻找。

+0

Matlab变量是按值传递的。'a_flag = true'如何在调用者的上下文中更新标志状态? –

+0

请参阅我的编辑@AndrewJanke。我想说的是,该标志将存储在GUI的句柄结构中,因此可以在回调中访问该标志以跟踪该函数是否被调用。然而,当我重新阅读我根本不清楚的答案时。 –

+0

好的,现在有道理。 –

相关问题