動的配列をバイナリで書き込むには?

解決


PIE  2002-07-29 08:12:13  No: 1184

record型の動的配列をバイナリで書き込みたいのですが、どうしてもよく分かりません。
(RPGのマップデータ用です・・・。↓)
------------------------------
type
  MapRec=record
    PictureNo: Byte;
    ...
  end;

  Map:array of array of MapRec;
------------------------------

よろしくお願いします。


にしの  2002-07-29 18:12:48  No: 1185

TFileStreamクラスを使って書き出します。
動的に確保したメモリを書き出すだけだと思います。
もし、動的に確保したRecord型に、Stringなど動的に大きさが決まるものがあるのなら、ループで回しながら書き出します。


たかみちえ  URL  2002-07-30 05:52:17  No: 1186

試したことはないのでわかりませんけど、
  TMemoryStreamの配列ってだめでしょうか?

  でも、SetLengthのときに、中身がおかしくなったりするかも?
試したことはないのでわからないですけど、
配列の中身が消えるかも知れませんねぇ…。

  どうなんでしょうか?VBの配列サイズ変更関数は、
ごていねいに今の中身を消すかどうか聞いてくれますけど。

  試せばいいだけですけどね^^;


たかみちえ  URL  2002-07-30 05:55:05  No: 1187

ああ、その場合、recordからTFileとかに移すには、CopyMemoryとかが使えるかも。

  上のは忘れてください…。


hatena  2002-07-30 08:14:12  No: 1188

Map:array of array of MapRec;

となってますので、2次元配列ですね。
2次元配列は、1次配列がポインタ配列になるはずですので、
1行ずつサイズとデータを書き込みながら
ループで回さないといけないと思います。

読み込むときは、逆にサイズを読み込んで、
配列の長さを確保して、データを読み込むという
手順になります。

下記のようになります。

フィールドに String などのように動的に長さが決まる物が入っている場合は、
その部分は、さらにサイズとデータをそれぞれ書き込む必要があります。

var
  FileName: string;
  FFile:TFileStream;
  Len, i, j: Byte;
begin
  FileName := 'Test.dat';

//2次元配列の書き込み
  FFile := TFileStream.Create(FileName, fmCreate);
  try
    Len := Length(Map);            //1次配列の長さ
    FFile.Write(Len, SizeOf(Len)); //それを書き込む
    for i := 0 to Len - 1 do
    begin
      Len := Length(Map[i]);          //i行目の2次配列の長さ
      FFile.Write(Len, SizeOf(Len));  //それを書き込む
      FFile.Write(Map[i, 0], SizeOf(MapRec) * Len);  //i行目の2次配列のデータを書き込む
    end;
  finally
    FFile.Free;
  end;

//2次元配列の読み込み
  FFile := TFileStream.Create(FileName, fmOpenRead);
  try
    FFile.Read(Len, SizeOf(Len)); //1次配列の長さを読み込む
    SetLength(Map, Len);
    for i := 0 to Len - 1 do
    begin
      FFile.Read(Len, SizeOf(Len));//i行目の2次配列の長さを読み込む
      SetLength(Map[i], Len);
      FFile.Read(Map[i, 0], SizeOf(MapRec) * Len);//i行目の2次配列のデータを読み込む
    end;
  finally
    FFile.Free;
  end;

end;


PIE  2002-07-31 05:33:19  No: 1189

みなさん、有難うございました。
おかげで、解決できました。
心より感謝いたします。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加