Показать полную графическую версию : 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, ты ведь его все равно сам грохаешь...
в принципе то что я сказал не критично, но... попробуй...
и давай код второй процедуры "РЕ"...
а ты просто переменную в раннтайме смотрел? не вываливая значение в лейблу, а по брыкпоинту?
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.