2015-04-20 24 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

好的,現在有道理。 –

相關問題