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

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

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


Зм1й ©   (2005-07-26 12:46:00) 

Хочу сохранить в файл динамический массив. Пишу:

type
arr= array of Integer;

var
a1: arr;

procedure TForm1.FormCreate(Sender: TObject);
var
f: file of arr;
begin
AssignFile(f, 'c:\123.file');
Rewrite(f);
Write(f, a1);
CloseFile(f);
end;


На выделеной строке возникает ошибка

[Ошибка] Unit1.pas(33): Type 'arr' needs finalization - not allowed in file type

Подскажите пожалуста, как решить эту проблему?


begin...end   (2005-07-26 14:35:00) [1]

> Зм1й ©   (26.07.05 14:31) [16]

Сохраняется весь массив. Можно открыть получающийся файл в шестнадцатеричном редакторе (например, в FAR'е) и просмотреть его содержимое. Вы сразу увидите, что туда сохраняется.


Зм1й   (2005-07-26 14:34:00) [2]

Ну вот, проблема решена!


Ega23   (2005-07-26 14:32:00) [3]

Большое спасибо, это то, что нужно. Только у меня один последний вопрос. В Вашем примере сохраняется весь массив А, или только первый его элемент? Я плохо разбираюсь в потоках, поэтому и возник такой вопрос.

Весь массив.


Зм1й   (2005-07-26 14:31:00) [4]


> begin...end ©   (26.07.05 14:07) [14]

Большое спасибо, это то, что нужно. Только у меня один последний вопрос. В Вашем примере сохраняется весь массив А, или только первый его элемент? Я плохо разбираюсь в потоках, поэтому и возник такой вопрос.


Anatoly Podgoretsky   (2005-07-26 14:20:00) [5]

Зм1й ©   (26.07.05 14:02) [12]
См. пост 11 и сравнивай с 0


begin...end   (2005-07-26 14:07:00) [6]

> Зм1й ©   (26.07.05 14:02) [12]
> А как это можно реализовать для моего примера?

Почти точно так же, только записывать ещё и поле X.

type
 TRec = packed record
   X: Word;
   A: array of Integer
 end;


Сохранение:

var
 R: TRec;
 L: Integer;
begin
 ...
 with TFileStream.Create('c:\123.file', fmCreate) do
   try
      Write(R.X, sizeof(R.X));
     L := Length(R.A);
     Write(L, sizeof(L));
     Write(R.A[0], L * sizeof(R.A[0])
   finally
     Free
   end
end.


Загрузка:

var
 R: TRec;
 L: Integer;
begin
 with TFileStream.Create('c:\123.file', fmOpenRead) do
   try
      Read(R.X, sizeof(R.X));
     Read(L, sizeof(L));
     SetLength(R.A, L);
     Read(R.A[0], L * sizeof(R.A[0])
   finally
     Free
   end
end.


P.S. Писал прямо здесь, мог ошибиться.


Ega23   (2005-07-26 14:06:00) [7]

2 Зм1й ©   (26.07.05 14:02) [12]
Тогда файлы получатся огромными

Твои проблемы.

См. пост 3

См. [1] и ДУМАЙ.


Зм1й   (2005-07-26 14:02:00) [8]


> arr: array [0..10000] of Integer;

Тогда файлы получатся огромными

> Придётся сохранять в файл каждое поле записи отдельно, с
> учётом того, ЧТО это за поле.

А как это можно реализовать для моего примера?

> Anatoly Podgoretsky ©   (26.07.05 13:38) [11]
> Зм1й ©   (26.07.05 12:46)  
> Первое действие
>
> f: file of Integer;

См. пост 3


Anatoly Podgoretsky   (2005-07-26 13:38:00) [9]

Зм1й ©   (26.07.05 12:46)  
Первое действие

f: file of Integer;


Ega23   (2005-07-26 13:34:00) [10]

Оно даст одно и то же значение. Независимо от длины поля динамического массива.

Ну правильно. 8 даст. Но реально-то это действительности соответствовать не будет. Для автора.


begin...end   (2005-07-26 13:22:00) [11]

> Ega23 ©   (26.07.05 13:21) [8]

> А что у автора SizeOf даст для двух разных экземпляров
> данного рекорда?

Оно даст одно и то же значение. Независимо от длины поля динамического массива.


Ega23   (2005-07-26 13:21:00) [12]

Выражение sizeof(Rec) не может быть переменной. Это константа.

Правильно. А что у автора SizeOf даст для двух разных экземпляров данного рекорда?


begin...end   (2005-07-26 13:12:00) [13]

> Ega23 ©   (26.07.05 13:10) [5]

Выражение sizeof(Rec) не может быть переменной. Это константа.


begin...end   (2005-07-26 13:10:00) [14]

> Зм1й ©   (26.07.05 13:06) [4]

Для произвольных записей, содержащих типы, требующие финализации (как в примере, приведённом Вами), универсального способа созранения нет. Придётся сохранять в файл каждое поле записи отдельно, с учётом того, ЧТО это за поле.


Ega23   (2005-07-26 13:10:00) [15]

Интересно, а как ты собираешься создавать ТИПИЗИРОВАННЫЙ файл, имея при этом SizeOf(rec) в виде переменной, а не константы???

type
rec= record
x: Word;
arr: array [0..10000] of Integer;
end;

Напиши так и будет работать.


Зм1й   (2005-07-26 13:06:00) [16]


> begin...end ©   (26.07.05 12:56) [2]

Когда писал пост 3, ваше сообщение не видел. Большое спасибо!
Однако этот вариант несколько не универсален. например вместо

type
arr= array of Integer;


у меня есть

type
rec= record
x: Word;
arr: array of Integer;
end;


Тогда Ваш вариант уже не подходит


Зм1й   (2005-07-26 12:56:00) [17]

Write(f, a1);

Incompatible types: 'Integer' and 'arr'


begin...end   (2005-07-26 12:56:00) [18]

> Зм1й ©   (26.07.05 12:46)

Сохранение:

var
 A: array of Integer;
 L: Integer;
begin
 ...
 with TFileStream.Create('c:\123.file', fmCreate) do
   try
     L := Length(A);
     Write(L, sizeof(L));
     Write(A[0], L * sizeof(A[0])
   finally
     Free
   end
end.


Загрузка:

var
 A: array of Integer;
 L: Integer;
begin
 with TFileStream.Create('c:\123.file', fmOpenRead) do
   try
     Read(L, sizeof(L));
     SetLength(A, L);
     Read(A[0], L * sizeof(A[0])
   finally
     Free
   end
end.


Aleksey V.P.   (2005-07-26 12:49:00) [19]

f: File of integer;


Наверх

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