Project1 hat Exception-Klasse "External: SIGFPE" ausgelöst

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Pegaro
Beiträge: 26
Registriert: So 9. Feb 2014, 14:29

Project1 hat Exception-Klasse "External: SIGFPE" ausgelöst

Beitrag von Pegaro »

Hallo zusammen,

ich habe wiedereinmal ein Problem und weiß es nicht zu lösen. Ich möchte erreichen, dass der Computer in einem bestimmten Radius einen Punkt setzt, an dem ich dann eine gezeichnete Pinnnadel setzen kann. Mein Funktion lautet:

Code: Alles auswählen

function gegner1:tpoint;
  VAR a,b,c,d:integer; e:real;
  begin
    c:=round(500/kilometer);
    a:=random(o.x+c)+1;
    d:=random(o.y+c)+1;
    e:=sqrt(sqr(a-o.x)+sqr(d-o.y));
      while c > e do
        begin
          form1.pinn(o.x+a,o.y+d);
        end;
   end;
O.x bzw. o.y wird in einer Prozedur vereinbart.
Starte ich jetz mein Programm und klicke auf den Button, wo die Funktion eingesetzt werden soll erscheint der Fehler "Project1 hat Exception-Klasse "External: SIGFPE" ausgelöst".
Ist die Funktion so überhaupt richtig bzw. was muss getan werden damit diese richtig funktioniert?

Ich bin noch Schüler und mit meinem Informatikwissen an meine Grenzen gestoßen. Wenn das so weiter geht, werde ich wohl noch öfters Hilfe brauchen.

Grüße

Pegaro

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2805
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Project1 hat Exception-Klasse "External: SIGFPE" ausgelö

Beitrag von m.fuchs »

Existiert denn das Formular Form1 wenn deine Funktion daran vorbei kommt? Ich denke mal nicht.

Warum ist das eine Funktion? Den Rückgabewert füllst du doch nirgends.
Auch an dieser Stelle sei dringend das Studium eines Einsteigerwerkes zu Pascal empfohlen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Pegaro
Beiträge: 26
Registriert: So 9. Feb 2014, 14:29

Re: Project1 hat Exception-Klasse "External: SIGFPE" ausgelö

Beitrag von Pegaro »

ja Form1 existiert. Wäre es logischer dies als Prozedur zu schreiben?

Yogi72108
Beiträge: 22
Registriert: Fr 10. Feb 2012, 19:09
OS, Lazarus, FPC: Debian wheezy (FPC 2.7.1 SVN 29278; Laz 1.3 SVN 47189)
CPU-Target: 32Bit
Wohnort: im Schwabenländle

Re: Project1 hat Exception-Klasse "External: SIGFPE" ausgelö

Beitrag von Yogi72108 »

Ich würd erstmal nachschauen was "SIGFPE" überhaupt ist: Floating Point Error
Meistens ist das eine Division durch 0
Ich würde stark vermuten daß kilometer=0 ist; vielleicht vergessen mit einem sinnvollen Wert zu initialiesieren?

Pegaro
Beiträge: 26
Registriert: So 9. Feb 2014, 14:29

Re: Project1 hat Exception-Klasse "External: SIGFPE" ausgelö

Beitrag von Pegaro »

kilometer berechne ich folgendermaßen:

Code: Alles auswählen

kilometer:=sqrt(sqr(40075.016/pixX)+sqr(20003.9/pixY));
pixX ist Image1.Width und PixY ist Image1.height.

Yogi72108
Beiträge: 22
Registriert: Fr 10. Feb 2012, 19:09
OS, Lazarus, FPC: Debian wheezy (FPC 2.7.1 SVN 29278; Laz 1.3 SVN 47189)
CPU-Target: 32Bit
Wohnort: im Schwabenländle

Re: Project1 hat Exception-Klasse "External: SIGFPE" ausgelö

Beitrag von Yogi72108 »

Ist die Berechnung auch sicher vor ausführen deiner Funktion erfolgt?
Ich würd zur Sicherheit vor Berechnung von c noch prüfen:

Code: Alles auswählen

 
if kilometer<>0 then
  c:=Round(500/kilometer)
else
  // kilometer ist 0 und löst SIGFPE aus
 
Außerdem wird diese While-Schleife nie verlassen

Code: Alles auswählen

 
      while c > e do
        begin
          form1.pinn(o.x+a,o.y+d);
        end;
 
weil sich c bzw e in der Schleife nicht ändern

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2805
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Project1 hat Exception-Klasse "External: SIGFPE" ausgelö

Beitrag von m.fuchs »

Man bin ich heute blind, habe ich doch glatt SIGSEGV gelesen. Shame on me. :oops: Dann natürlich nach der Null-Division suchen, wie Yogi72108 gesagt hat.
Pegaro hat geschrieben:ja Form1 existiert. Wäre es logischer dies als Prozedur zu schreiben?
Ja, wenn das Ding nix zurückgeben soll, wäre eine Prozedur sinnvoll. Es kann ja sein, dass du etwas zurückgeben möchtest (irgendwie musst du ja auch den TPoint als Returnwert gekommen sein), aber du befüllst ihn nirgends.
Zuletzt geändert von m.fuchs am So 23. Feb 2014, 17:32, insgesamt 1-mal geändert.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Pegaro
Beiträge: 26
Registriert: So 9. Feb 2014, 14:29

Re: Project1 hat Exception-Klasse "External: SIGFPE" ausgelö

Beitrag von Pegaro »

also ich hab das jetz mal als Prozedur geschrieben und Yogi72108's Rat angewendet. Mit c tritt der Fehler jetzt nicht auf, aber dafür bei:

Code: Alles auswählen

e:=sqrt(sqr(a-o.x)+sqr(d-o.y));
O berechne ich so:

Code: Alles auswählen

o:=koordinaten(-74,40);
Koordinaten ist dabei die herkömmliche Funktion der Koordinatentransformation.

//edit: Läuft jetz ohne Fehlermeldung, allerdings gibt er mit die pinn(o.x+a,o.y+d) nicht aus
hier mal die Funktion von pinn:

Code: Alles auswählen

function tform1.pinn(x,y:integer):tpoint;
    begin
          image1.canvas.moveto(x,y);
          image1.canvas.brush.color:=clblack;
          image1.canvas.lineto(x+15,y-50);
          image1.canvas.MoveTo(x,y);
          image1.canvas.lineto(x-15,y-50);
          image1.canvas.brush.Color:=clred;
          image1.canvas.ellipse(x+25,y-60,x-25,y-35);
      end;
über OnMouseDown kann ich die Pinnnadel ohne irgendwelche Probleme setzten

Yogi72108
Beiträge: 22
Registriert: Fr 10. Feb 2012, 19:09
OS, Lazarus, FPC: Debian wheezy (FPC 2.7.1 SVN 29278; Laz 1.3 SVN 47189)
CPU-Target: 32Bit
Wohnort: im Schwabenländle

Re: Project1 hat Exception-Klasse "External: SIGFPE" ausgelö

Beitrag von Yogi72108 »

Code: Alles auswählen

e:=sqrt(sqr(a-o.x)+sqr(d-o.y));
Da sehe ich eigentlich nichts falsches.
Trotzdem ein paar Anmerkungen was da grundsätzlich schief gehen könnte:
1. Ziehen einer Wurzel aus einer negativen Zahl. In diesem Fall nicht relevant, da zwei Quadrate, die immer positiv sind zusammengezählt werde)
2. Der Wertebereich von "e" als real (=double) ist zu klein und löst einen Überlauf aus. Eventuell hilft es "e" als extended zu deklarieren
Ansonsten sehe ich zu wenig Code um sicher zu sein

Code: Alles auswählen

function tform1.pinn(x,y:integer):tpoint;
Liegen die Werte von x oder y überhaupt im Wertebereich der Größe des Images?
Zuletzt geändert von Yogi72108 am So 23. Feb 2014, 12:57, insgesamt 1-mal geändert.

