動態陣列使用上的問題 |
缺席
|
adonis
高階會員 發表:140 回覆:258 積分:159 註冊:2002-04-15 發送簡訊給我 |
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 發送簡訊給我 |
您好
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 發送簡訊給我 |
您好
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 發送簡訊給我 |
如果說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 發送簡訊給我 |
|
adonis
高階會員 發表:140 回覆:258 積分:159 註冊:2002-04-15 發送簡訊給我 |
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
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 發送簡訊給我 |
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
------
我也在努力學習中,若有錯謬請見諒。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |