Текущий архив: 2010.11.21;
Скачать: CL | DM;
Вниз
чтение файлов или бесовщина Найти похожие ветки
← →
XLMD (2010-08-24 02:05) [0]Добрый день. Столкнулся с бесовщиной. Выражается с следующем: при умножении 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
← →
Германн © (2010-08-24 02:30) [1]
> чтение файлов или бесовщина
>
"Подземный стук"
>
> Итак она делает множество раз подряд. Чтение работает отлично,
> за одним исключением. На 1й машине, при чтении возникают
> странные результаты. На 1м и том же файле могут быть получены
> различные результаты.
>
Какие? В чём они отличаются?
> При чтении НЕ возникает никаких ошибок, но вынеся процедуру
> в отдельную DLL вдруг получать стал ошибку.
Как "вынес", какая ошибка?
Короче - "Бред полуношника".
Завтра всё прояснится. Поверь моему опыту.
← →
XLMD (2010-08-24 02:53) [2]Файлы - можно взять любые, для исследования проблемы брал MP3шную коллекцию свою. Файлики размером от 3 мб до 300. Брал видео файлы от 300 мб, до 9гиг. Картина одна и та же.
То есть файлы имеют абстрактный, случайный набор данных.
"Вынес в DLL" - ошибка вида "... exception... memory cant be read...".
И бред не полуношника. Я с этим "подземным стуком" все выходные разбираюсь.
← →
Германн © (2010-08-24 03:06) [3]
> XLMD (24.08.10 02:53) [2]
>
> И бред не полуношника. Я с этим "подземным стуком" все выходные
> разбираюсь.
Но высказался только в "24.08.10 02:05".
Бред полуношника ещё и в том, что на обозрение выдан не код, а только его фрагменты. "Примерно так".
Ну "примерно так" можно и получить ответ об ошибке в 17-й строке.
← →
Сергей М. © (2010-08-24 09:33) [4]Код кошмарен ..
Что уж тут удивляться бесовщине)
← →
Palladin © (2010-08-24 09:47) [5]
> fh.Seek(Int64(Trunc (i*GStep)), soBeginning);
> // if fh.Position<>Trunc (i*GStep) Then
полное мракобесие...
← →
Anatoly Podgoretsky © (2010-08-24 10:10) [6]> XLMD (24.08.2010 02:05:00) [0]
У тебя, что GStep может быть 1.3 байта
← →
han_malign (2010-08-24 10:27) [7]
> в отдельную DLL
> fname : String;
← →
RWolf © (2010-08-24 10:45) [8]Если пользоваться плавучкой для целочисленных расчётов, ещё и не такие глюки полезут.
← →
Dennis I. Komarov © (2010-08-24 11:13) [9]
> han_malign (24.08.10 10:27) [7]
>
> > в отдельную DLL
> > fname : String;
И чего?
← →
Palladin © (2010-08-24 11:24) [10]а того
можно предположить, что в не кастрированном коде эта переменная является параметром
← →
Anatoly Podgoretsky © (2010-08-24 12:17) [11]ДЛЛ это и есть от беса. Не считая конечно бесовского кода.
← →
Dennis I. Komarov © (2010-08-24 12:28) [12]
> Palladin © (24.08.10 11:24) [10]
Да вроде как глобальная var объявлена. А там еще и не такое можно предположить...
> Anatoly Podgoretsky © (24.08.10 12:17) [11]
Они белые и пушистые, если обращаться с ними как следует...
← →
Правильный$Вася (2010-08-24 14:27) [13]
> //-- расчет промежутка чтения
> GStep:=(fsize-2*LenSum)/CntProbe;
сразу целочисленное деление сделай и GStep целым
← →
han_malign (2010-08-24 17:28) [14]
> сразу целочисленное деление сделай и GStep целым
- низя - при размере файла сравнимом с 512 * CntProb в выборку не попадет значительный кусок из хвоста файла, а для расчета правдоподобного хэша принято брать куски по всей длине...
Другое дело, что это можно заменить на натуральную дробь:lastFragmentOffset:= fsize - 2*LenSum{???} - ProbeSize{(512)!!!};
...
for I:= 0 to CntProbe-1 do begin
currentFragmentOffset:= i*lastFragmentOffset div (CntProbe-1);
...
end;
currentFragmentOffset(0) = 0
currentFragmentOffset(CntProbe-1) = lastFragmentOffset
← →
Плохиш © (2010-08-24 17:42) [15]
> процедура чтения выглядит примерно так:
>
дальше читать не стал, нафига.
← →
Правильный$Вася (2010-08-24 18:16) [16]
> - низя - при размере файла сравнимом с 512 * CntProb в выборку
> не попадет значительный кусок из хвоста файла,
а чо, проблема разве хвост обработать отдельно?
← →
Anatoly Podgoretsky © (2010-08-25 10:21) [17]> han_malign (24.08.2010 17:28:14) [14]
Это если код будет написан неправильно, а иначе какая разница какой код
будет работать неправильно.
Страницы: 1 вся ветка
Текущий архив: 2010.11.21;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.009 c