掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
動的配列の件 (ID:150317)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
別のスレッドでMr.XRAYさんに コメント頂けていたのにすみませんでした。 ここに引き継がせて頂きました。 動的配列は各行が独立した一次元の配列の集合という事の例示と受け止めています。 Mr.XRAYさんのサンプルに習い、試しに、次の様にFArrayの要素を代入してみました。 k := 1 ; for j := 0 to M - 1 do for i := 0 to N - 1 do begin FArray[ i, j ] := k ; inc( k ); end; 但し、M=3、N=4としています。 これをサンプル通りにLStreamへ書き込みました。 このLStreamからシーケンシャルに読みだした場合と、配列で読みだした場合とを比べてみよう思いましたが、配列でのアクセスでうまくゆきません。 先ず、LStreeamへFArrayを書き出した後では、ポインターの現在地が書き込み後の位置のままなので、Seekで先頭に戻す必要があると思います。 しかし、Seek( 0, TSeekOrigin.soBeginning )では何故か正しく要素にアクセスできません。 Seek( -cnt * N, soTSeekOrigin.soCurrent)とすると各要素にシーケンシャルにはアクセス出来ました。 ただ、配列として(行・列で)アクセスする場合、やはり先頭からのオフセットで考慮するので、soBeginningを使う方が良いと考えられますが、正しく要素にアクセスできていません。 シーケンシャルに配列要素へアクセスした場合の結果は、 buf1[0] 1 buf1[1] 5 buf1[2] 9 buf1[3] 2 buf1[4] 6 buf1[5] 10 buf1[6] 3 buf1[7] 7 buf1[8] 11 buf1[9] 4 buf1[10] 8 buf1[11] 12 となりますが、 配列として、アクセスした場合では、いずれも"1.7765824089018e-307"の様な値になっています。 試用したコードは以下の通り: 追加の変数 buf1 : Array of Double; cnt : Word; buf2 : Array of Array of Double; 主なコード M := 3 ; N := 4 ; SetLength(FArray, N, M); SetLength( buf1, N * M ); SetLength( buf2, N, M ); k := 1 ; for j := 0 to M - 1 do for i := 0 to N - 1 do begin FArray[ i, j ] := k ; inc( k ); end; LStream := TMemoryStream.Create; try LStream.WriteData(N); LStream.WriteData(M); for LRowIdx := 0 to N - 1 do begin cnt := LStream.Write(FArray[LRowIdx][0], M * SizeOf(Double)); end; //シーケンシャルにアクセス LStream.Seek( -cnt * N, TSeekOrigin.soCurrent ); for k := 0 to N * M - 1 do LStream.Read( buf1[ k ], SizeOf( Double )); //配列として行・列でアクセス i := 1 ; j := 2 ; LStream.Seek( Sizeof( Double ) * i + M * j, TSeekOrigin.soBeginning ); LStream.Read( buf2[ i, j ], Sizeof( Double )); i := 3 ; j := 0 ; LStream.Seek( Sizeof( Double ) * i + M * j, TSeekOrigin.soBeginning ); LStream.Read( buf2[ i, j ], Sizeof( Double )); i := 0 ; j := 1 ; LStream.Seek( Sizeof( Double ) * i + M * j, TSeekOrigin.soBeginning ); LStream.Read( buf2[ i, j ], Sizeof( Double )); i := 2 ; j := 1 ; LStream.Seek( Sizeof( Double ) * i + M * j, TSeekOrigin.soBeginning ); LStream.Read( buf2[ i, j ], Sizeof( Double )); です。 配列として正しくアクセスするにはどの様にするにでしょう?
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.