Форум: "Основная";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
ВнизСохранение динамического массива Найти похожие ветки
← →
Зм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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.013 c