線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1897
推到 Plurk!
推到 Facebook!

函數參數型態的問題..

答題得分者是:Justmade
builder78
初階會員


發表:36
回覆:100
積分:47
註冊:2003-02-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-16 13:19:02 IP:211.76.xxx.xxx 未訂閱
請問: function FileRead(Handle: Integer; var Buffer; Count: Integer): Integer; function FileWrite(Handle: Integer; const Buffer; Count: Integer): Integer; 這兩個函數的 Buffer參數皆沒有指定是啥型態.. 沒指定型態時 要看成甚麼型態呢? ********************************************************* 有系統的知識才是力量
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-16 14:02:50 IP:61.155.xxx.xxx 未訂閱
当声明VAR 、CONST、OUT参数时,可以省调参数的类型(数值参数必须指定)    无类型参数,可以接受任何类型的参数;但与每个类型都不兼容,对于无类型参数操作时,必须进行转换;    例如: FUNCTION ISOK(VAR AA,BB):BOOLEAN; BEGIN RESULT:=(TBYTES(AA)=TYBES(BB)); END;    风花雪月 e梦情缘
------
风花雪月 e梦情缘
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-16 14:21:57 IP:218.16.xxx.xxx 未訂閱
Delphi / Pascal 是出了名對形態嚴謹的 當然也有些時侯真的需要不預定形態,這時應使用 Variant 因使用 Variant 可用眾多的 Variant 函數作資料檢測和轉換。 那為甚麼還有這種不指定形態的參數呢,若使用時再去Type它,錯誤 Complie 時測不出來到使用時才出 Exception 而且這種形態不能像 Variant 般可檢測真正形態,在Delphi 裡實在沒實用的地方。 要了解為何會有這種形態,最好是看源碼看它做甚麼 Ctrl-Click FileRead, 會去到 SysUtils, 看見原來是呼叫 ReadFile, 再按 Ctrl-Click 去到 Windows 原來是呼叫 WinAPI。看看 WinAPI Help 那個參數是 LPVOID lpBuffer, // address of buffer that receives data 原來是一個 VOID 形態 (像 Variant 但不相容 Variant, 而且是 Pointer) , Delphi 沒有直接對應的形態,所以便用不定義的形態來處厘這種 window API 變數了。
builder78
初階會員


發表:36
回覆:100
積分:47
註冊:2003-02-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-16 15:06:00 IP:211.76.xxx.xxx 未訂閱
有點懂了ㄅ~ 雖不是太懂~~做一下結論 不知是否正確...? 在BCB中FileRead與FileWrite的Buffer參數皆是 void* 也就是一個位址~ 不過在Delphi中FileRead的Buffer是傳址而FileWrite的Buffer是傳值...而Buffer的型態可為任一型態 這裡有個FileWrite範例 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30558 procedure TForm1.WriteButtonClick(Sender: TObject); var d:string; resultat: integer; begin d:= WriteEdit.Text; {WriteEdit 只不過是畫面上的一個 Edit 元件 } resultat:= FileWrite (serFileTx, d[1], Length(d)); WriteLabel.Caption:= IntToStr (resultat)end; //.... 我不懂傳入d[1]有啥意義? d[1]不過是字串的第一個字而已... FileWrite 得到字串的第一個字與字串長度 難道就能知道 整個字串的值了ㄇ? ********************************************************* 有系統的知識才是力量 發表人 - builder78 於 2003/05/16 15:33:44 發表人 - builder78 於 2003/05/16 15:36:30
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-16 15:36:32 IP:218.16.xxx.xxx 未訂閱
在 Delphi 也是 FileRead 及 FileWrite 也是傳址的。 const 跟 var 一樣是傳址的宣告 不同的是,var 是傳址讓目的地可修改,const 是傳址給目的地去讀而不能修改。 因於 var 跟 const 是自動傳址的,所以在 Delphi 內可直接用實則參數不用轉做 Pointer。 不過由於 FileRead 會關系到給 WindowAPI 修改,所以一般都會另外做個 Buffer pointer 變數去給 API 寫進,而 FileWrite 就為是唯讀的不用擔心,所乆可直接將一般String變數傳進去。 雖說 Buffer 可以是任何形態,但傳過去 WinAPI 時若不是一個能放進資料的 pointer 還是會出錯的,一般來說 Buffer 在這裡會用 PChar 或 Array of Char。
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-16 15:44:48 IP:218.16.xxx.xxx 未訂閱
引言: procedure TForm1.WriteButtonClick(Sender: TObject); var d:string; resultat: integer; begin d:= WriteEdit.Text; {WriteEdit 只不過是畫面上的一個 Edit 元件 } resultat:= FileWrite (serFileTx, d[1], Length(d)); WriteLabel.Caption:= IntToStr (resultat)end; 我不懂傳入d[1]有啥意義? d[1]不過是字串的第一個字而已... FileWrite 得到字串的第一個字與字串長度 難道就能知道 整個字串的值了ㄇ?
由於 buffer 參數是傳址的,所以 d[1] 就是 d 這個 String 的的第一個字元的位置,其實值與 PChar(d) 相同,因為 String (Long String) 是 null terminated 的所以 FileWrite / WriteFile 會知道到那時結束。
builder78
初階會員


發表:36
回覆:100
積分:47
註冊:2003-02-03

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-16 15:46:53 IP:211.76.xxx.xxx 未訂閱
const 是傳址宣告??? 我的兩本書都說const 是屬於傳值...>< ********************************************************* 有系統的知識才是力量
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-05-16 15:50:24 IP:218.16.xxx.xxx 未訂閱
你可試試這個,原理是一樣的 :
procedure TForm1.Button6Click(Sender: TObject);
var
aa : String;
bb : PChar;
begin
  aa := 'abcde';
  bb := @aa[2]; // 傳址
  ShowMessage(aa[2]);// b
  showMessage(bb); // bcde
end;
builder78
初階會員


發表:36
回覆:100
積分:47
註冊:2003-02-03

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-05-16 15:56:28 IP:211.76.xxx.xxx 未訂閱
唉~~ 若const是傳址 那一切都可以說得通了... 怎書上都隨便寫呢..還是兩本.... 氣死我也... 感謝
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-05-16 16:04:33 IP:218.16.xxx.xxx 未訂閱
引言: const 是傳址宣告??? 我的兩本書都說const 是屬於傳值...><
呵呵,書本不一定是對的 我說的......當然更加不一定是對的 你先想想:
shaofu
高階會員


發表:5
回覆:136
積分:103
註冊:2003-01-07

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-05-16 17:03:28 IP:210.243.xxx.xxx 未訂閱
引言: const 是傳址宣告??? 我的兩本書都說const 是屬於傳值...>< ********************************************************* 有系統的知識才是力量
有興趣的話, 請查 Delphi Help->Object Pascal Reference->Program control->Parameters and function results->Parameter passing 裏面寫的很詳盡...
builder78
初階會員


發表:36
回覆:100
積分:47
註冊:2003-02-03

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-05-16 17:31:55 IP:211.76.xxx.xxx 未訂閱
謝謝shaofu 兄的建議~~ Variable (var) parameters are always passed by reference, as 32-bit pointers that point to the actual storage location.    Value and constant (const) parameters are passed by value or by reference, depending on the type and size of the parameter:    看來事情沒這麼簡單....還得依據型別與大小 來判斷 是傳值 還是傳址.. ********************************************************* 有系統的知識才是力量
系統時間:2024-05-03 12:23:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!