ポインタと構造体配列の相互変換

C言語あたりだと、ポインタ≒配列なんで、

char *a;

a = new char[256];
a[0] = 'a';
a[1] = 'b';


とか、ポインタ配列の書式でアクセスするの
わりと、簡単にできますが

Delphiは難しい
構造体が絡むと一段と難しい

とりあえず、こんな感じ
TBitmap.ScanLineプロパティを構造体でアクセスしたい時の例


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;

[/delphi]

こんな感じ。

配列型とポインタ型と定義するとこ

TPixel24Array = array[0..65535] of TPixel24;
PPixel24Array = ^TPixel24Array;



TPixel24Array = array of TPixel24; //動的配列にて定義
PPixel24Array = ^TPixel24Array;

などと動的配列として、定義しちゃうと、アドレス違反で落ちます
これにハマってた

なお

TPixel24Array = array[0..65535] of TPixel24;

は、型として定義されるだけで、実際にメモリを確保するわけではないんで、ご安心を



ただし

var
  aryValue : TPixel24Array ;

なんて、やっちゃうとメモリ確保に行きます


これ、探し出すのに2時間かかった(汗
忘れないように書いておきます…

関連記事