Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Запись/чтение массива


Автор: And_ 30.3.2009, 13:06
Добрый день!
Подскажите, пожалуйста, как реализовать хранение в файле содержимого многомерного массива?
Необходимо что бы при чтении такого файла устанавливалась размерность массива-приемника.
 smile 

Автор: Alexeis 30.3.2009, 13:23
перед записью элементов записать все 3 его размера, затем последовательно все элементы. 

Автор: And_ 30.3.2009, 13:30
У меня проблема с реализацией чтения/записи.
Хотелось бы посмотреть на пример кода, который это выполняет.

Автор: Alexeis 30.3.2009, 13:34
Цитата(And_ @  30.3.2009,  12:30 Найти цитируемый пост)
Хотелось бы посмотреть на пример кода, который это выполняет. 

  Это зависит от типа массива. Статические и динамические массивы пишутся по-разному.

Автор: And_ 30.3.2009, 13:44
Нужно записать терхмерный динамический массив типа double.
Пробую таким макаром:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type TD3Array = array of array of array of Double;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation



{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  MyArray: TD3Array;
  MyFileStream: TFileStream;
  i: Integer;
  j: Integer;
  k: Integer;
begin
  SetLength(MyArray,3,5,10);
  randomize;

  for i := 0 to Length(MyArray) - 1 do
    for j := 0 to Length(MyArray[i]) - 1 do
      for k := 0 to Length(MyArray[i][j]) - 1 do
        MyArray[i][j][k] := Random(10)/100;

  try
     MyFileStream := TFileStream.Create('c:\blabla.dat',fmOpenReadWrite);
   except
     MyFileStream := TFileStream.Create('c:\blabla.dat',fmCreate);
   end;

  MyFileStream.WriteBuffer(MyArray,SizeOf(TD3Array));
  MyFileStream.Free;


end;

procedure TForm1.Button2Click(Sender: TObject);
var
  MyArray: TD3Array;
  MyFileStream: TFileStream;
  str: string;

begin
 // SetLength(MyArray,3,5,10);
  try
    MyFileStream := TFileStream.Create('c:\blabla.dat', fmOpenRead);
   except
     ShowMessage('Ошибка!');
     Exit;
   end;
    str := 'Размер первого измерения: ' + IntToStr(Length(MyArray));
    ShowMessage(str);
    MyFileStream.ReadBuffer(MyArray, SizeOf(TD3Array));
    MyFileStream.Free;
    str := 'Размер первого измерения: ' + IntToStr(Length(MyArray));
    ShowMessage(str);
end;

end.




Автор: Alexeis 30.3.2009, 14:37
Начнем с того что
Код

MyFileStream.WriteBuffer(MyArray,SizeOf(TD3Array));

Запишет значение указателя, а SizeOf(TD3Array) 4 байта.

записывать за раз можно только одну размерность следующим образом.
Код

MyFileStream.WriteBuffer(MyArray[i, j][0], SizeOf(Double) * length(MyArray[i, j]);

Поскольку если более одного измерения, то такие массивы строятся как массивы указателей, и непрерывным блоком является только линейный массив.

Автор: Frees 30.3.2009, 15:01
Цитата(And_ @  30.3.2009,  15:30 Найти цитируемый пост)
Хотелось бы посмотреть на пример кода, который это выполняет.

это можно понимать как - "сделайте за меня мне лень думать!"

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)