指定Byte型態之陣列變數內容 |
答題得分者是:syntax
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
|
terrychen
尊榮會員 發表:90 回覆:794 積分:501 註冊:2003-05-01 發送簡訊給我 |
您好:
procedure TForm1.Button1Click(Sender:TObject); var i,x,y : Integer; Pal : array[0..255,0..2] of Byte; Pixels : array[0..255,0..19] of Byte; ...... begin for i:=0 to 255 do begin Pal[i,0]:=$FF; Pal[i,1]:=i; Pal[i,2]:=0; end; for y:=0 to 19 do begin for x:=0 to 255 do begin Pixels[x,y]:=x; end; end; ......~~應無所住而生其心~~ |
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
將'THIS IS A BOOK , THAT IS A PEN' 填入 Buffer1 中 ....
法一
var S:String; S := 'THIS IS A BOOK , THAT IS A PEN'; for i := 1 to Length(S) do Buffer1[i-1] := Byte(S[i]);法二 var S: String; S := 'THIS IS A BOOK , THAT IS A PEN'; Move(S[1],Buffer1[0],Length(S)*SizeOf(Byte)); |
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
又再試了一下,使用偷吃步可以解決變數使用的問題
但有正統又好用的方法嗎 ??
//---------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var Buffer1: array [0..100] of byte;
s:string;
begin
s:='THIS IS A BOOK , THAT IS A PEN';
move (s[1], Buffer1, Length(s));
ShowMessage(char(Buffer1[2]));
end;
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
引言: 將'THIS IS A BOOK , THAT IS A PEN' 填入 Buffer1 中 .... 法一感謝長官,但我覺得應有更快速簡潔的方法 ...var S:String; S := 'THIS IS A BOOK , THAT IS A PEN'; for i := 1 to Length(S) do Buffer1[i-1] := Byte(S[i]);法二var S: String; S := 'THIS IS A BOOK , THAT IS A PEN'; Move(S[1],Buffer1[0],Length(S)*SizeOf(Byte)); |
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
引言: 將'THIS IS A BOOK , THAT IS A PEN' 填入 Buffer1 中 .... 法一感謝長官,但我覺得應有更快捷的方法(不使用Move)var S:String; S := 'THIS IS A BOOK , THAT IS A PEN'; for i := 1 to Length(S) do Buffer1[i-1] := Byte(S[i]);法二var S: String; S := 'THIS IS A BOOK , THAT IS A PEN'; Move(S[1],Buffer1[0],Length(S)*SizeOf(Byte)); |
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
這可不是偷吃步 同時也沒有所謂的正統方式...就是 Move(S[1],Buffer1[0],Length(S)*SizeOf(Byte)); Move 必須知道你的記憶體位置
String 與 Dynamic array 因為都使用了兩次間接記憶體參考
所以不能直接 pass 給 move
S 的值代表一個紀錄著 S[1] 記憶體位置的值
S[1] 的值代表著一個指向 "T" 記憶體位置的值
Move 所要的是指向 "T" 記憶體位置的值,所以應該用 S[1]
同理 var ad: array of xxxx;
ad 代表的是一個指向紀錄著 ad 開頭記憶體位置的直之位置,即是 ad[0] 的記憶體位置值
而 ad[0] 則是紀錄著第一筆值的記憶體位置之變數代表
所以當用 Move 時應該 pass ad[0] 同時要注意若是使用的是 static array 則因位址使用了一次間接參考
所以可以直接 pass 給 Move
var
ad1: array[0...100] of xxx Move(ad1......) 因為 ad1 此時是紀錄著第一筆值的記憶體位置之變數代表,與 ad1[0] 相同
所以此時用那個都可以 但是為避免在大量程式時混淆不清,最好都用 ad[0] 因為永遠都對 不過若是起點不為 0 則要以起點為準
如
var ad2: array[20..30] of xxx
則
Move(ad2[20],......) or Move(ad2,.....)
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
引言: 感謝長官,但我覺得應有更快捷的方法(不使用Move)恩!是有不使用 Move 的方式,也不使用回圈 只是這樣在本質上就不一樣了,因為妳是要用另外一個記憶體空間來記錄 所以一定會牽涉到記憶體複製與搬移的問題,所以會用到回圈或是 Move 指令 同時 Move 應該是最快的記憶體複製指令了 但是若是妳不需要另一份記憶體位置來處理你的數值 那就可以不用到回圈或是 Move 指令 直接用 PChar or Pointer,但是這種方式在 .Net 下是 unsafe 的方法 所以就現在的計算機設計上若要使用第二份資料來處理,是沒有更好的方式了,同時也沒有所謂"更好的方式",因為"他"就是這樣設計的, 至於若是有更快捷的方式,也不過是一個別人幫妳完成的指令,而該指令內一定會用到 回圈或是 Move,只是妳看不見而已,並不代表沒有用到 Delphi 常常給人一個迷思 "是否有更快捷的方式?" 因為很多事 Delphi 幫我們作掉了!同時提供一個簡單的指令來代表!所以我們會產生 "Delphi" 真好用的想法,同時也會想寫簡潔的程式,但是簡潔的程式並不一定好,不一定快,只是程式碼簡短而已 所謂好的程式是 1.執行快速 2.程式碼的編譯結果小,即是佔用磁碟空間小 而簡潔的程式碼不一定等於 1. 與 2. 所以除非更改 PC 設計原理,否則是達不到妳的願望 "不使用回圈或是 Move " 在說若是有,為何 Delphi 自己本身不用 ? 而使用 Copy on Write 的方式? |
hahalin
版主 發表:295 回覆:1698 積分:823 註冊:2002-04-14 發送簡訊給我 |
|
conundrum
尊榮會員 發表:893 回覆:1272 積分:643 註冊:2004-01-06 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |