Показано с 1 по 6 из 6

Тема: Ошибка: проект вызвал класс исключения 'external sigfpe'.

  1. #1
    Администратор Аватар для Terner
    Регистрация
    11.04.2011
    Возраст
    29
    Сообщений
    2,824
    Репутация: 368

    Звание: - очень-очень хороший человек

    Ошибка: проект вызвал класс исключения 'external sigfpe'.

    Делаю лабу через лазарус. Три цикла в одной программе. Возникает такая ошибка:

    Ассемблер:

    Сама прога выдаёт только такое(не все циклы):

    В чём может заключаться проблема? Читал про данную ошибку, пишет, что якобы деление на ноль. Хотя при ручном расчете там получается положительное число (Сделал проверку на 0 = ничего не выводило).


    PHP код:
    unit Unit1;

    {
    $mode objfpc}{$H+}

    interface

    uses
      Classes
    SysUtilsFileUtilFormsControlsGraphicsDialogsStdCtrls,
      
    ExtCtrlsMath;

    type

      
    TForm1 }

      
    TForm1 = class(TForm)
        
    Button1TButton;
        
    Button2TButton;
        
    Edit1TEdit;
        
    Edit2TEdit;
        
    Edit3TEdit;
        
    Image1TImage;
        
    Label1TLabel;
        
    Label2TLabel;
        
    Label3TLabel;
        
    Label4TLabel;
        
    Label5TLabel;
        
    Memo1TMemo;
        
    procedure Button1Click(SenderTObject);
        
    procedure Button2Click(SenderTObject);
        
    procedure Edit1Change(SenderTObject);
        
    procedure Edit2Change(SenderTObject);
        
    procedure Edit3Change(SenderTObject);
        
    procedure Memo1Change(SenderTObject);
      private
        { private 
    declarations }
      public
        { public 
    declarations }
      
    end;

    var
      
    Form1TForm1;
      
    y,a1,a2,da,x,a:real;
      
    code,i,n:integer;



    implementation

    {$R *.lfm}

    TForm1 }
    procedure TForm1.Edit1Change(SenderTObject);
    begin

    end
    ;

    procedure TForm1.Button1Click(SenderTObject);
    begin
       da
    :=strtofloat(Edit1.Text);
       
    a1:=strtofloat(Edit2.Text);
       
    a2:=strtofloat(Edit3.Text);
       
    memo1.Clear;

       
    n:=trunc((a2-a1)/(da)+1);
       
    a:=a1;
               for 
    i:=1 to n do begin
                       x
    :=sin(sqr(exp(a)*0.47));
                       
    y:=(ln(x+((1+x)/(1+2*x)))/(ln(exp(x*a)*3)))+a;
                       
    a:=a+da;
       
    end;
       
    memo1.Lines.Add('Вывод при помощи FOR:');
       
    memo1.Lines.Add('x='+floattostrf(xffGeneral62)+'  y='+floattostrf(yffGeneral42));
       
    memo1.Lines.Add('________________________');
       
    begin
               
    while a<(a2+da) do begin
                       x
    :=sin(sqr(exp(a)*0.47));
                       
    y:=(ln(x+((1+x)/(1+2*x)))/(ln(exp(x*a)*3)))+a;
                       
    a:=a+da;
       
    end;
       
    memo1.Lines.Add('Вывод при помощи WHILE:');
       
    memo1.Lines.Add('x='+floattostrf(xffGeneral62)+'  y='+floattostrf(yffGeneral42));
       
    memo1.Lines.Add('________________________');
       
    end;
       
    begin
               repeat
                       x
    :=sin(sqr(exp(a)*0.47));
                       
    y:=(ln(x+((1+x)/(1+2*x)))/(ln(exp(x*a)*3)))+a;
                       
    a:=a+da;
               
    until a=a2+da;
       
    memo1.Lines.Add('Вывод при помощи REPEAT:');
       
    memo1.Lines.Add('x='+floattostrf(xffGeneral62)+'  y='+floattostrf(yffGeneral42));
       
    memo1.Lines.Add('________________________');
       
    end;
    end;


    procedure TForm1.Button2Click(SenderTObject);
    begin
       memo1
    .Clear;
    end;
    procedure TForm1.Edit2Change(SenderTObject);
    begin

    end
    ;

    procedure TForm1.Edit3Change(SenderTObject);
    begin

    end
    ;

    procedure TForm1.Memo1Change(SenderTObject);
    begin

    end
    ;
    end

  2. #2
    Почетный пользователь LC Аватар для ziggi
    Регистрация
    15.07.2010
    Адрес
    St. Petersburg
    Возраст
    32
    Сообщений
    370
    Репутация: 151

    Звание: - весьма и весьма положительная личность
    Нашёл две возможные проблемы:
    1. Не сбрасывается значение для a после работы цикла.
    2. Не корректное условие для последнего цикла (оно должно быть обратным условию в while).

    PHP код:
    unit Unit1;

    {
    $mode objfpc}{$H+}

    interface

    uses
      Classes
    SysUtilsFileUtilFormsControlsGraphicsDialogsStdCtrls,
      
    ExtCtrlsMath;

    type

        
    TForm1 }

        
    TForm1 = class(TForm)
        
    Button1TButton;
        
    Button2TButton;
        
    Edit1TEdit;
        
    Edit2TEdit;
        
    Edit3TEdit;
        
    Image1TImage;
        
    Label1TLabel;
        
    Label2TLabel;
        
    Label3TLabel;
        
    Label4TLabel;
        
    Label5TLabel;
        
    Memo1TMemo;
        
    procedure Button1Click(SenderTObject);
        
    procedure Button2Click(SenderTObject);
        
    procedure Edit1Change(SenderTObject);
        
    procedure Edit2Change(SenderTObject);
        
    procedure Edit3Change(SenderTObject);
        
    procedure Memo1Change(SenderTObject);
      private
        { private 
    declarations }
      public
        { public 
    declarations }
      
    end;

    var
      
    Form1TForm1;
      
    y,a1,a2,da,x,a:real;
      
    code,i,n:integer;



    implementation

    {$R *.lfm}

    TForm1 }
    procedure TForm1.Edit1Change(SenderTObject);
    begin

    end
    ;

    procedure TForm1.Button1Click(SenderTObject);
    begin
      da
    :=strtofloat(Edit1.Text);
      
    a1:=strtofloat(Edit2.Text);
      
    a2:=strtofloat(Edit3.Text);
      
    memo1.Clear;

      
    begin
        n
    :=trunc((a2-a1)/(da)+1);
        
    a:=a1;

        for 
    i:=1 to n do begin
          x
    :=sin(sqr(exp(a)*0.47));
          
    y:=(ln(x+((1+x)/(1+2*x)))/(ln(exp(x*a)*3)))+a;
          
    a:=a+da;
        
    end;

        
    memo1.Lines.Add('Вывод при помощи FOR:');
        
    memo1.Lines.Add('x='+floattostrf(xffGeneral62)+'  y='+floattostrf(yffGeneral42));
        
    memo1.Lines.Add('________________________');
      
    end;

      
    begin
        a
    :=a1;

        while 
    a<(a2+da) do begin
          x
    :=sin(sqr(exp(a)*0.47));
          
    y:=(ln(x+((1+x)/(1+2*x)))/(ln(exp(x*a)*3)))+a;
          
    a:=a+da;
        
    end;

        
    memo1.Lines.Add('Вывод при помощи WHILE:');
        
    memo1.Lines.Add('x='+floattostrf(xffGeneral62)+'  y='+floattostrf(yffGeneral42));
        
    memo1.Lines.Add('________________________');
      
    end;

      
    begin
        a
    :=a1;

        
    repeat
          x
    :=sin(sqr(exp(a)*0.47));
          
    y:=(ln(x+((1+x)/(1+2*x)))/(ln(exp(x*a)*3)))+a;
          
    a:=a+da;
        
    until a>=a2+da;

        
    memo1.Lines.Add('Вывод при помощи REPEAT:');
        
    memo1.Lines.Add('x='+floattostrf(xffGeneral62)+'  y='+floattostrf(yffGeneral42));
        
    memo1.Lines.Add('________________________');
      
    end;
    end
    P.S. Операции расчётов и вывода лучше вынести в отдельные функции, во избежание дублирования кода.
    Последний раз редактировалось ziggi; 17.05.2016 в 00:31.
    Блог: ziggi.org
    GitHub: github.com/ziggi
    Open-GTO Project: https://github.com/Open-GTO
    FCNPC (боты для SA-MP): https://github.com/Open-GTO/FCNPC

  3. 1 пользователь сказал cпасибо ziggi за это полезное сообщение:

    Terner (18.05.2016)

  4. #3
    Администратор Аватар для Terner
    Регистрация
    11.04.2011
    Возраст
    29
    Сообщений
    2,824
    Репутация: 368

    Звание: - очень-очень хороший человек
    Цитата Сообщение от ziggi Посмотреть сообщение
    Нашёл две возможные проблемы:
    1. Не сбрасывается значение для a после работы цикла.
    2. Не корректное условие для последнего цикла (оно должно быть обратным условию в while).

    PHP код:
    unit Unit1;

    {
    $mode objfpc}{$H+}

    interface

    uses
      Classes
    SysUtilsFileUtilFormsControlsGraphicsDialogsStdCtrls,
      
    ExtCtrlsMath;

    type

        
    TForm1 }

        
    TForm1 = class(TForm)
        
    Button1TButton;
        
    Button2TButton;
        
    Edit1TEdit;
        
    Edit2TEdit;
        
    Edit3TEdit;
        
    Image1TImage;
        
    Label1TLabel;
        
    Label2TLabel;
        
    Label3TLabel;
        
    Label4TLabel;
        
    Label5TLabel;
        
    Memo1TMemo;
        
    procedure Button1Click(SenderTObject);
        
    procedure Button2Click(SenderTObject);
        
    procedure Edit1Change(SenderTObject);
        
    procedure Edit2Change(SenderTObject);
        
    procedure Edit3Change(SenderTObject);
        
    procedure Memo1Change(SenderTObject);
      private
        { private 
    declarations }
      public
        { public 
    declarations }
      
    end;

    var
      
    Form1TForm1;
      
    y,a1,a2,da,x,a:real;
      
    code,i,n:integer;



    implementation

    {$R *.lfm}

    TForm1 }
    procedure TForm1.Edit1Change(SenderTObject);
    begin

    end
    ;

    procedure TForm1.Button1Click(SenderTObject);
    begin
      da
    :=strtofloat(Edit1.Text);
      
    a1:=strtofloat(Edit2.Text);
      
    a2:=strtofloat(Edit3.Text);
      
    memo1.Clear;

      
    begin
        n
    :=trunc((a2-a1)/(da)+1);
        
    a:=a1;

        for 
    i:=1 to n do begin
          x
    :=sin(sqr(exp(a)*0.47));
          
    y:=(ln(x+((1+x)/(1+2*x)))/(ln(exp(x*a)*3)))+a;
          
    a:=a+da;
        
    end;

        
    memo1.Lines.Add('Вывод при помощи FOR:');
        
    memo1.Lines.Add('x='+floattostrf(xffGeneral62)+'  y='+floattostrf(yffGeneral42));
        
    memo1.Lines.Add('________________________');
      
    end;

      
    begin
        a
    :=a1;

        while 
    a<(a2+da) do begin
          x
    :=sin(sqr(exp(a)*0.47));
          
    y:=(ln(x+((1+x)/(1+2*x)))/(ln(exp(x*a)*3)))+a;
          
    a:=a+da;
        
    end;

        
    memo1.Lines.Add('Вывод при помощи WHILE:');
        
    memo1.Lines.Add('x='+floattostrf(xffGeneral62)+'  y='+floattostrf(yffGeneral42));
        
    memo1.Lines.Add('________________________');
      
    end;

      
    begin
        a
    :=a1;

        
    repeat
          x
    :=sin(sqr(exp(a)*0.47));
          
    y:=(ln(x+((1+x)/(1+2*x)))/(ln(exp(x*a)*3)))+a;
          
    a:=a+da;
        
    until a>=a2+da;

        
    memo1.Lines.Add('Вывод при помощи REPEAT:');
        
    memo1.Lines.Add('x='+floattostrf(xffGeneral62)+'  y='+floattostrf(yffGeneral42));
        
    memo1.Lines.Add('________________________');
      
    end;
    end
    P.S. Операции расчётов и вывода лучше вынести в отдельные функции, во избежание дублирования кода.
    Старая ошибка осталась и добавилась новая:


    То есть ввожу, например, такие числа:

    Выдаёт туже ошибку: проект вызвал класс исключения 'external sigfpe' по адресу 1000055А3
    С типом данных вроде всё впорядке

  5. #4
    Почетный пользователь LC Аватар для ziggi
    Регистрация
    15.07.2010
    Адрес
    St. Petersburg
    Возраст
    32
    Сообщений
    370
    Репутация: 151

    Звание: - весьма и весьма положительная личность
    Возможно код нельзя помещать в безымянные блоки begin/end (в С-подобных так можно). А новая ошибка - это ошибка отладчика, видимо где-то некорректно стоит точка останова.

    PHP код:
    unit Unit1;

    {
    $mode objfpc}{$H+}

    interface

    uses
      Classes
    SysUtilsFileUtilFormsControlsGraphicsDialogsStdCtrls,
      
    ExtCtrlsMath;

    type

        
    TForm1 }

        
    TForm1 = class(TForm)
        
    Button1TButton;
        
    Button2TButton;
        
    Edit1TEdit;
        
    Edit2TEdit;
        
    Edit3TEdit;
        
    Image1TImage;
        
    Label1TLabel;
        
    Label2TLabel;
        
    Label3TLabel;
        
    Label4TLabel;
        
    Label5TLabel;
        
    Memo1TMemo;
        
    procedure Button1Click(SenderTObject);
        
    procedure Button2Click(SenderTObject);
        
    procedure Edit1Change(SenderTObject);
        
    procedure Edit2Change(SenderTObject);
        
    procedure Edit3Change(SenderTObject);
        
    procedure Memo1Change(SenderTObject);
      private
        { private 
    declarations }
      public
        { public 
    declarations }
      
    end;

    var
      
    Form1TForm1;
      
    y,a1,a2,da,x,a:real;
      
    code,i,n:integer;



    implementation

    {$R *.lfm}

    TForm1 }
    procedure TForm1.Edit1Change(SenderTObject);
    begin

    end
    ;

    procedure TForm1.Button1Click(SenderTObject);
    begin
      da
    :=strtofloat(Edit1.Text);
      
    a1:=strtofloat(Edit2.Text);
      
    a2:=strtofloat(Edit3.Text);
      
    memo1.Clear;

      { for }
      
    n:=trunc((a2-a1)/(da)+1);
      
    a:=a1;

      for 
    i:=1 to n do begin
        x
    :=sin(sqr(exp(a)*0.47));
        
    y:=(ln(x+((1+x)/(1+2*x)))/(ln(exp(x*a)*3)))+a;
        
    a:=a+da;
      
    end;

      
    memo1.Lines.Add('Вывод при помощи FOR:');
      
    memo1.Lines.Add('x='+floattostrf(xffGeneral62)+'  y='+floattostrf(yffGeneral42));
      
    memo1.Lines.Add('________________________');

      { while }
      
    a:=a1;

      while 
    a<(a2+da) do begin
        x
    :=sin(sqr(exp(a)*0.47));
        
    y:=(ln(x+((1+x)/(1+2*x)))/(ln(exp(x*a)*3)))+a;
        
    a:=a+da;
      
    end;

      
    memo1.Lines.Add('Вывод при помощи WHILE:');
      
    memo1.Lines.Add('x='+floattostrf(xffGeneral62)+'  y='+floattostrf(yffGeneral42));
      
    memo1.Lines.Add('________________________');

      { 
    repeat }
      
    a:=a1;

      
    repeat
        x
    :=sin(sqr(exp(a)*0.47));
        
    y:=(ln(x+((1+x)/(1+2*x)))/(ln(exp(x*a)*3)))+a;
        
    a:=a+da;
      
    until a>=a2+da;

      
    memo1.Lines.Add('Вывод при помощи REPEAT:');
      
    memo1.Lines.Add('x='+floattostrf(xffGeneral62)+'  y='+floattostrf(yffGeneral42));
      
    memo1.Lines.Add('________________________');
    end
    Блог: ziggi.org
    GitHub: github.com/ziggi
    Open-GTO Project: https://github.com/Open-GTO
    FCNPC (боты для SA-MP): https://github.com/Open-GTO/FCNPC

  6. 1 пользователь сказал cпасибо ziggi за это полезное сообщение:

    Terner (18.05.2016)

  7. #5
    Администратор Аватар для Terner
    Регистрация
    11.04.2011
    Возраст
    29
    Сообщений
    2,824
    Репутация: 368

    Звание: - очень-очень хороший человек
    Цитата Сообщение от ziggi Посмотреть сообщение
    Возможно код нельзя помещать в безымянные блоки begin/end (в С-подобных так можно). А новая ошибка - это ошибка отладчика, видимо где-то некорректно стоит точка останова.

    PHP код:
    unit Unit1;

    {
    $mode objfpc}{$H+}

    interface

    uses
      Classes
    SysUtilsFileUtilFormsControlsGraphicsDialogsStdCtrls,
      
    ExtCtrlsMath;

    type

        
    TForm1 }

        
    TForm1 = class(TForm)
        
    Button1TButton;
        
    Button2TButton;
        
    Edit1TEdit;
        
    Edit2TEdit;
        
    Edit3TEdit;
        
    Image1TImage;
        
    Label1TLabel;
        
    Label2TLabel;
        
    Label3TLabel;
        
    Label4TLabel;
        
    Label5TLabel;
        
    Memo1TMemo;
        
    procedure Button1Click(SenderTObject);
        
    procedure Button2Click(SenderTObject);
        
    procedure Edit1Change(SenderTObject);
        
    procedure Edit2Change(SenderTObject);
        
    procedure Edit3Change(SenderTObject);
        
    procedure Memo1Change(SenderTObject);
      private
        { private 
    declarations }
      public
        { public 
    declarations }
      
    end;

    var
      
    Form1TForm1;
      
    y,a1,a2,da,x,a:real;
      
    code,i,n:integer;



    implementation

    {$R *.lfm}

    TForm1 }
    procedure TForm1.Edit1Change(SenderTObject);
    begin

    end
    ;

    procedure TForm1.Button1Click(SenderTObject);
    begin
      da
    :=strtofloat(Edit1.Text);
      
    a1:=strtofloat(Edit2.Text);
      
    a2:=strtofloat(Edit3.Text);
      
    memo1.Clear;

      { for }
      
    n:=trunc((a2-a1)/(da)+1);
      
    a:=a1;

      for 
    i:=1 to n do begin
        x
    :=sin(sqr(exp(a)*0.47));
        
    y:=(ln(x+((1+x)/(1+2*x)))/(ln(exp(x*a)*3)))+a;
        
    a:=a+da;
      
    end;

      
    memo1.Lines.Add('Вывод при помощи FOR:');
      
    memo1.Lines.Add('x='+floattostrf(xffGeneral62)+'  y='+floattostrf(yffGeneral42));
      
    memo1.Lines.Add('________________________');

      { while }
      
    a:=a1;

      while 
    a<(a2+da) do begin
        x
    :=sin(sqr(exp(a)*0.47));
        
    y:=(ln(x+((1+x)/(1+2*x)))/(ln(exp(x*a)*3)))+a;
        
    a:=a+da;
      
    end;

      
    memo1.Lines.Add('Вывод при помощи WHILE:');
      
    memo1.Lines.Add('x='+floattostrf(xffGeneral62)+'  y='+floattostrf(yffGeneral42));
      
    memo1.Lines.Add('________________________');

      { 
    repeat }
      
    a:=a1;

      
    repeat
        x
    :=sin(sqr(exp(a)*0.47));
        
    y:=(ln(x+((1+x)/(1+2*x)))/(ln(exp(x*a)*3)))+a;
        
    a:=a+da;
      
    until a>=a2+da;

      
    memo1.Lines.Add('Вывод при помощи REPEAT:');
      
    memo1.Lines.Add('x='+floattostrf(xffGeneral62)+'  y='+floattostrf(yffGeneral42));
      
    memo1.Lines.Add('________________________');
    end
    Та же самая ошибка (проект вызвал класс исключения 'external sigfpe'.) при не целых чисел

  8. #6
    Администратор Аватар для Terner
    Регистрация
    11.04.2011
    Возраст
    29
    Сообщений
    2,824
    Репутация: 368

    Звание: - очень-очень хороший человек
    Всё дело было в формуле:
    PHP код:
    x:=sin(sqr(exp(a)*0.47)); 
    Нужно её записать вот так:
    PHP код:
    x:=sqr(sin(exp(a)*0.47)); 
    Спасибо, ziggi за хоть какую-то помощь :-)
    Закрываю!

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •