全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:6112
推到 Plurk!
推到 Facebook!

function 參數有var與無var有什麼不同?

答題得分者是:channel
vivi666666
初階會員


發表:83
回覆:94
積分:35
註冊:2003-03-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-19 17:50:03 IP:203.69.xxx.xxx 未訂閱
function DoLogin(db:TDataBase; SecName: string; var UserName: string; var Password: string): boolean; 與 function DoLogin(db:TDataBase; SecName: string;UserName: string; Password: string): boolean; 有什麼不同?
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-19 18:23:23 IP:211.21.xxx.xxx 未訂閱
引言: function DoLogin(db:TDataBase; SecName: string; var UserName: string; var Password: string): boolean; 與 function DoLogin(db:TDataBase; SecName: string;UserName: string; Password: string): boolean; 有什麼不同?
有加Var的參數指傳址(call by address),沒有加Var的參數指傳值(call by value) 差異在那? [理論] call by address:是將位址傳至function運算。也就是呼叫者與被呼叫者擁有相同的一份位址,也就是一起擁有該值。被呼叫者將UserName的值改變後,其呼叫者的值也跟著一起改變。 call by value:是將值傳入function運算,也就是呼叫者與被呼叫者各自擁有一份值。以UserName為例,被呼叫者將UserName的值改變後,並不影嚮呼叫者的值。 [實作] 1 New Application 2 放一個Button 3 直接將程式寫在implementation底下即可:
procedure CallByAddress(var UserName: String);
begin
  UserName := 'B';
end;
procedure CallByValue(UserName: String);
begin
  UserName := 'B';
end;    procedure TForm1.Button1Click(Sender: TObject);
var
  aUserName: String;
