Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сохранение и загрузка динамического массива [D7, WinXP]


Dr.Andrew ©   (2010-05-06 00:29:00) 

Добрый день!

Сохранение и загрузка динамического массива. Массив представляет собой пять матриц 24х24. Я делаю так:

Код:

type
 TExDynaMatrix = array of array of array of Integer;

private
   // Load & save
   procedure LoadDynArray(AFileName : WideString; DynArr : TExDynaMatrix); // загрузка
   procedure SaveDynArray(AFileName : WideString; DynArr : TExDynaMatrix); // сохранение

procedure TMainForm.LoadDynArray(AFileName : WideString; DynArr : TExDynaMatrix);
var
 // Counters
 i, j : Integer;
 // Read classes
 RStr : TFileStream;
 Reader : TReader;
 // Metrics
 ARow, ACol : Integer;
begin
 RStr := TFileStream.Create(AFileName+'.dat', fmOpenRead, fmShareExclusive);
 try
   Reader := TReader.Create(RStr, 8096);
   try
     ARow := Reader.ReadInteger;
     SetLength(DynArr, ARow);
     ACol := Reader.ReadInteger;
     for i := 0 to ARow-1 do
     begin
       SetLength(DynArr[i], ACol, ACol);
       for j := 0 to ACol-1 do
         Reader.Read(DynArr[i, j], Length(DynArr[i])*SizeOf(Integer));
     end;
   finally
     FreeAndNil(Reader);
   end;
 finally
   FreeAndNil(RStr);
 end;
 ProcessOutput;
end;

procedure TMainForm.SaveDynArray(AFileName : WideString; DynArr : TExDynaMatrix);
var
 // Counters
 i, j : Integer;
 // Read classes
 WStr : TFileStream;
 Writer : TWriter;
begin
 WStr := TFileStream.Create(AFileName+'.dat', fmCreate, fmShareExclusive);
 try
   Writer := TWriter.Create(WStr, 8096);
   try
     Writer.WriteInteger(Length(DynArr));
     for i := 0 to Length(DynArr)-1 do
     begin
       Writer.WriteInteger(Length(DynArr[i]));
       for j := 0 to Length(DynArr[i])-1 do
         Writer.Write(DynArr[i, j], Length(DynArr[i])*SizeOf(Integer));
     end;
   finally
     FreeAndNil(Writer);
   end;
 finally
   FreeAndNil(WStr);
 end;
end;

Код не работает, подскажите где в процедурах сохранения и загрузки ошибки.

Спасибо


Юрий Зотов   (2010-05-06 13:37:00) [1]

> привет из java

Проверка на двоичность. Сработала.
:o)


Palladin   (2010-05-06 09:28:00) [2]

да я про Юру, а не про тебя )


brother   (2010-05-06 09:27:00) [3]

> Да вы что все сговорились чтоль? ;)

нет)))))))))))


oxffff   (2010-05-06 09:23:00) [4]


> Palladin ©   (06.05.10 09:22) [11]
> скорее привет из java )


Да вы что все сговорились чтоль? ;)
Какая JAVA?


Palladin   (2010-05-06 09:22:00) [5]

скорее привет из java )


oxffff   (2010-05-06 09:21:00) [6]


> brother ©   (06.05.10 09:14) [9]
> > procedure FinalizeArray(var Arr: TArray);
> > var
> > Arr := nil;
> > end;
> >
> > ?
>
> правило хорошего тона?


Это ты о чем?
Зачем городить такой огород, если достаточно написать
Finalize(Arr) или  Arr := nil


brother   (2010-05-06 09:14:00) [7]

> procedure FinalizeArray(var Arr: TArray);
> var
> Arr := nil;
> end;
>
> ?

правило хорошего тона?


oxffff   (2010-05-06 09:05:00) [8]


> Юрий Зотов ©   (06.05.10 07:54) [7]


>
> procedure FinalizeArray(var Arr: TArray);
> var
>  i, j: integer;
> begin
>  for i := Low(Arr) to High(Arr) do
>  begin
>    for j := Low(Arr[i]) to High(Arr[i]) do
>      Finalize(Arr[i, j]);
>    Finalize(Arr[i])
>  end;
>  Finalize(Arr);
>  Arr := nil
> end;


procedure FinalizeArray(var Arr: TArray);
var
Arr := nil;
end;

?


Юрий Зотов   (2010-05-06 07:54:00) [9]

> Dr.Andrew

Все это совсем несложно, нужны просто аккуратность и внимательность.

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

type
 TArray = array of array of array of integer;

procedure FinalizeArray(var Arr: TArray);
var
 i, j: integer;
begin
 for i := Low(Arr) to High(Arr) do
 begin
   for j := Low(Arr[i]) to High(Arr[i]) do
     Finalize(Arr[i, j]);
   Finalize(Arr[i])
 end;
 Finalize(Arr);
 Arr := nil
end;

procedure InitArray(var Arr: TArray);
var
 i, j, k: integer;
begin
 FinalizeArray(Arr);
 SetLength(Arr, 5);
 for i := Low(Arr) to High(Arr) do
 begin
   SetLength(Arr[i], 24);
   for j := Low(Arr[i]) to High(Arr[i]) do
   begin
     SetLength(Arr[i, j], 24);
     for k := Low(Arr[i, j]) to High(Arr[i, j]) do
       Arr[i, j, k] := Random(10000)
   end
 end
end;

procedure WriteArrayToStream(const Arr: TArray; const Stream: TMemoryStream);
var
 Len, i, j, k: integer;
begin
 Stream.Clear;
 Len := Length(Arr);
 Stream.Write(Len, SizeOf(Len));
 for i := Low(Arr) to High(Arr) do
 begin
   Len := Length(Arr[i]);
   Stream.Write(Len, SizeOf(Len));
   for j := Low(Arr[i]) to High(Arr[i]) do
   begin
     Len := Length(Arr[i, j]);
     Stream.Write(Len, SizeOf(Len));
     for k := Low(Arr[i, j]) to High(Arr[i, j]) do
       Stream.Write(Arr[i, j, k], SizeOf(Arr[i, j, k]))
   end
 end
end;

procedure ReadArrayFromStream(var Arr: TArray; const Stream: TMemoryStream);
var
 Len, i, j, k: integer;
begin
 FinalizeArray(Arr);
 Stream.Position := 0;
 Stream.Read(Len, SizeOf(Len));
 SetLength(Arr, Len);
 for i := Low(Arr) to High(Arr) do
 begin
   Stream.Read(Len, SizeOf(Len));
   SetLength(Arr[i], Len);
   for j := Low(Arr[i]) to High(Arr[i]) do
   begin
     Stream.Read(Len, SizeOf(Len));
     SetLength(Arr[i, j], Len);
     for k := Low(Arr[i, j]) to High(Arr[i, j]) do
       Stream.Read(Arr[i, j, k], SizeOf(Arr[i, j, k]))
   end
 end
end;

function CompareArrays(const Arr1, Arr2: TArray): boolean;
var
 i, j, k: integer;
begin
 Result := False;
 if Length(Arr1) <> Length(Arr2) then
   Exit;
 for i := Low(Arr1) to High(Arr1) do
 begin
   if Length(Arr1[i]) <> Length(Arr2[i]) then
     Exit;
   for j := Low(Arr1[i]) to High(Arr1[i]) do
   begin
     if Length(Arr1[i, j]) <> Length(Arr2[i, j]) then
       Exit;
     for k := Low(Arr1[i, j]) to High(Arr1[i, j]) do
       if Arr1[i, j, k] <> Arr2[i, j, k] then
         Exit;
   end
 end;
 Result := True
end;

procedure TForm1.FormCreate(Sender: TObject);
var
 Arr1, Arr2: TArray;
 Stream: TMemoryStream;
begin
 InitArray(Arr1);
 try
   Stream := TMemoryStream.Create;
   try
     WriteArrayToStream(Arr1, Stream);
     ReadArrayFromStream(Arr2, Stream);
     try
       if CompareArrays(Arr1, Arr2) then
         Caption := 'OK'
       else
         Caption := 'Invalid programmer detected'
     finally
       FinalizeArray(Arr2)
     end
   finally
     Stream.Free
   end
 finally
   FinalizeArray(Arr1)
 end
end;

end.


Германн   (2010-05-06 02:10:00) [10]


> Dr.Andrew   (06.05.10 01:33) [2]
>
> Спасибо за ответ, нет не предлагаю работать отладчиком.

Именно предлагаешь.
"Код не работает" - должно подтверждаться документально и конкретно.


turbouser   (2010-05-06 02:02:00) [11]


> Dr.Andrew   (06.05.10 01:52) [4]


> Что значит

трехмерныймассив. а ты пишешь и читаешь как двумерный.


Dr.Andrew   (2010-05-06 01:52:00) [12]

Извините, не понял Вашего ответа. Что значит повтор моей строки - array of array of array of Integer; Да, это такая матрица. Спасибо за ответ.


turbouser   (2010-05-06 01:42:00) [13]

array of array of array of Integer;


Dr.Andrew   (2010-05-06 01:33:00) [14]

Спасибо за ответ, нет не предлагаю работать отладчиком. Просто прошу профессионального совета в чем ошибка. Еще раз спасибо за помощь, реальную помощь, Мастера.


Игорь Шевченко   (2010-05-06 00:32:00) [15]


> Код не работает


больно слышать


> подскажите где в процедурах сохранения и загрузки ошибки


предлагаешь поработать за тебя отладчиком ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо