Войти

Показать полную графическую версию : Delphi, ?


Roman Go
18-02-2003, 18:24
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
ээээ... давай по порядку...
значит с начала ты генериш массив, потом записываешь его в файл?
procedure saveviborka(it:tform; viborka:TPmas_real);    
а нафига передаешь форму?
офоримил бы процедуру как приватную и используй self (или как там у вас в делфях)
или ваще создавай окно диалога от Nil, ты ведь его все равно сам грохаешь...
в принципе то что я сказал не критично, но... попробуй...

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

Guest
19-02-2003, 13:02
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
блин
по брыкпоинту?
runtime не смотрел, а то что выше написанно это как раз про break point, но не думаю что там будет что-то подругому

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

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

Roman Go
19-02-2003, 15:30
создавай от Нила... это приниципиально как от нила, кусочек кода приведи, если не сложно... я вообще врограммирование не так силен... все сам делаю шибко помочь некому... а все переменные пообнулять, так это что просто написать 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
Roman Go
как от нила, кусочек кода приведи, если не сложно
ну в тоем случае будет:
вместо save:=tsavedialog.create(it);        
save:=tsavedialog.create(nil);
есть определнные отличия, но если тебе не важно кто папа и где будет находится компонет, то это канает...
а все переменные пообнулять, так это что просто написать zei:=0, sn:=0 или что-то другое
больше ничего не нужно...
все сам делаю шибко помочь некому
ничего, прорвешся... все так начинали ;)




© OSzone.net 2001-2012