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

指定Byte型態之陣列變數內容

答題得分者是:syntax
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-01-24 15:36:32 IP:211.21.xxx.xxx 未訂閱
var Buffer: array [0..100] of char; Buffer1: array [0..100] of byte; begin Buffer:='123'; //ok Buffer1:='123'; //錯誤 end; 請問 byte 的陣列變數該如何指定其值 ?? 發表人 - bruce0211 於 2004/01/24 17:17:17
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-01-24 16:22:41 IP:211.76.xxx.xxx 未訂閱
您好:  
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-01-24 16:40:26 IP:61.30.xxx.xxx 未訂閱
你好:
  你也可以利用記憶體操作函式處理。    var
  Buffer1: array [0..10] of byte;
  s : string;      move ('123', Buffer1, 3);
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-01-24 16:46:05 IP:211.21.xxx.xxx 未訂閱
長官 我的 Buffer1: array [0..100] of byte 內容並不規則 所以不能用迴圈來填值 雖然我知也一個BYTE 一個 BYTE 的填入 不過我想應該有更聰明的方法 可以將'THIS IS A BOOK , THAT IS A PEN' 填入 Buffer1 中 ....
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-01-24 17:05:57 IP:211.21.xxx.xxx 未訂閱
引言:
你好:
  你也可以利用記憶體操作函式處理。    var
  Buffer1: array [0..10] of byte;
  s : string;      move ('123', Buffer1, 3);
果然可以用,不過不能使用變數
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-01-24 17:06:27 IP:203.203.xxx.xxx 未訂閱
將'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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-01-24 17:11:41 IP:211.21.xxx.xxx 未訂閱
又再試了一下,使用偷吃步可以解決變數使用的問題 但有正統又好用的方法嗎 ?? //--------------------------------------------------------------------------- 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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-01-24 17:23:54 IP:211.21.xxx.xxx 未訂閱
引言: 將'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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-01-24 17:25:38 IP:211.21.xxx.xxx 未訂閱
引言: 將'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));    
感謝長官,但我覺得應有更快捷的方法(不使用Move)
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-01-24 17:26:21 IP:203.203.xxx.xxx 未訂閱
這可不是偷吃步 同時也沒有所謂的正統方式...就是 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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-01-24 17:49:00 IP:203.203.xxx.xxx 未訂閱
引言: 感謝長官,但我覺得應有更快捷的方法(不使用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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-01-24 18:04:12 IP:211.76.xxx.xxx 未訂閱
syntax大大這幾篇回應大概是ktop猴年開春最漂亮的答客問 論耐性,論專業,論文筆在在都是優秀不可多得的表現... 受教了,小第一鞠躬 再鞠躬 三鞠躬 有syntax大大如此,實在是程式設計領域中的一個典範啊!!! 發表人 - hahalin 於 2004/01/24 18:05:25
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-01-24 18:36:07 IP:61.221.xxx.xxx 未訂閱
長官 包歉 以下 與題目無關 syntax與ccchen還真正是 2人 優秀不可多得 精彩精彩
系統時間:2024-05-03 5:42:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!