最新の更新情報

 
このブログ「吟遊詩人の戯言」 の記事検索...

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

関連記事

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時間かかった(汗
忘れないように書いておきます…

 
 
 
 

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <img localsrc="" alt="">