Pegaro
Beiträge: 26
Registriert: So 9. Feb 2014, 14:29

Re: Project1 hat Exception-Klasse "External: SIGFPE" ausgelö

Beitrag von Pegaro »

ne, dass mit den Rechnungen/Gleichung läuft glatt. Er will bloß die Pinn jetzt nicht setzten, deshalb habe ich ja noch die Funktion mit rangehangen. Vielleicht liegt dort noch irgendwo ein Fehler?

Yogi72108
Beiträge: 22
Registriert: Fr 10. Feb 2012, 19:09
OS, Lazarus, FPC: Debian wheezy (FPC 2.7.1 SVN 29278; Laz 1.3 SVN 47189)
CPU-Target: 32Bit
Wohnort: im Schwabenländle

Re: Project1 hat Exception-Klasse "External: SIGFPE" ausgelö

Beitrag von Yogi72108 »

Was ganz anderes: Eine Function brauchst Du nur, wenn Du einen Rückgabewert erhalten willst. Anmsonsten ist es sinnvoller ein Procedure zu machen
http://www.freepascal.org/docs-html/ref ... 16400014.2
http://www.freepascal.org/docs-html/ref ... 16300014.1

Pegaro
Beiträge: 26
Registriert: So 9. Feb 2014, 14:29

Re: Project1 hat Exception-Klasse "External: SIGFPE" ausgelö

Beitrag von Pegaro »

das habe ich jetz auch verstanden und danke dafür :)

aber irgendetwas scheint noch nicht zu stimmen, denn wenn ich für a und d bei Pinn(o.x+a,o.y+d) mal 50 eingebe, sprich pinn(o.x+50,o.y+50), dann setzt er die Pinn bei bei 50|50

Yogi72108
Beiträge: 22
Registriert: Fr 10. Feb 2012, 19:09
OS, Lazarus, FPC: Debian wheezy (FPC 2.7.1 SVN 29278; Laz 1.3 SVN 47189)
CPU-Target: 32Bit
Wohnort: im Schwabenländle

Re: Project1 hat Exception-Klasse "External: SIGFPE" ausgelö

Beitrag von Yogi72108 »

Wie oben schon erwähnt, könnten die Koordinaten außerhalb des Images liegen.
Du hast in "pinn" folgendes: image1.canvas.lineto(x+15,y-50);
Wenn jetzt y<50 ist, dann ist das in jedem Fall außerhalb des Images da Ergebnis kleiner 0

Pegaro
Beiträge: 26
Registriert: So 9. Feb 2014, 14:29

Re: Project1 hat Exception-Klasse "External: SIGFPE" ausgelö

Beitrag von Pegaro »

kann eigentlich nicht sein, der Punkt ist ziemlich in der Mitte...
ich mach die Koordinatentransformation mit den Weltkoordinaten 10|51.
Soll ich die Funktion auch mal angeben?
Zuletzt geändert von Pegaro am So 23. Feb 2014, 13:47, insgesamt 2-mal geändert.

Yogi72108
Beiträge: 22
Registriert: Fr 10. Feb 2012, 19:09
OS, Lazarus, FPC: Debian wheezy (FPC 2.7.1 SVN 29278; Laz 1.3 SVN 47189)
CPU-Target: 32Bit
Wohnort: im Schwabenländle

Re: Project1 hat Exception-Klasse "External: SIGFPE" ausgelö

Beitrag von Yogi72108 »

Zum Testen würde ich in pinn folgendes machen:

Code: Alles auswählen

 
if (x>25) and (x<(image1.width-25)) then
  if (y>60) and (y<(image1.height-60)) then
    // Pin ist sichtbar
  else
    // Pin nur teilweise oder nicht sichtbar
else
  // Pin nur teilweise oder nicht sichtbar
 
Check mal die Werte von x und y beim Eintritt in pinn mit dem Debugger

Antworten