Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];

Вниз

Никак не получается сохранить структуру.   Найти похожие ветки 

 
Kolan ©   (2005-07-26 12:24) [0]

Здравствуйте,
 Есть у меня приличного размера структура надо её сохранить.

Вот структура:
 TPairArray = array[0..1] of Double;
 TArrayOfTPair = array of TPairArray;
 {...}
 PMeasurmentData = ^TMeasurmentData;
 TMeasurmentData = record
   {OutPut}
   OutPutGraff: TArrayOfTPair;
 {...}


Вот начало процедуры сохранения:

procedure SaveMeasurmentToFile(MeasurmentDataRec: PMeasurmentData;
 FileName: string);
var
 FS: TFileStream;
begin
 FS := TFileStream.Create(FileName, fmCreate);
 try
   FS.Seek(0, soFromBeginning);
   WritePairArrayToStream(FS, MeasurmentDataRec.OutPutGraff);


Тк там несколько типов дин массивав на каждый написал свою проедуру вот в частности WritePairArrayToStream:

procedure WritePairArrayToStream(var FS: TFileStream; Arr: TArrayOfTPair);
var
 L: Longint;
 I: Integer;
begin
 if FS <> nil then
 begin
   L := High(Arr) - Low(Arr) + 1;
   FS.WriteBuffer(L, SizeOf(Longint));
   for I := Low(Arr) to High(Arr) do
   begin
     FS.WriteBuffer(Arr[I, 0], SizeOf(Arr[I, 0]));
     FS.WriteBuffer(Arr[I, 1], SizeOf(Arr[I, 1]));
   end;
 end;
end;


Получаю файл в 0 байт.
PS Сначала ошибся FS.Seek(0, soFromBeginning); не написал. Файл получался не 0. Но загрузить не мог при чтении

procedure ReadPairArrayFromStream(FS: TFileStream; var Arr: TArrayOfTPair);
var
 L: Longint;
 I: Integer;
begin
 FS.ReadBuffer(L, SizeOf(L)); (*)
 if L > 0 then
 begin
   SetLength(Arr, L);
   for I := Low(Arr) to High(Arr) do
   begin
     FS.ReadBuffer(Arr[I, 0], SizeOf(Arr[I, 0]));
     FS.ReadBuffer(Arr[I, 1], SizeOf(Arr[I, 1]));
   end;
 end;
end;


Получал Stream read error в (*).


 
begin...end ©   (2005-07-26 13:37) [1]

> Kolan ©   (26.07.05 12:24)

FS.Seek(0, soFromBeginning) нужно делать и перед началом чтения тоже.

Ещё замечания:

> var FS: TFileStream

Спецификатор var можно убрать.

> L := High(Arr) - Low(Arr) + 1

L := Length(Arr)

> for I := Low(Arr) to High(Arr) do
> begin
>   FS.WriteBuffer(Arr[I, 0], SizeOf(Arr[I, 0]));
>   FS.WriteBuffer(Arr[I, 1], SizeOf(Arr[I, 1]));
> end;

FS.WriteBuffer(Arr[0], L * sizeof(Arr[0]))

> for I := Low(Arr) to High(Arr) do
> begin
>  FS.ReadBuffer(Arr[I, 0], SizeOf(Arr[I, 0]));
>  FS.ReadBuffer(Arr[I, 1], SizeOf(Arr[I, 1]));
> end;

FS.ReadBuffer(Arr[0], L * sizeof(Arr[0]))


 
Kolan ©   (2005-07-27 12:27) [2]

Ага шас попробую. Пасиба :)

> FS.Seek(0, soFromBeginning) нужно делать и перед началом
> чтения тоже.

Да делаю.. просто не привёл.


 
Kolan ©   (2005-07-27 12:37) [3]


> FS.WriteBuffer(Arr[0], L * sizeof(Arr[0]))

Это не понял. Это же 3х мерный массив. А так я запишу только Первый эломент(те массив из двух эл). Мож имелось ввиду
FS.WriteBuffer(Arr[I], L * sizeof(Arr[0]))


 
Kolan ©   (2005-07-27 12:46) [4]

Всё проблема была в Copy/Paste
В процедуре чтения было
FS := TFileStream.Create(FileName, fmCreate);
Вместо
FS := TFileStream.Create(FileName, fmOpenRead);
Благодарю за помощь. :)


 
begin...end ©   (2005-07-27 12:50) [5]

> Kolan ©   (27.07.05 12:27) [2]
> Да делаю.. просто не привёл.

Тогда я не понимаю, почему Ваш код [0] работает неверно.

> Kolan ©   (27.07.05 12:37) [3]

> Это же 3х мерный массив.
Это 2х мерный массив.

> А так я запишу только Первый эломент(те массив из двух эл).
Вы попробуйте, попробуйте.

> Мож имелось ввиду
Имелось в виду именно то, что написано.


 
begin...end ©   (2005-07-27 12:53) [6]

> Kolan ©   (27.07.05 12:46) [4]

> В процедуре чтения было
> FS := TFileStream.Create(FileName, fmCreate);

Если бы Вы в самом начале привели ВЕСЬ код (включая создание экземпляра TFileStream в обоих случаях), то ошибка была бы найдена намного быстрее.


 
Kolan ©   (2005-07-27 13:44) [7]


> begin...end ©   (27.07.05 12:53) [6]

Ну дык сократить старался.
Всё работает. Доделал наконец, там структура полей в 20 была.... :).



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

Форум: "Основная";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.011 c
14-1122308065
Agent13
2005-07-25 20:14
2005.08.14
Spamers must die!


14-1121950395
oldman
2005-07-21 16:53
2005.08.14
Смотрел вчера новости - долго ржал!


14-1121884467
Ломброзо
2005-07-20 22:34
2005.08.14
Кто в автокаде рубит...


10-1099318222
AlexGof
2004-11-01 17:10
2005.08.14
Надо DCOM регистрировать на всех клиентах ?


1-1122033841
Weberd
2005-07-22 16:04
2005.08.14
Являются ли .dcu файлы версионными?





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