Главная страница
    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
14-1121230858
cvg
2005-07-13 09:00
2005.08.14
Где взять mysql.dcu?


1-1122284113
sarcin
2005-07-25 13:35
2005.08.14
Resize функция для IntraWeb


6-1115284404
Layner
2005-05-05 13:13
2005.08.14
Господа, посоветуйте плз, как отправить 16ричный код, в TcpClient


1-1122113340
Al_jus
2005-07-23 14:09
2005.08.14
Проблема с ДЛЛ


14-1122129690
ZlDoc
2005-07-23 18:41
2005.08.14
Определение типа архива





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский