引數傳遞方式

2023-02-04 11:09:01 字數 3570 閱讀 2743

那好吧,我就來講講matlab 中gui引數的傳遞問題!引數傳遞共有6中方式。

1。運用gui本身的varain{}、varaout{}傳遞引數(注:這種方式僅適用與gui間傳遞資料,且只適合與主子結構,及從主gui呼叫子gui,然後關掉子gui,而不適合遞進結構,即一步一步實現的方式)

輸入引數傳遞:

比如子gui的名稱為subgui, 設想的引數輸入輸出為:[out1, out2] = subgui(in1, in2)

在subgui的m檔案中(由guide自動產生):

1.第一行的形式為:function varargout = subgui(varargin)

該行不用做任何修改;varargin 和 varargout 分別是乙個可變長度的cell陣列(matlab幫助檔案中有說明)。輸入引數in1和in2儲存在varargin中,輸出引數out1,out2包含在varargout中;

2.在subgui的openingfcn中,讀入引數,並用guidata儲存,即:

= varargin;

= varargin;

guidata(hobject, handles);

返回引數的設定:

1. 在gui子程式的openingfcn函式的結尾加上uiwait( figure1是subgui的tag;

2. subgui中控制程式結束(如"ok」和"cancel"按鈕)的callback末尾加上uiresume(不要將delete命令放在這些callback中;

3. 在子gui的outputfcn中設定要傳遞出去的引數,如 varargout = = 末尾新增 delete( 結束程式。

在gui的openfcn中,如果不加uiwait, 程式會直接執行到下面,執行outputfcn。也就是說程式一執行,返回值就確定了,再在其它部分對作更改也沒有效果了。

加上uiwait後,只有執行了uiresume後,才會繼續執行到outputfcn,在此之前使用者有充分的時間設定返回值。

通過以上設定以後,就可以通過 [out1, out2] = subgui(in1, in2) 的形式呼叫該子程式。

在乙個gui中呼叫另乙個gui時,主gui不需要特別的設定,同呼叫普通的函式一樣。在開啟子gui介面的同時,主程式還可以響應其它的控制項。不需要擔心子gui的返回值被傳錯了地方。

2. 運用global定義全域性變數傳遞引數(適用於gui內控制項間以及不同gui間)

這種方式恐怕是最簡單的方式,是很省心!但是但是,簡單的問題就在於有時你會很頭疼!因為在每乙個要到該全域性變數的地方,你都要添一句gloal x,還有就是如果你在乙個地方修改了

x的值,那麼所有x的值就都變了!有的時候恐怕會出現紊亂。另乙個更重要的問題在於,套用c++的一句話,全域性變數破壞了程式的封裝性!所以,全域性變數是能少用盡量少用。

3. 運用userdata傳遞引數(gui內)

直接通過物件的userdata屬性進行各個callback之間的資料訪問操作。首先必須將資料儲存到乙個特定的物件中,假設物件的控制代碼值為ui_handle,需要儲存的值為value,則輸入以下程式即可:

set('ui_handle','userdata',value);

此時,value資料就存在控制代碼值為ui_handle的物件內,在執行的過程中若要取回變數可以通過以下方式在任意callback中獲取該資料值 :

value=get(''ui_handle,'userdata');

雖然使用這種方法簡單 ,但是每個物件僅能訪問乙個變數值,因此當同一物件儲存兩次變數時 ,先前的變數值就會被覆蓋掉,因此都用userdata儲存簡單與單一的資料。如下面有兩個gui函式, myloadfn載入檔案,該檔案內儲存xydata變數,其值為m*2的繪圖矩陣,載入後將該變數值儲存到當前的視窗的userdata屬性中。另乙個myplotfcn函式則是用以獲取該userdata屬性中訪問的繪圖資料,然後繪圖。

**如下:

function myloadfcn

load mydata;

set(gcbf,'userdata',xydata)

function myplotfcn

xydata=get(gcbf,'userdata');

x=xydata(:,1);

y=xydata(:,2);

plot(x,y);

4.應用setappdata\getappdata與rmappdata函式(gui間和gui內,推薦使用)

使用上面三個函式最有彈性處理資料的傳送問題,與userdata的方式相類似,但是克服userdata的缺點,使乙個物件能訪問多個變數值。

(1)getappdata函式

value=getappdata(h,name)

(2)setappdata函式

setappdata(h,name,value)

(3)rmappdata

rmappdata(h,name)

首先在matlab命令視窗輸入magic(3)資料,因此當前的工作空間就儲存了magic(3)這組資料了,然後建立乙個按鈕來獲取並顯示magic(3)資料

>>a=magic(3);

>>setappdata(gcf,'a','a');%s**e

>>uicontrol(『string』,'顯示矩陣a','callback','a=getappdata(gcf,'a')');

當在主子gui內呼叫時,可以如下設定

fig1呼叫fig2時,使用fig2指令來開啟fig2,

在fig2的m檔案中,在**函式中用setappdata(fig1,'a',a)實現返回fig1,並將引數a傳遞給fig1

然後在fig1的使用a的地方新增a=getappdata(fig1,『a』)。

但這種方式的乙個問題就是沒呼叫一次,fig1的資料就得初始化一次,這是因為setappdata(fig1,'a',a)**現了fig1,呼叫一次setappdata就得執行一次fig1的緣故,解決方案就是把

setappdata(fig1,'a',a)改為setappdata(0,'a',a),這樣把a讀入matlab workspace,相當於乙個全域性變數了,但當然比直接用global定義全域性變數好!

5.結合handles和guidata函式(gui內,不推薦使用,經常出現問題,比如在handles中新增了變數物件y後可能就會擠掉handles另外乙個物件)

他的使用格式如下,如果你在pushbutton1中得到乙個變數x,相傳出去,那麼在pushbutton1的callback中,在得到x後新增如下**:

guidata(hobject,handles)(注意,一定是兩行連寫)

在pushbutton2中要用到x是,在其callback先新增 x= 即可得到x的值。

6. 運用s**e和load(importdata)傳遞引數(gui內和gui間)

將某變數x的值先存到磁碟,用的時候在呼叫。格式如下:s**e('*.

mat','x');用的時候就用load('*.mat'),但這樣只是把x讀到了matlab workspace,不會用顯示,你還要再去檢視這個變數名, 然後才能用,建議使用p=importdata('*.mat'),p是乙個結構體,可以隨意使用了。

當然,這種方式涉及到磁碟讀寫,速度當然會有影響的,一般情況不用,通常用在儲存以及匯入某個變數時!

函式引數的傳遞和值返回

前面我們說的都是無引數無返回值的函式,實際程式中,我們經常使用到帶引數有返回值的函式。一 函式引數傳遞 1.形式引數和實際引數 函式的呼叫值把一些表示式作為引數傳遞給函式。函式定義中的引數是形式引數,函式的呼叫者提供給函式的引數叫實際引數。在函式呼叫之前,實際引數的值將被拷貝到這些形式引數中。2.引...

C頁面引數傳遞的幾種方法總結

頁面之間傳遞引數的幾種方法薈萃第一種方法 通過url鏈結位址傳遞 send.aspx protected void button1 click object sender,eventargs e receive.aspx string username request.querystring use...

傳遞話題作文

以 傳遞 為題的中考佳作及點評 請以 傳遞 為題,寫一篇文章。要求 除詩歌 戲劇外,文體不限 要突出自己的體驗和感悟,不得抄襲 不少於 文中不能出現真實的校名和人名。傳遞陽光透過樹影,傳遞給心靈乙個春天。一人一龜一世界 春天繞滿了房屋。又是乙個明媚的午後,我蹲在抹了釉彩的瓷缸前唱歌給烏龜聽,吊蘭斜探...