begin
  aUserName := 'A';
  CallByAddress(aUserName);
  ShowMessage('傳入的值為:A' #13 'CallByAddress後值為' aUserName);
  aUserName := 'A';
  CallByValue(aUserName);
  ShowMessage('傳入的值為:A' #13 'CallByValue後的值為' aUserName);
end;
執行完後,應該看的出差異性吧! ~小弟淺見,參考看看~
------
~小弟淺見,參考看看~
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-19 22:05:28 IP:61.221.xxx.xxx 未訂閱
稍微修正一下 Channel 兄的解說:    利用 Var 代入參數的正確的說法應該為 Call By Reference ... 一般 procedure 或 function 的宣告若不指定, 會採用 Call By Value 的方式進行, 也就是傳入的其實是一份傳入資料的 copy (只有值傳入), 但使用 Call By Reference 的話, 則是會將該變數傳入, 在 procedure 或 function 中對該變數的異動就是對其本身異動!!    以下為節錄自 delphi help 中的說明:    Most parameters are either value parameters (the default) or variable (var) parameters. Value parameters are passed by value, while variable parameters are passed by reference. To see what this means, consider the following functions.
    function DoubleByValue(X: Integer): Integer;     // X is a value parameter    begin
  X := X * 2;
  Result := X;
end;    function DoubleByRef(var X: Integer): Integer;   // X is a variable parameter    begin
  X := X * 2;
  Result := X;
end;
These functions return the same result, but only the second oneDoubleByRefcan change the value of a variable passed to it. Suppose we call the functions like this:
    var      I, J, V, W: Integer;
begin
  I := 4;
  V := 4;
  J := DoubleByValue(I);   // J = 8, I = 4
  W := DoubleByRef(V);     // W = 8, V = 8
end;
After this code executes, the variable I, which was passed to DoubleByValue, has the same value we initially assigned to it. But the variable V, which was passed to DoubleByRef, has a different value. A value parameter acts like a local variable that gets initialized to the value passed in the procedure or function call. If you pass a variable as a value parameter, the procedure or function creates a copy of it; changes made to the copy have no effect on the original variable and are lost when program execution returns to the caller. A variable parameter, on the other hand, acts like a pointer rather than a copy. Changes made to the parameter within the body of a function or procedure persist after program execution returns to the caller and the parameter name itself has gone out of scope.
vivi666666
初階會員


發表:83
回覆:94
積分:35
註冊:2003-03-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-20 10:19:36 IP:203.69.xxx.xxx 未訂閱
引言:
引言: function DoLogin(db:TDataBase; SecName: string; var UserName: string; var Password: string): boolean; 與 function DoLogin(db:TDataBase; SecName: string;UserName: string; Password: string): boolean; 有什麼不同?
有加Var的參數指傳址(call by address),沒有加Var的參數指傳值(call by value) 差異在那? [理論] call by address:是將位址傳至function運算。也就是呼叫者與被呼叫者擁有相同的一份位址,也就是一起擁有該值。被呼叫者將UserName的值改變後,其呼叫者的值也跟著一起改變。 call by value:是將值傳入function運算,也就是呼叫者與被呼叫者各自擁有一份值。以UserName為例,被呼叫者將UserName的值改變後,並不影嚮呼叫者的值。 [實作] 1 New Application 2 放一個Button 3 直接將程式寫在implementation底下即可:
procedure CallByAddress(var UserName: String);
begin
  UserName := 'B';
end;
procedure CallByValue(UserName: String);
begin
  UserName := 'B';
end;    procedure TForm1.Button1Click(Sender: TObject);
var
  aUserName: String;
begin
  aUserName := 'A';
  CallByAddress(aUserName);
  ShowMessage('傳入的值為:A' #13 'CallByAddress後值為' aUserName);
  aUserName := 'A';
  CallByValue(aUserName);
  ShowMessage('傳入的值為:A' #13 'CallByValue後的值為' aUserName);
end;
執行完後,應該看的出差異性吧! ~小弟淺見,參考看看~
如何判斷用function或procedure.因用call by address的procedure同樣 可傳回值與function同
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-20 10:41:19 IP:211.21.xxx.xxx 未訂閱
引言: 如何判斷用function或procedure.因用call by address的procedure同樣 可傳回值與function同
call by Reference 的procedure不算是回傳值,只是他們的變數佔相同的位置。 只有在一個情況下call by Reference 的procedure與function的作用相同,就是您的function的回傳值就是傳入值,這樣才有可能call by Reference 的procedure與function的作用相同,但是大部份的function並不是都將傳入值當成回傳值。 所以一般而言在Delphi中: 有回傳值都用function 沒有回傳值都用procedure ~小弟淺見,參考看看~
------
~小弟淺見,參考看看~
vivi666666
初階會員


發表:83
回覆:94
積分:35
註冊:2003-03-05

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-20 10:57:18 IP:203.69.xxx.xxx 未訂閱
引言:
引言: 如何判斷用function或procedure.因用call by address的procedure同樣 可傳回值與function同
call by Reference 的procedure不算是回傳值,只是他們的變數佔相同的位置。 只有在一個情況下call by Reference 的procedure與function的作用相同,就是您的function的回傳值就是傳入值,這樣才有可能call by Reference 的procedure與function的作用相同,但是大部份的function並不是都將傳入值當成回傳值。 所以一般而言在Delphi中: 有回傳值都用function 沒有回傳值都用procedure ~小弟淺見,參考看看~
我把上例procedure改成function結果還是一樣 可否舉例(function並不是都將傳入值當成回傳值) ..thank!!!
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-20 11:19:09 IP:211.21.xxx.xxx 未訂閱
引言: 我把上例procedure改成function結果還是一樣 可否舉例(function並不是都將傳入值當成回傳值) ..thank!!!
當然一樣!要舉例,就舉您問是的問題: function DoLogin(db:TDataBase; SecName: string; var UserName: string; var Password: string): boolean; 傳入值是db、SecName、UserName、Password 回傳值是一個布林型態 今天您是要做DoLogin,傳入相關的值,當Login成功,您就回傳True,當Login失敗,您就回傳False。 ~小弟淺見,參考看看~
------
~小弟淺見,參考看看~
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-03-20 14:56:32 IP:211.76.xxx.xxx 未訂閱
引言: 我把上例procedure改成function結果還是一樣 可否舉例(function並不是都將傳入值當成回傳值) ..thank!!!
最簡單的幾個例子: 型態轉換函數: function StrToInt(const S: string): Integer; //傳入字串, 傳回整數 function IntToStr(Value: Integer): string; //傳入整數, 傳回字串 字串功能的函數 function Length(S): Integer; //傳入字串 S, 傳回長度 上面是系統提供的.. 給你參考看看...
系統時間:2024-04-29 15:22:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!