Страница 1 из 1

Откуда берутся не правильные числа?

Добавлено: 17 ноя 2006, 00:13
oif
Есть программа при ее загрузки выбирается файл,потом он обрабатывается и выдается результат.
Так вот все файлы обрабатываются нормально.(не зависимо когда их открываешь)А если первую или вторую (после обработки 2 файлов все нормально) обработку делать с файлом с именем "10AC4_28.BIN"(имена всех других файлов имееют такую же структуру).То в полях результата получаются не понятные числа :shock: (на несколько порядков больше. Должно быть 20,7842 получаем 3235,86),хотя потом выбираем другой файл,обрабатываем его получаем нормальный результат,открываем еще какой нибудь файл,обрабатываем -верный результат.(Или открываем 2 раза "10AC4_28.BIN" ).Потом открываем "10AC4_28.BIN",все ок числа правильные.

Уже что только не перепробывал(менял имя файла и.т.д),причем ошибка только на этом файле(и именно если его открываешь первым или вторым).Файл по структуре не отличается от других.
Объясните почему?
Могу скинуть на мыло прогу.

Код: Выделить всё

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Edit8: TEdit;
    Edit9: TEdit;
    Edit10: TEdit;
    Button3: TButton;
    OpenDialog1: TOpenDialog;
    Edit1: TEdit;
    Label4: TLabel;
    Label5: TLabel;
    Label13: TLabel;
    BitBtn1: TBitBtn;
    procedure Button1Click(Sender: TObject);
    
    procedure Button3Click(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    
   
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
   f1,f2:system.text;
   put:string;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var c,a:char;
    str,stl,k,i,m,j,kstr,nstr,kstl,kstlobr:integer;
    M1:array of integer;
    sum:integer;
    Tsr,Tsr1,Disp,Sigma:single;

begin

  if OpenDialog1.FileName<>'' then 
  begin
    assignFile(f2,OpenDialog1.FileName);
    str:=strtoint(edit2.text);
    stl:=strtoint(edit3.text);
    if opendialog1.filterindex = 2 then 
    begin
      assignFile(f1,OpenDialog1.FileName);
      assignFile(f2,'c:\1.txt');
      reset(f1);
      rewrite(f2);
      For k:=1 to str do 
      begin
        For m:=1 to stl do 
        begin
          read(f1,c);
          if  Ord(c)=255 then write(f2,'1')else write(f2,'0');
        end;
        if k<str then writeln(f2)else closefile (f2);
      end;
      Closefile(F1);
    end;

    Reset(f2);
    Read(F2,c);
    if c='0' then a:='0' else a:='1';
    Closefile(F2);Reset(F2);
    nstr:=strtoint(edit5.text);
    kstr:=strtoint(edit6.text);
    kstl:=strtoint(edit7.text);
    For k:=1 to nstr-1 do 
    begin
      ReadLN(F2);
    end;
    kstr:=kstr-nstr;
    i:=0; k:=0; j:=1;
    While (Not seekeof(F2))and(kstr>0) do 
    begin
      dec(kstr);  kstlobr:=kstl;
      While (Not seekeoln(F2)) do 
      begin
        dec(kstlobr);
        Read(F2,c);
        If kstlobr=0 then 
        begin
          While (Not seekeoln(F2)) do  Read(F2,c);
        end
        else 
        begin
          If c=a then 
          begin
            If k>0 then 
            begin
              setlength(m1,j+1);
              M1[j]:=k+i;
              inc(j); i:=1; k:=0;
            end
            else 
            begin
              inc(i);
            end;
          end
          else 
          begin
            inc(k);
          end;
        end;
      end;
    end;
    If c<>a then M1[j]:=i+k;
    sum:=0;
    For i:=1 to j do 
    begin
      sum:=sum+M1[i]
    end;
    Tsr:=sum/(j);
    Tsr1:=0;
    for i:=1 to j do
      Tsr1:=Tsr1+sqr(M1[i]-Tsr);
    Disp:=Tsr1/(j-1);
    Sigma:=sqrt(Disp);
    Closefile(F2);
  
    edit8.Text:=FloatToStr(tsr);
    edit9.Text:=FloatToStr(disp);
    edit10.Text:=FloatToStr(sigma);
  end;
end;


procedure TForm1.Button3Click(Sender: TObject);
begin
  OpenDialog1.Execute;

  edit1.text:=OpenDialog1.FileName;
end;



procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.MoveTo(0,32);
  Canvas.LineTo(365,32);
  Canvas.MoveTo(0,280);
  Canvas.LineTo(365,280);
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var 
  canclose:boolean;
begin
  CanClose:=messageDlg('Вы хотите выйти?',mtconfirmation,[mbyes,mbno],0)=mryes;
  if canclose=true then Form1.Close;

end;
применение тэга code даёт прекрасные результаты

Добавлено: 17 ноя 2006, 00:28
oif
Вы не поверите :shock:
Удаляю lable10,lable11(просто названия двух полей результата,третье оставляю :D )И все ОК.
Опять вставляю все заново.
Перегрузка памяти? :roll:
Помогите разобраться?
Мозги уже кипят.

Добавлено: 17 ноя 2006, 09:02
somewhere
If c<>a then M1[j]:=i+k;

Что-то мне подсказывает, что дело в последнем елементе массива. Здесь его значение определено, а вот в случае C=A похоже нет. Трудночитабельный текст немного.

Добавлено: 17 ноя 2006, 10:33
Duncon
Думется это может происходить из-за перекидок вначале идет kstl:=strtoint(edit7.text); а в конце edit10.Text:=FloatToStr(sigma); утверждать не буду, но в полне может быть злая шутка.. (strtoint, FloatToStr что нить одно оставить.. inttostr)

Добавлено: 17 ноя 2006, 16:18
Svoja4ok
oif писал(а):Вы не поверите :shock:
Удаляю lable10,lable11(просто названия двух полей результата,третье оставляю :D )И все ОК.
Опять вставляю все заново.
Перегрузка памяти? :roll:
Помогите разобраться?
Мозги уже кипят.
Если всё действительно работает без лабелов (ещё раз убедись), возьми да замени лабел на что нить другое. :lol:
На тот же самый statictext или нужно именно лабел?

Добавлено: 17 ноя 2006, 16:44
oif
Это уже похоже на анектод :twisted: .Выполняю любой из пунутов не зависимо друг от друга:
Если всё действительно работает без лабелов (ещё раз убедись)
1)удаляю lable работает 100%

2)Добавляю:

Код: Выделить всё

setlength(m1,j+1);//спасибо somewhere 
 If c<>a then M1[j]:=i+k; 
    sum:=0; 
    For i:=1 to j do 
    begin 
      sum:=sum+M1[i] 
    end; 
    Tsr:=sum/(j); 
    Tsr1:=0; 
    for i:=1 to j do 
      Tsr1:=Tsr1+sqr(M1[i]-Tsr); 
    Disp:=Tsr1/(j-1); 
    Sigma:=sqrt(Disp); 
    Closefile(F2); 
  
    edit8.Text:=FloatToStr(tsr); 
    edit9.Text:=FloatToStr(disp); 
    edit10.Text:=FloatToStr(sigma); 
  end; 
end;
Думается это может происходить из-за перекидок вначале идет
kstl:=strtoint(edit7.text); а в конце edit10.Text:=FloatToStr(sigma);
Так ведь kstl целое,sigma вещественное.
возьми да замени лабел на что нить другое.
На тот же самый statictext или нужно именно лабел?
Да заменить, я могу только хочется разобраться.Интересно же :roll:
Как связано между собой lable и setlength?

Кто не верит могу прислать прогу :D

Добавлено: 17 ноя 2006, 17:37
BBB
Наверняка в каком-нибудь месте память перепахивается.

Добавлено: 17 ноя 2006, 17:50
oif
Наверняка в каком-нибудь месте память перепахивается
А как это проверить?

Добавлено: 17 ноя 2006, 18:56
Игорь Акопян
включить опции компилятора Range Checking & Overflow Checking? может нарисуют еггог какой-нить