Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TFileStream и array of extended [XP]


Страницы:   1 2

SergejM ©   (2009-09-28 17:31:00) 

Здравствуйте.
Возникает проблема при записи в поток и последующем чтении массива extended. Пишутся и читаются не те данные, которые ожидаются.
Вот примерный код (все, не относящееся непосредственно к записи или чтению, выкинуто):

type
TArrayOfExtended = array of Extended;
...

procedure First;
var
Data:TArrayOfExtended;
Stream:TFileStream;
DataSize: Integer;
...
begin
...
SetLength(Data, DataSize);
...
Stream.Write(Data[Low(Data)], Length(Data)*SizeOf(Extended));
...
end;

procedure Second;
var
Data:TArrayOfExtended;
Stream:TFileStream;
DataSize: Integer;
...
begin
...
SetLength(Data, DataSize);
Stream.Read(Data[Low(Data)], DataSize*SizeOf(Extended));
...
end;


В процедуре First в массиве данных находились дробные числа в диапазоне от -100 до 100. После загрузки в процедуре Second массив содержит в себе дробные числа в диапазоне от -1e-4000 до 1e4000. В качестве дополнения при просмотре сохраненного файла видно, что в него попадают куски из совершенно другой области - фрагменты журнала работы программы. Первое такое попадание случается спустя 8192 байта от начала и дальше спустя каждые 10240 байт. Значение переменной DataSize кратно 4096 байт.
Вопрос - что в приведенном коде может заставлять поток сохранения брать данные из другой области памяти?..


Сергей М.   (2009-09-28 19:51:00) [21]


> Low(Data)


С Low можно и не выёживаться - нижняя граница значения индекса у любой размерности дин.массива всегда равна 0.


> Stream.Read


> Stream.Write


Заимей полезнуюпривычку использовать Read Bufferи Write Buffer.


qwer_qwer   (2009-09-28 19:27:00) [22]


> SergejM ©   (28.09.09 18:25) [2]


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


Leonid Troyanovsky   (2009-09-28 18:46:00) [23]


> SergejM ©   (28.09.09 18:25) [2]

> он равен 1024. Это размер порции данных, которые обрабатываются

Ну, а где же тот самый необходимый и достаточный код?

У мну, например, есть несколько колов времени для изощрения ума,
но мне лениво осмысливать все "..."  (кроме того, их же _надо_ менять).

Надо начинать с простейших способов ловли: сначала на червя, потом
на блесну, а затем плавно переходим к ..  динамиту и электроудочке [ОНР]

--
Regards, LVT.


SergejM   (2009-09-28 18:25:00) [24]

DataSize вычисляется по исходным параметрам. В данном случае он равен 1024. Это размер порции данных, которые обрабатываются в выкинутых кусках. Но я не уверен, что вызов функции быстрого преобразования Фурье, оставшийся в выкинутом коде, может привести к таким фатальным результатам...
Могу привести и весь код процедуры First целиком, но она длинная и запись (а во второй, соответственно, чтение) - лишь очень малый ее участок. И перед записью, и после я проверяю содержимое массива в отладке - не меняется.
С именами все в порядке, никаких ошибок в том, какой массив куда передавать и из какого модуля вызывать функции тоже нет.


Leonid Troyanovsky   (2009-09-28 18:12:00) [25]


> SergejM ©   (28.09.09 17:31)  

> DataSize: Integer;

И откуда он берется?

> Вот примерный код (все, не относящееся непосредственно к
> записи или чтению, выкинуто):

Приводить код нужно не минимальный,
а необходимый и достаточный, дабы пожелавшие его
испытать могли сделать это легким движением руки.

И, еще, как там у нас с конфликтами имен?

--
Regards, LVT.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо