![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
чтение файлов или бесовщина
XLMD © (2010-08-24 02:05:00)Добрый день. Столкнулся с бесовщиной. Выражается с следующем: при умножении 2х2 получается то 4, то 4.5, то вдруг 3.
Итак. Программа делает следующее: открывает файл, читает из него с равным интервалом 100 порций данных, по 512 байт, закрывает файл.
Итак она делает множество раз подряд. Чтение работает отлично, за одним исключением. На 1й машине, при чтении возникают странные результаты. На 1м и том же файле могут быть получены различные результаты.
Процедура чтения изначально была написана 5 лет назад и работала без сбоев. А тут такое! Выяснил что виновата (!) звуковая карта ASuS Xonar D1. Точнее ее драйвера. Только выключаю звуковую как устройство, как тут же все проблемы исчезают.
При чтении НЕ возникает никаких ошибок, но вынеся процедуру в отдельную DLL вдруг получать стал ошибку.
Никаких ошибок кроме как в моей программе нет.
Вопрос, что делать ? :)
процедура чтения выглядит примерно так:
const
LenSum = 64; // сколько байт в "сумме"
CntProbe = 100; // сколько проб брать внутри файла
Var
fh : TFileStream;
Rbuf : Array [1..1024] of Byte;
GStep : Real;
i,t,k : Integer;
FZero : Boolean;
fsize : Int64;
u : DWord;
zz : Int64;
fname : String;
Begin
try
//-- открытие файла
fh := TFileStream.Create(fname, fmOpenRead or fmShareDenyWrite);
fsize:=fh.Size;
if fsize<LenSum*CntProbe*2 Then // недостаточный размер файла
Begin
fh.Destroy;
Exit;
end;
//-- расчет промежутка чтения
GStep:=(fsize-2*LenSum)/CntProbe;
//-- читаю
i:=0;
FZero:=True;
While i<CntProbe Do
Begin
//-- позиционирование
fh.Seek(Int64(Trunc (i*GStep)), soBeginning); //
if fh.Position<>Trunc (i*GStep) Then
Begin
fh.Destroy;
Exit;
end;
//-- чтение
For t:=1 to High (Rbuf) Do Rbuf [t]:=$00;
fh.Read(Rbuf,512);
//-- складывание в кучу
For t:=1 to LenSum Do
Begin
.... // операции с данными
if Rbuf [t]<>0 Then FZero:=False; // НЕ НУЛЬ ВСТРЕТИЛСЯ
end;
i:=i+1;
end;
//-- закрытие файла
fh.Destroy;
Except
on E: Exception do
Begin
Result:=False;
MessageDlg ('Error ='+E.Message, mtInformation, [mbOk],0);
Exit;
End;
end; // конец try
Anatoly Podgoretsky (2010-08-25 10:21:00) [1]> han_malign (24.08.2010 17:28:14) [14]
Это если код будет написан неправильно, а иначе какая разница какой код
будет работать неправильно.
Правильный$Вася (2010-08-24 18:16:00) [2]
> - низя - при размере файла сравнимом с 512 * CntProb в выборку
> не попадет значительный кусок из хвоста файла,
а чо, проблема разве хвост обработать отдельно?
Плохиш (2010-08-24 17:42:00) [3]
> процедура чтения выглядит примернотак:
>
дальше читать не стал, нафига.
han_malign (2010-08-24 17:28:00) [4]
> сразу целочисленное деление сделай и GStep целым
- низя - при размере файла сравнимом с 512 * CntProb в выборку не попадет значительный кусок из хвоста файла, а для расчета правдоподобного хэша принято брать куски по всей длине...
Другое дело, что это можно заменить на натуральную дробь:
lastFragmentOffset:= fsize - 2*LenSum {???}- ProbeSize {(512)!!!};
...
for I:= 0 to CntProbe-1do begin
currentFragmentOffset:= i*lastFragmentOffset div ( CntProbe-1);
...
end;
currentFragmentOffset(0) = 0
currentFragmentOffset(CntProbe-1) = lastFragmentOffset
Правильный$Вася (2010-08-24 14:27:00) [5]
> //-- расчет промежутка чтения
> GStep:=(fsize-2*LenSum)/CntProbe;
сразу целочисленное деление сделай и GStep целым
Dennis I. Komarov (2010-08-24 12:28:00) [6]
> Palladin © (24.08.10 11:24) [10]
Да вроде как глобальная var объявлена. А там еще и не такое можно предположить...
> Anatoly Podgoretsky © (24.08.10 12:17) [11]
Они белые и пушистые, если обращаться с ними как следует...
Anatoly Podgoretsky (2010-08-24 12:17:00) [7]ДЛЛ это и есть от беса. Не считая конечно бесовского кода.
Palladin (2010-08-24 11:24:00) [8]а того
можно предположить, что в не кастрированном коде эта переменная является параметром
Dennis I. Komarov (2010-08-24 11:13:00) [9]
> han_malign (24.08.10 10:27) [7]
>
> > в отдельную DLL
> > fname : String;
И чего?
RWolf (2010-08-24 10:45:00) [10]Если пользоваться плавучкой для целочисленных расчётов, ещё и не такие глюки полезут.
han_malign (2010-08-24 10:27:00) [11]
> в отдельную DLL
> fname : String;
Anatoly Podgoretsky (2010-08-24 10:10:00) [12]> XLMD (24.08.2010 02:05:00) [0]
У тебя, что GStep может быть 1.3 байта
Palladin (2010-08-24 09:47:00) [13]
> fh.Seek(Int64(Trunc (i*GStep)), soBeginning);
> // if fh.Position<>Trunc (i*GStep) Then
полное мракобесие...
Сергей М. (2010-08-24 09:33:00) [14]Код кошмарен ..
Что уж тут удивляться бесовщине)
Германн (2010-08-24 03:06:00) [15]
> XLMD (24.08.10 02:53) [2]
>
> И бред не полуношника. Я с этим "подземным стуком" все выходные
> разбираюсь.
Но высказался только в "24.08.10 02:05".
Бред полуношника ещё и в том, что на обозрение выдан не код, а только его фрагменты. "Примерно так".
Ну "примерно так" можно и получить ответ об ошибке в 17-й строке.
XLMD (2010-08-24 02:53:00) [16]Файлы - можно взять любые, для исследования проблемы брал MP3шную коллекцию свою. Файлики размером от 3 мб до 300. Брал видео файлы от 300 мб, до 9гиг. Картина одна и та же.
То есть файлы имеют абстрактный, случайный набор данных.
"Вынес в DLL" - ошибка вида "... exception... memory cant be read...".
И бред не полуношника. Я с этим "подземным стуком" все выходные разбираюсь.
Германн (2010-08-24 02:30:00) [17]
> чтение файлов или бесовщина
>
"Подземный стук"
>
> Итак она делает множество раз подряд. Чтение работает отлично,
> за одним исключением. На 1й машине, при чтении возникают
> странные результаты. На 1м и том же файле могут быть получены
> различные результаты.
>
Какие? В чём они отличаются?
> При чтении НЕ возникает никаких ошибок, но вынеся процедуру
> в отдельную DLL вдруг получать стал ошибку.
Как "вынес", какая ошибка?
Короче - "Бред полуношника".
Завтра всё прояснится. Поверь моему опыту.