Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.14;
Скачать: CL | DM;

Вниз

Сохранение динамического массива   Найти похожие ветки 

 
Зм1й ©   (2005-07-26 12:46) [0]

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

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

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


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

f: File of integer;


 
begin...end ©   (2005-07-26 12:56) [2]

> Зм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.


 
Зм1й ©   (2005-07-26 12:56) [3]

Write(f, a1);

Incompatible types: "Integer" and "arr"


 
Зм1й ©   (2005-07-26 13:06) [4]


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

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

type
arr= array of Integer;


у меня есть

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


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


 
Ega23 ©   (2005-07-26 13:10) [5]

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

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

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


 
begin...end ©   (2005-07-26 13:10) [6]

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

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


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

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

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


 
Ega23 ©   (2005-07-26 13:21) [8]

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

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


 
begin...end ©   (2005-07-26 13:22) [9]

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

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

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


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

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

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


 
Anatoly Podgoretsky ©   (2005-07-26 13:38) [11]

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

f: file of Integer;


 
Зм1й ©   (2005-07-26 14:02) [12]


> 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


 
Ega23 ©   (2005-07-26 14:06) [13]

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

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

См. пост 3

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


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

> Зм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. Писал прямо здесь, мог ошибиться.


 
Anatoly Podgoretsky ©   (2005-07-26 14:20) [15]

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


 
Зм1й ©   (2005-07-26 14:31) [16]


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

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


 
Ega23 ©   (2005-07-26 14:32) [17]

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

Весь массив.


 
Зм1й ©   (2005-07-26 14:34) [18]

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


 
begin...end ©   (2005-07-26 14:35) [19]

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

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



Страницы: 1 вся ветка

Текущий архив: 2005.08.14;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.038 c
1-1122092093
N!tro
2005-07-23 08:14
2005.08.14
Поиск в WebBrowser


4-1118690640
S.T.O.R.M.
2005-06-13 23:24
2005.08.14
Com-port


14-1122037873
tormoz
2005-07-22 17:11
2005.08.14
Скучно тут у вас!!!


14-1122024136
asdqwer
2005-07-22 13:22
2005.08.14
SMS Email Gateway


3-1120498485
Skull
2005-07-04 21:34
2005.08.14
Проблема запуска проги CBuilder6.0 + Access на CD