函數參數型態的問題.. |
答題得分者是:Justmade
|
builder78
初階會員 發表:36 回覆:100 積分:47 註冊:2003-02-03 發送簡訊給我 |
請問:
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 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
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 發送簡訊給我 |
有點懂了ㄅ~ 雖不是太懂~~做一下結論 不知是否正確...?
在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 發送簡訊給我 |
在 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 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
builder78
初階會員 發表:36 回覆:100 積分:47 註冊:2003-02-03 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
shaofu
高階會員 發表:5 回覆:136 積分:103 註冊:2003-01-07 發送簡訊給我 |
|
builder78
初階會員 發表:36 回覆:100 積分:47 註冊:2003-02-03 發送簡訊給我 |
謝謝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: 看來事情沒這麼簡單....還得依據型別與大小 來判斷 是傳值 還是傳址..
*********************************************************
有系統的知識才是力量
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |