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

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
oif
Сообщения: 42
Зарегистрирован: 09 ноя 2006, 21:03

Есть программа при ее загрузки выбирается файл,потом он обрабатывается и выдается результат.
Так вот все файлы обрабатываются нормально.(не зависимо когда их открываешь)А если первую или вторую (после обработки 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 даёт прекрасные результаты
oif
Сообщения: 42
Зарегистрирован: 09 ноя 2006, 21:03

Вы не поверите :shock:
Удаляю lable10,lable11(просто названия двух полей результата,третье оставляю :D )И все ОК.
Опять вставляю все заново.
Перегрузка памяти? :roll:
Помогите разобраться?
Мозги уже кипят.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

If c<>a then M1[j]:=i+k;

Что-то мне подсказывает, что дело в последнем елементе массива. Здесь его значение определено, а вот в случае C=A похоже нет. Трудночитабельный текст немного.
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Думется это может происходить из-за перекидок вначале идет kstl:=strtoint(edit7.text); а в конце edit10.Text:=FloatToStr(sigma); утверждать не буду, но в полне может быть злая шутка.. (strtoint, FloatToStr что нить одно оставить.. inttostr)
Svoja4ok
Сообщения: 27
Зарегистрирован: 18 окт 2006, 15:57

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

Это уже похоже на анектод :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
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Наверняка в каком-нибудь месте память перепахивается.
oif
Сообщения: 42
Зарегистрирован: 09 ноя 2006, 21:03

Наверняка в каком-нибудь месте память перепахивается
А как это проверить?
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

включить опции компилятора Range Checking & Overflow Checking? может нарисуют еггог какой-нить
Изображение
Ответить