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

動態陣列使用上的問題

缺席
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-20 09:44:24 IP:211.76.xxx.xxx 未訂閱
 
procedure TForm1.Button1Click(Sender: TObject);
var
  i, j, W:Integer;
  bmp1, tmpbmp: TBitmap;
  Jpeg1: TJpegImage;
  t: DWord;
  ScOrg, ScDest: array of PIntegerArray;
begin
  //t := GetTickCount;
  Jpeg1 :=TJpegImage.Create;
  bmp1 := TBitmap.Create;
  tmpbmp:= TBitmap.Create;
  try
    Jpeg1.LoadFromFile('c:\test.jpg');
    DeleteFile('c:\test.jpg');
    bmp1.Assign(Jpeg1);
    bmp1.PixelFormat := pf32bit;
    tmpbmp.Assign(bmp1);
    W := bmp1.Width;
    bmp1.Width := bmp1.Height;
    bmp1.Height := W;
    Dec(W);
    SetLength(ScDest, bmp1.Height);
    SetLength(ScOrg, tmpbmp.Height);
    for i:=0 to bmp1.Height-1 do ScDest[i] := bmp1.ScanLine[i];
    for i:=0 to tmpbmp.Height-1 do ScOrg[i] := tmpbmp.ScanLine[i];
    for i:=0 to bmp1.Height-1 do
      for j:=0 to bmp1.Width-1 do
        ScDest[W-i][j] := ScOrg[j][i];
    Image1.Picture.Bitmap := bmp1;
    Jpeg1.Assign(bmp1);
    Jpeg1.SaveToFile('c:\test.jpg');
    //ShowMessageFmt('%d', [GetTickCount - t]);
  finally
    tmpbmp.Free;
    bmp1.Free;
    Jpeg1.Free;
  end;
end;
這是一段從站內所看到的程式碼。有一點我一直看不懂,煩各位先進幫我解惑,謝謝。 當中的 ScOrg, ScDest: array of PIntegerArray;是宣告為一維的動態陣列; 而在 SetLength(ScDest, bmp1.Height);SetLength(ScOrg, tmpbmp.Height);也分別給定了陣列的大小值。 而 ScDest[W-i][j] := ScOrg[j][i]; 這一行的寫法不是二維陣列的寫法嗎? 既然宣告的是一維陣列,為什麼卻可以如此的寫法?我試著執行編譯卻沒有發生錯誤,為什麼呢? 發表人 - adonis 於 2004/02/20 09:46:28
------
我也在努力學習中,若有錯謬請見諒。
babyfish4
一般會員


發表:2
回覆:40
積分:18
註冊:2003-08-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-20 09:58:33 IP:61.229.xxx.xxx 未訂閱
您好 ScOrg, ScDest: array of PIntegerArray; PInterArray感覺起來就像是已宣告成Array的型態 所以 array of PInterArray:就會有可能不是一維陣列了
引言:
 
procedure TForm1.Button1Click(Sender: TObject);
var
  i, j, W:Integer;
  bmp1, tmpbmp: TBitmap;
  Jpeg1: TJpegImage;
  t: DWord;
  ScOrg, ScDest: array of PIntegerArray;
begin
  //t := GetTickCount;
  Jpeg1 :=TJpegImage.Create;
  bmp1 := TBitmap.Create;
  tmpbmp:= TBitmap.Create;
  try
    Jpeg1.LoadFromFile('c:\test.jpg');
    DeleteFile('c:\test.jpg');
    bmp1.Assign(Jpeg1);
    bmp1.PixelFormat := pf32bit;
    tmpbmp.Assign(bmp1);
    W := bmp1.Width;
    bmp1.Width := bmp1.Height;
    bmp1.Height := W;
    Dec(W);
    SetLength(ScDest, bmp1.Height);
    SetLength(ScOrg, tmpbmp.Height);
    for i:=0 to bmp1.Height-1 do ScDest[i] := bmp1.ScanLine[i];
    for i:=0 to tmpbmp.Height-1 do ScOrg[i] := tmpbmp.ScanLine[i];
    for i:=0 to bmp1.Height-1 do
      for j:=0 to bmp1.Width-1 do
        ScDest[W-i][j] := ScOrg[j][i];
    Image1.Picture.Bitmap := bmp1;
    Jpeg1.Assign(bmp1);
    Jpeg1.SaveToFile('c:\test.jpg');
    //ShowMessageFmt('%d', [GetTickCount - t]);
  finally
    tmpbmp.Free;
    bmp1.Free;
    Jpeg1.Free;
  end;
end;
這是一段從站內所看到的程式碼。有一點我一直看不懂,煩各位先進幫我解惑,謝謝。 當中的 ScOrg, ScDest: array of PIntegerArray;是宣告為一維的動態陣列; 而在 SetLength(ScDest, bmp1.Height);SetLength(ScOrg, tmpbmp.Height);也分別給定了陣列的大小值。 而 ScDest[W-i][j] := ScOrg[j][i]; 這一行的寫法不是二維陣列的寫法嗎? 既然宣告的是一維陣列,為什麼卻可以如此的寫法?我試著執行編譯卻沒有發生錯誤,為什麼呢? 發表人 - adonis 於 2004/02/20 09:46:28
babyfish4
一般會員


發表:2
回覆:40
積分:18
註冊:2003-08-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-02-20 09:59:51 IP:61.229.xxx.xxx 未訂閱
您好 ScOrg, ScDest: array of PIntegerArray; PIntegerArray感覺起來就像是已宣告成Array的型態 所以 array of PIntegerArray:就會有可能不是一維陣列了
引言:
 
procedure TForm1.Button1Click(Sender: TObject);
var
  i, j, W:Integer;
  bmp1, tmpbmp: TBitmap;
  Jpeg1: TJpegImage;
  t: DWord;
  ScOrg, ScDest: array of PIntegerArray;
begin
  //t := GetTickCount;
  Jpeg1 :=TJpegImage.Create;
  bmp1 := TBitmap.Create;
  tmpbmp:= TBitmap.Create;
  try
    Jpeg1.LoadFromFile('c:\test.jpg');
    DeleteFile('c:\test.jpg');
    bmp1.Assign(Jpeg1);
    bmp1.PixelFormat := pf32bit;
    tmpbmp.Assign(bmp1);
    W := bmp1.Width;
    bmp1.Width := bmp1.Height;
    bmp1.Height := W;
    Dec(W);
    SetLength(ScDest, bmp1.Height);
    SetLength(ScOrg, tmpbmp.Height);
    for i:=0 to bmp1.Height-1 do ScDest[i] := bmp1.ScanLine[i];
    for i:=0 to tmpbmp.Height-1 do ScOrg[i] := tmpbmp.ScanLine[i];
    for i:=0 to bmp1.Height-1 do
      for j:=0 to bmp1.Width-1 do
        ScDest[W-i][j] := ScOrg[j][i];
    Image1.Picture.Bitmap := bmp1;
    Jpeg1.Assign(bmp1);
    Jpeg1.SaveToFile('c:\test.jpg');
    //ShowMessageFmt('%d', [GetTickCount - t]);
  finally
    tmpbmp.Free;
    bmp1.Free;
    Jpeg1.Free;
  end;
end;
這是一段從站內所看到的程式碼。有一點我一直看不懂,煩各位先進幫我解惑,謝謝。 當中的 ScOrg, ScDest: array of PIntegerArray;是宣告為一維的動態陣列; 而在 SetLength(ScDest, bmp1.Height);SetLength(ScOrg, tmpbmp.Height);也分別給定了陣列的大小值。 而 ScDest[W-i][j] := ScOrg[j][i]; 這一行的寫法不是二維陣列的寫法嗎? 既然宣告的是一維陣列,為什麼卻可以如此的寫法?我試著執行編譯卻沒有發生錯誤,為什麼呢? 發表人 - adonis 於 2004/02/20 09:46:28
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-02-21 10:40:39 IP:61.62.xxx.xxx 未訂閱
如果說PInterArray感覺起來就像是已宣告成Array的型態所以 array of PInterArray:就會有可能不是一維陣列了,這樣說法我可以認同,但是果真如此,那麼為何這一行 ScDest[i] := bmp1.ScanLine[i]; 的寫法卻不是用二維陣列的寫法呢?    
引言: 您好 ScOrg, ScDest: array of PIntegerArray; PInterArray感覺起來就像是已宣告成Array的型態 所以 array of PInterArray:就會有可能不是一維陣列了
------
我也在努力學習中,若有錯謬請見諒。
kaida
中階會員


