![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TFileStream и array of extended [XP]
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.