Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1122460119
Vsr
2005-07-27 14:28
2005.08.14
Вызов функции из dll


14-1121582359
Kerk
2005-07-17 10:39
2005.08.14
С днем рожденья! 17 июля


1-1122357061
Sectey
2005-07-26 09:51
2005.08.14
Есть ли ключ компилятора


14-1122020956
Polevi
2005-07-22 12:29
2005.08.14
Longhorn


3-1120523457
LF
2005-07-05 04:30
2005.08.14
Игнорируется EOleException





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский