Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
2-1282947042
Германн
2010-08-28 02:10
2010.11.21
packed records и Records (advanced)


2-1282718003
12
2010-08-25 10:33
2010.11.21
Как выбрать TTreeNode? Аналогично, если по нему кликнули мышкой


2-1282816133
Dmitriy
2010-08-26 13:48
2010.11.21
проблемы со StaticText


15-1280988195
12
2010-08-05 10:03
2010.11.21
Шахматная программа


15-1281542278
ixen
2010-08-11 19:57
2010.11.21
Обновление OpenOffice.org