Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Delphi, ? (http://forum.oszone.net/showthread.php?t=30662)

Roman Go 18-02-2003 18:24 209577

generator создает массив (array of real)
saveviborka - сохраняет созданный массив
RE производит статистическую операцию над данными массива
Код:

var data:TPmas_real;
    i:integer;
    bufjj:real;
begin
    bufjj:=0;
    generator(1,3000,data); //saveviborka(form1,data);
    RE(data,bufjj);
    label1.caption:=floattostrf(bufjj,ffFixed,5,5);

проблема в том, что когда процедура сохранения массива активна в лейбел заносится абсолютно неправильный результат, который отличается от истинного в (10 в 22 степени примерно), а вот когда код в таком виде, как представлен здесь я получаю правильный результат. В чем проблема :help:
Код:

procedure saveviborka(it:tform; viborka:TPmas_real);
    var f:textfile;
        buf:real;
        save:tsavedialog;
        i:integer;
    begin
       save:=tsavedialog.create(it);
       save.Execute;
       assignfile(f,save.filename);
       rewrite(f);
       for i:=0 to high(viborka) do
        begin
         buf:=viborka[i];
         writeln(f,buf);
        end;
       save.destroy;
       closefile(f);
    end;



Добавлено:

Еще что интересно, когда я эти процедуры (RE, generator, saveviborka) выстраиваю в столбик и на каждую ставлю точку останова и потом компилирую, то конечный результат оказывается правильным, таким же когда saveviborka отключенна

Ork Yason 19-02-2003 09:18 209578

ээээ... давай по порядку...
значит с начала ты генериш массив, потом записываешь его в файл?
Цитата:

procedure saveviborka(it:tform; viborka:TPmas_real);    
а нафига передаешь форму?
офоримил бы процедуру как приватную и используй self (или как там у вас в делфях)
или ваще создавай окно диалога от Nil, ты ведь его все равно сам грохаешь...
в принципе то что я сказал не критично, но... попробуй...

и давай код второй процедуры "РЕ"...
а ты просто переменную в раннтайме смотрел? не вываливая значение в лейблу, а по брыкпоинту?

Guest 19-02-2003 13:02 209579

Код:

procedure RE(viborka:TPmas_real; var Hs:real);
       var i:integer;
           n:integer;
           buf:real;
           dEi:real;
           zEi:real;
           dmax,dmin:real;
           sRe:real;
           sN:real;
           b1,b2,b3,b4:real;
       begin
         b1:=0; b2:=0; b3:=0; b4:=0; buf:=0;
         dmax:=viborka[0]; dmin:=viborka[0];
         for i:=0 to 8 do
          begin
           if dmax<viborka[i] then dmax:=viborka[i];
           if dmin>viborka[i] then dmin:=viborka[i];
           zei:=zei+sqr(viborka[i]);
           sN:=sN+ln(i+1);
           b3:=b3+sqr(ln(i+1));
          end;
         //dei:=sqrt(buf/8);

         for i:=9 to high(viborka) do
           begin
             if dmax<viborka[i] then dmax:=viborka[i];
             if dmin>viborka[i] then dmin:=viborka[i];
             zei:=zei+sqr(viborka[i]);
             dEi:=sqrt(zei/i+1);
             sRe:=sRe+ln((dmax-dmin)/dEi);
             sN:=sN+ln(i+1);
             b1:=b1+ln(i+1)*ln((dmax-dmin)/dEi);    //log10
             b3:=b3+sqr(ln(i+1));
           end;
         n:=length(viborka);
         b2:=sN*sRe;
         b4:=sqr(sN);
         Hs:=(n*b1-b2)/(n*b3-b4);
       end;

процедура saveviborka лежит в отдельном модуле и по-моемому там так не получится, ну self передавать.
Цитата:

а ты просто переменную в раннтайме смотрел?
если без процедуры сохранения в файл правильное значение с процедурой - неправильное... :(

Roman Go 19-02-2003 13:07 209580

блин
Цитата:

по брыкпоинту?
runtime не смотрел, а то что выше написанно это как раз про break point, но не думаю что там будет что-то подругому

Ork Yason 19-02-2003 13:53 209581

Guest
Цитата:

процедура saveviborka лежит в отдельном модуле и по-моемому там так не получится, ну self передавать.
ну и х с ним... создавай от Нила... это приниципиально, чтоб от формы создавалось? сомневаюсь...
кто такие zei, sN и чего они не инициализированы в нуль?
я не понмю как в делфях, а в с++ если переменная не инициализирована, то там такое будет...
а в делфях кажись такое у меня было... когда ты трассируешь, то они обнуляют...

аналогично со всеми другими переменными... обнули в начале...

Roman Go 19-02-2003 15:30 209582

Цитата:

создавай от Нила... это приниципиально
как от нила, кусочек кода приведи, если не сложно... я вообще врограммирование не так силен... все сам делаю шибко помочь некому... а все переменные пообнулять, так это что просто написать zei:=0, sn:=0 или что-то другое?


Добавлено:

Код:

b1:=0; b2:=0; b3:=0; b4:=0; buf:=0;
zEi:=0; dEi:=0; sN:=0; sRe:=0; dmax:=0; dmin:=0;

я сделал вот так и все вроде заработало, так просто, а так неприятно. А вот с nil я таки не разобрался:help:

Добавлено:

Код:

 procedure saveviborka(viborka:TPmas_real);
    var f:textfile;
        buf:real;
        save:tsavedialog;
        i:integer;
    begin
       save:=tsavedialog.create(nil);
       save.Execute;
       assignfile(f,save.filename);
       rewrite(f);
       for i:=0 to high(viborka) do
        begin
         buf:=viborka[i];
         writeln(f,buf);
        end;
       save.destroy;
       closefile(f);
    end;

так должно быть?

Ork Yason 19-02-2003 15:51 209583

Roman Go
Цитата:

как от нила, кусочек кода приведи, если не сложно
ну в тоем случае будет:
вместо
Цитата:

save:=tsavedialog.create(it);        
save:=tsavedialog.create(nil);
есть определнные отличия, но если тебе не важно кто папа и где будет находится компонет, то это канает...
Цитата:

а все переменные пообнулять, так это что просто написать zei:=0, sn:=0 или что-то другое
больше ничего не нужно...
Цитата:

все сам делаю шибко помочь некому
ничего, прорвешся... все так начинали ;)


Время: 23:42.

Время: 23:42.
© OSzone.net 2001-