C言語あたりだと、ポインタ≒配列なんで、
C++:
- char *a;
- a = new char[256];
- a[0] = 'a';
- a[1] = 'b';
とか、ポインタを配列の書式でアクセスするの
わりと、簡単にできますが
Delphiは難しい
構造体が絡むと一段と難しい
とりあえず、こんな感じ
TBitmap.ScanLineプロパティを構造体でアクセスしたい時の例
DELPHI:
- type
- TPixel24 = packed record B, G, R: Byte; end; //24ビット画像構造体
- TPixel24Array = array[0..65535] of TPixel24; //<★★[0...65535]のあたり重要★★
- PPixel24Array = ^TPixel24Array;
- ...
- //グレースケール処理なぞ
- procedure TImageJobAnalyze.ToGrayScale24(const sou : TBitmap; des: TBitmap);
- var
- y : Integer;
- x : Integer;
- b : byte;
- sp : PPixel24Array;
- dp : PPixel24Array;
- begin
- for y := 0 to sou.Height - 1 do
- begin
- sp := sou.ScanLine[y];
- dp := des.ScanLine[y];
- for x := 0 to sou.Width -1 do
- begin
- b := Round( sp[x].R * 0.298912 +
- sp[x].G * 0.586611 +
- sp[x].B * 0.114478);
- dp[x].R := b;
- dp[x].G := b;
- dp[x].B := b;
- end;
- end;
- end;
こんな感じ。
配列型とポインタ型と定義するとこ
TPixel24Array = array[0..65535] of TPixel24;
PPixel24Array = ^TPixel24Array;
を
TPixel24Array = array of TPixel24; //動的配列にて定義
PPixel24Array = ^TPixel24Array;
などと動的配列として、定義しちゃうと、アドレス違反で落ちます
これにハマってた
なお
TPixel24Array = array[0..65535] of TPixel24;
は、型として定義されるだけで、実際にメモリを確保するわけではないんで、ご安心を
ただし
var
aryValue : TPixel24Array ;
なんて、やっちゃうとメモリ確保に行きます
これ、探し出すのに2時間かかった(汗
忘れないように書いておきます...



