最新の更新情報

2012年2月
« 1月    
 1234
567891011
12131415161718
19202122232425
26272829  

本ブログのURL

qrcode.png

雨雲の動き

お天気

 
 
吟遊詩人の戯言 内専用の記事検索...
 
 

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


キーワード(クリックで関連記事が読めます) →

関連記事



 
 

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

C++:
  1. char *a;
  2.  
  3. a = new char[256];
  4. a[0] = 'a';
  5. a[1] = 'b';


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

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

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

DELPHI:
  1. type
  2.    TPixel24 = packed record    B, G, R: Byte; end;      //24ビット画像構造体
  3.    TPixel24Array = array[0..65535] of TPixel24;       //<★★[0...65535]のあたり重要★★
  4.    PPixel24Array = ^TPixel24Array;
  5.  
  6. ...
  7.  
  8. //グレースケール処理なぞ
  9. procedure TImageJobAnalyze.ToGrayScale24(const sou : TBitmap; des: TBitmap);
  10. var
  11.     y : Integer;
  12.     x : Integer;
  13.     b : byte;
  14.     sp : PPixel24Array;
  15.     dp : PPixel24Array;
  16. begin
  17.     for y := 0 to sou.Height - 1 do
  18.      begin
  19.         sp := sou.ScanLine[y];
  20.         dp := des.ScanLine[y];
  21.         for x := 0 to sou.Width -1 do
  22.          begin
  23.             b := Round( sp[x].R * 0.298912 +
  24.                         sp[x].G * 0.586611 +
  25.                         sp[x].B * 0.114478);
  26.             dp[x].R := b;
  27.             dp[x].G := b;
  28.             dp[x].B := b;
  29.  
  30.          end;
  31.      end;
  32. 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時間かかった(汗
忘れないように書いておきます...

 
 
 
 

コメントを残す

  

  

  

You can use these HTML tags

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