發表:4
回覆:35
積分:52
註冊:2003-03-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-02-21 11:06:39 IP:218.86.xxx.xxx 未訂閱
bmp1.ScanLine 也是二維陣列。 ScDest[i] := bmp1.ScanLine[i]; 的寫法就是二維陣列的寫法。
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-02-25 09:45:28 IP:211.76.xxx.xxx 未訂閱
kaida 若是二維陣列其寫法為何不是與--Test[i][j]有關而是寫成Test[i]?
------
我也在努力學習中,若有錯謬請見諒。
syntax
尊榮會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-02-25 14:17:51 IP:203.222.xxx.xxx 未訂閱
procedure TForm1.Button1Click(Sender: TObject);
var
  i, j, W:Integer;
  bmp1, tmpbmp: TBitmap;
  Jpeg1: TJpegImage;
  t: DWord;
  ScOrg, ScDest: array of PIntegerArray;
 宣告成一維的陣列 其型態是 Pointer 而 Pointer 指到的地方將會當成一個 Integer 陣列來看待
begin
  //t := GetTickCount;
  Jpeg1 :=TJpegImage.Create;
  bmp1 := TBitmap.Create;
  tmpbmp:= TBitmap.Create;
  try
    Jpeg1.LoadFromFile('c:\test.jpg');
    DeleteFile('c:\test.jpg');
    bmp1.Assign(Jpeg1);
    bmp1.PixelFormat := pf32bit;
    tmpbmp.Assign(bmp1);
    W := bmp1.Width;
    bmp1.Width := bmp1.Height;
    bmp1.Height := W;
    Dec(W);
    SetLength(ScDest, bmp1.Height);
    SetLength(ScOrg, tmpbmp.Height);
    for i:=0 to bmp1.Height-1 do ScDest[i] := bmp1.ScanLine[i];
    for i:=0 to tmpbmp.Height-1 do ScOrg[i] := tmpbmp.ScanLine[i];
 這裡就是使用該陣列的地方 
    for i:=0 to bmp1.Height-1 do
      for j:=0 to bmp1.Width-1 do
        ScDest[W-i][j] := ScOrg[j][i];
將該陣列的 pointer 只到的地方當成整數的陣列來存取,所以有第二個索引直i,但是要注意因為適用指標方式來處理,所以不會對i的範圍作檢查,i可以是任意數值,因此要小心不要去存取到 bmp 以外的範圍,以免改到不知道的記憶體空間,若是 ScOrg[0][i] i = bmp1.Width 1時,應該會等同於 ScOrg[0][1] 的位置,因為記憶體是視為線性的在處理 
    Image1.Picture.Bitmap := bmp1;
    Jpeg1.Assign(bmp1);
    Jpeg1.SaveToFile('c:\test.jpg');
    //ShowMessageFmt('%d', [GetTickCount - t]);
  finally
    tmpbmp.Free;
    bmp1.Free;
    Jpeg1.Free;
  end;
end;    
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-02-27 22:21:43 IP:61.62.xxx.xxx 未訂閱
syntax   
引言: 將該陣列的 pointer 只到的地方當成整數的陣列來存取,所以有第二個索 引直i,但是要注意因為適用指標方式來處理,所以不會對i的範圍作檢查,i可 以是任意數值,因此要小心不要去存取到 bmp 以外的範圍,以免改到不知道的 記憶體空間,若是 ScOrg[0][i] i = bmp1.Width 1時,應該會等同於 ScOrg[0][1] 的位置,因為記憶體是視為線性的在處理
對於[將該陣列的 pointer 只到的地方當成整數的陣列來存取]這句話我認同, 但緊接著[所以有第二個索引直i] 我就不明白了,再說既有第二個索引值i,有 該索引值為何不會對i的範圍作檢查?? 發表人 - adonis 於 2004/02/27 22:22:59
------
我也在努力學習中,若有錯謬請見諒。
系統時間:2024-05-03 0:33:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!