掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
Single型のポインターの使い方 (ID:47636)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
yTakeです。 ポインターの使用方法についてご教授頂けるでしょうか? バイナリーファイルからSingle型の二次元は配列データを読み出す例を考えます。 procedure single_array_read( binary_f : String ; xx, yy : Word ); var fs ; TFileStream; mtx : Array of Array of Single; value : Single; cnt : Word; i, j : Word; begin fs := TFileStream.Create( binary_f, fmOpenRead ); SetLength( mtx, xx ); for i = 0 to xx - 1 do SetLength( mtx[ i ], yy ); for i = 0 to yy - 1 do begin for j = 0 to xx - 1 do begin cnt := fs.Read( value, 4 ); if cnt = 4 then begin mtx[ i ][ j ] := value; end; end; end; fs.Free(); end; と、しましたが、これでは配列の個数だけファイルアクセスが発生し、効率が悪い様に思いました。そこで、一行毎に(或いは、全部一括して)ファイルから読み出して、ポインターで配列要素にアクセスする事を考えてみました。 procedure single_array_read( binary_f : String ; xx, yy : Word ); var fs ; TFileStream; mtx : Array of Array of Single; pValue: PSingle; cnt : Word; size : Word; i, j : Word; begin fs := TFileStream.Create( binary_f, fmOpenRead ); SetLength( mtx, xx ); for i = 0 to xx - 1 do SetLength( mtx[ i ], yy ); size := 4 * xx ; GetMem( pValue, size ); for i = 0 to yy - 1 do begin cnt := fs.Read( pValue^, size ); for j = 0 to xx - 1 do begin mtx[ i ][ j ] := ( pValue + i )^; <- ① end; end; FreeMem( pValue ); fs.Free(); end; これではコンパイルを通りません。①で"E2015 この型には指定した演算子は使えません"とのエラーになります。 Single型のポインターは初めて試しました。Byte型のポインターは使った事があったので、使い方の問題と思います。 例えば①は、"mtx[ i ][ j ] := pValue^;"とすると、コンパイルは通りますが、当然ながら、参照先は先頭データに固定されたままで、読み出しになりません。 Byte型ポインターで試してみました。 procedure single_array_read( binary_f : String ; xx, yy : Word ); var fs ; TFileStream; mtx : Array of Array of Single; pValue: PByte; cnt : Word; size : Word; i, j : Word; b1, b2, b3, b4 : Byte; begin fs := TFileStream.Create( binary_f, fmOpenRead ); SetLength( mtx, xx ); for i = 0 to xx - 1 do SetLength( mtx[ i ], yy ); size := 4 * xx ; GetMem( pValue, size ); for i = 0 to yy - 1 do begin cnt := fs.Read( pValue^, size ); for j = 0 to xx - 1 do begin b1 := ( pValue + 4 * i )^; b2 := ( pValue + 4 * i + 1 )^; b3 := ( pValue + 4 * i + 2 )^; b4 := ( pValue + 4 * i + 3 )^; end; end; FreeMem( pValue ); fs.Free(); end; これで、Singke型の4ByteデータにByte毎にアクセスできていますが、Single型に戻す方法を見出せていません。 もし、4ByteデータがLong Word型であれば戻し方はわかるのですが。 やはり、ブロック状に読み出して、Singke型へのポインターでアクセス出来ればと思うのですが、思う様にコーディングできません。 Single型ポインターではなく、配列の要素数分だけSingke型変数で読み出すのが無難でしょうか? よろしくお願いします。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.