[GELÖST]random error

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
kalvo11
Beiträge: 10
Registriert: Do 17. Sep 2015, 21:18
OS, Lazarus, FPC: Windows 10 (L 1.4.2)
CPU-Target: 64Bit

[GELÖST]random error

Beitrag von kalvo11 »

Hallo erstmal,

Ich habe einen Bussimulator programmiert.
Dieser hat auch eine Schadensanzeige.
Je mehr Schaden ein Bus hat, desto weniger Umsatz macht er.
Kompilieren, starten - alles super.

Nach einiger Zeit bekomme ich jedoch den auf den Bildern zu sehenden Error.
Verzeiht mir meine Fehlerbeschreibung, ist mein erster Beitrag.

Es scheint an dem random zu liegen.
Habe round, roundto und simpleroundto ausprobiert. Funktioniert alles nicht

Der Fehler tritt nicht nach einer bestimmten zeit auf, manchmal nach 1 min, manchmal auch erst nach mehreren Minuten.

Code: Alles auswählen

  private
    GewinnVerm, Schaden: Double; 
 
  Schaden:= Schaden+ (Random(75)+15 * SchadenSatz);
  GewinnVerm:= Schaden*0.0065;
  GewinnVerm:=Round(GewinnVerm);
Dateianhänge
Und danach öffnet sich der Assembler
Und danach öffnet sich der Assembler
Erst erscheint dieser Fehler
Erst erscheint dieser Fehler
fehler1.PNG (4.01 KiB) 1843 mal betrachtet
Zuletzt geändert von kalvo11 am Mi 30. Sep 2015, 17:52, insgesamt 3-mal geändert.
„Ich denke, es gibt weltweit einen Markt für vielleicht fünf Computer.“ (IBM, 1943)

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: random error

Beitrag von Komoluna »

Erstmal willkommen im Forum,

Es wäre hilfreich einen Codeausschnitt zu sehen, wo der Fehler auftritt.
Code kannst du so einfügen:

Code: Alles auswählen

[code=laz]Dein Code
[/code]

Der Fehler SIGFPE klingt so nach division by zero.

Außerdem wäre es vielleicht nützlich zu wissen wann der Fehler auftritt. (1min, 4h, ...)

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

kalvo11
Beiträge: 10
Registriert: Do 17. Sep 2015, 21:18
OS, Lazarus, FPC: Windows 10 (L 1.4.2)
CPU-Target: 64Bit

Re: random error

Beitrag von kalvo11 »

Erledigt!
„Ich denke, es gibt weltweit einen Markt für vielleicht fünf Computer.“ (IBM, 1943)

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: random error

Beitrag von Komoluna »

Zeigt dir Lazarus die Zeile an in der der Fehler auftritt?

Falls nicht könntest du so vorgehen:
In die Project.lpr

Code: Alles auswählen

{$Apptype console}
einfügen und deinen code so verändern:

Code: Alles auswählen

  Writeln('0');
  Schaden:= Schaden+ (Random(75)+15 * SchadenSatz);
  Writeln('1');
  GewinnVerm:= Schaden*0.0065;
  Writeln('2');
  GewinnVerm:=Round(GewinnVerm);
  Writeln('3');
Wenn der Fehler dann auftritt musst du einfach gucken welche Zahl ganz unten im Konsolenfenster steht.

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

kalvo11
Beiträge: 10
Registriert: Do 17. Sep 2015, 21:18
OS, Lazarus, FPC: Windows 10 (L 1.4.2)
CPU-Target: 64Bit

Re: random error

Beitrag von kalvo11 »

Komoluna hat geschrieben:Zeigt dir Lazarus die Zeile an in der der Fehler auftritt?

Falls nicht könntest du so vorgehen:
In die Project.lpr

Code: Alles auswählen

{$Apptype console}
einfügen und deinen code so verändern:

Code: Alles auswählen

  Writeln('0');
  Schaden:= Schaden+ (Random(75)+15 * SchadenSatz);
  Writeln('1');
  GewinnVerm:= Schaden*0.0065;
  Writeln('2');
  GewinnVerm:=Round(GewinnVerm);
  Writeln('3');
Wenn der Fehler dann auftritt musst du einfach gucken welche Zahl ganz unten im Konsolenfenster steht.

MFG

Komoluna

Danke erstmal. Nein, er hat mir nicht angezeigt in welcher Zeile der Fehler ist. Nur den Error und dann den Assembler. Ich Probier es mal aus.

*edit*
Habe es ausprobiert. Jetzt crasht er sobald ich die Simulation starten möchte. Gibt den gleichen Error wie vorher aus.

*edit-edit*
Auch ohne deinen modifizierten Code stürzt er jetzt sofort ab, sobald ich es starten möchte (nicht nach kompilieren, sondern nach dem drücken des start buttons)
„Ich denke, es gibt weltweit einen Markt für vielleicht fünf Computer.“ (IBM, 1943)

Warf
Beiträge: 2121
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: random error

Beitrag von Warf »

Der Fehler geschieht in der Funktion Round, so viel kann man schonmal aus dem Debugger entnehmen

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: random error

Beitrag von indianer-frank »

Code: Alles auswählen

GewinnVerm:=Round(GewinnVerm);
Diese Anweisung ist nicht besonders sinnvoll: Sie bewirkt, daß ein Doublewert temporär in einen Integerwert umgewandelt werden soll, der dann wieder in einen Doublewert umgewandelt werden soll. Wenn Du die Nachkommastellen wegwerfen willst (warum eigentlich?), nimmst Du stattdessen

Code: Alles auswählen

GewinnVerm:=int(GewinnVerm);
bzw. wenn Du positive Werte runden willst und nicht nur abschneiden

Code: Alles auswählen

GewinnVerm:=int(GewinnVerm+0.5);
Round hat die unangenehme Nebenwirkung, daß es einen Fehler wirft, wenn das Argument außerhabl des Integerbereiches liegt. Allerdings ist dies normalerweise der int64-Bereich, was bedeuten würde, daß Deine Variable größer als 9.22337E+18 und damit der Schaden größer als 1.41898E+21.

Wenn diese Größenordnung anders sind als erwartet, solltest Du den Fehler an anderer Stelle suchen. Und wenn Du schon Debugausgaben machen willst, dann doch gleich richtig: Nicht '1', '2' etc sondern

Code: Alles auswählen

writeln('GewinnVerm=', GewinnVerm);
bzw ohne Nachkommastellen

Code: Alles auswählen

writeln('GewinnVerm=', GewinnVerm:1:0);

kalvo11
Beiträge: 10
Registriert: Do 17. Sep 2015, 21:18
OS, Lazarus, FPC: Windows 10 (L 1.4.2)
CPU-Target: 64Bit

Re: random error

Beitrag von kalvo11 »

Wenn ich round raus nehme, dann funktioniert das Programm an sich, jedoch habe ich dann als Umsatz da stehen: X,XXXXXXXXXEXXX €
Und das soll natürlich nicht.
Wie kann ich das nun lösen, das ich beim Umsatz entweder ganze Zahlen (XXX €) oder max noch (XXX,XX €) stehen habe?
„Ich denke, es gibt weltweit einen Markt für vielleicht fünf Computer.“ (IBM, 1943)

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: random error

Beitrag von Komoluna »

Ich weiß ja nicht wie du deine Ausgaben generierst, aber so müsste es doch gehen:

Code: Alles auswählen

 
var
  s: String;
  Umsatz: double; //oder single/float
begin
  ...
  s := Inttostr(Integer(Umsatz));
  ...
end;
MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Antworten