Wenn das Kompilieren erfolgreich war ist der fehler nicht dabei aufgetreten, sondern beim Ausführen. Das ist ein ganz anderes Thema. Da du durch einen Integer teilst kann es afaik nur eine division durch null sein (für die anderen schweinereien wie nan oder infinity braucht man floats)Projekt kompilieren, OS: win32, CPU: i386, Ziel: BWord.exe: Erfolg, Hinweise: 54
[gelöst] Durch Variable dividieren
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Durch Variable dividieren
Re: Durch Variable dividieren
Auch wenn ich die Datenstruktur von oben in ein Programm stecke, macht FPC keine Macken. Der Fehler liegt also wo anders.
Bist du dir z.B. sicher, ob die beiden Statements bzgl. des Abbruchs im 1.Post nicht vertauscht sind? Denn ich würde erwarten, dass der folgende Code einen Laufzeitfehler erzeugt:
In der 1.Zeile weist du der Variablen LocTeiler einen Wert aus der Datenstruktur LibData[... etc ... ] zu. Diese erhält ihren Inhalt aber erst in der folgenden Zeile. Falls FPC das Array LibData mit 0 initialisiert (was ich mir nie merken kann), wäre LocTeiler 0 und du würdest in der letzten Zeile durch 0 dividieren (zumindest zeigt's mir der Debugger in dem geposteten Programm so an, was du durch Umsetzen der Kommentar-Klammern prüfen kannst und was auch den SIGFPE zu Tage befördert).
Bist du dir z.B. sicher, ob die beiden Statements bzgl. des Abbruchs im 1.Post nicht vertauscht sind? Denn ich würde erwarten, dass der folgende Code einen Laufzeitfehler erzeugt:
Code: Alles auswählen
LocTeiler := LibDat[1].Data[4445].NrOfWrong[4];
LibDat[1].Data[4445].NrOfWrong[4] := 5;
LocResult := 100 / LocTeiler;
- Dateianhänge
-
forum_compilation_crash.zip
- (2 KiB) 86-mal heruntergeladen
Zuletzt geändert von wp_xyz am Fr 10. Aug 2018, 00:19, insgesamt 1-mal geändert.
-
- Lazarusforum e. V.
- Beiträge: 208
- Registriert: Fr 11. Nov 2016, 14:09
- OS, Lazarus, FPC: Linux Mint 20 (WinXP VBox)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Durch Variable dividieren
Das ist doch ein super Hinweis!
Für mich sah es aus als würde es beim compilieren passieren.
Aber wenn dem nicht so ist .....
Der Record ist ein Datensatz der beim Programmstart automatisch und sofort von der Harddisk gelesen wird.
Die Division (Statusanzeige) wird scheinbar schon vorher ausgeführt bevor der Datensatz gelesen wurde.
Ein einfaches :
Hat mein Problem erschlagen. Sollte mann sowieso immer so handhaben. Schäm....
Muss auch mehr auf dieses Nachrichtenfenster achten! Problem beim compilieren oder in der Laufzeit.
Das mit dem 'Erfolg' war mir so noch nicht bewusst.
Vielen vielen Dank Euch allen.
Für mich sah es aus als würde es beim compilieren passieren.
Aber wenn dem nicht so ist .....
Der Record ist ein Datensatz der beim Programmstart automatisch und sofort von der Harddisk gelesen wird.
Die Division (Statusanzeige) wird scheinbar schon vorher ausgeführt bevor der Datensatz gelesen wurde.
Ein einfaches :
Code: Alles auswählen
If LocTeiler > 0 then LocResult := 100 / LocTeiler;
Muss auch mehr auf dieses Nachrichtenfenster achten! Problem beim compilieren oder in der Laufzeit.
Das mit dem 'Erfolg' war mir so noch nicht bewusst.
Vielen vielen Dank Euch allen.
Good code comes from experience, experience comes from bad code.
Re: Durch Variable dividieren
Nein, nicht Schäm, aus Fehlern wird man klug. Der hier zitierte Code ist übrigens auch so ein Beispiel zum Lernen. Ich weiß ja nicht, was da noch alles passiert, aber auf 0 zu testen, nur um ja keinen SIGFPE zu kriegen, ist ein SEHR großer Fehler. Besser wäre, es hier krachen zu lassen, dann wüsstest du wenigstens, dass ein Fehler vorliegt und du könntest suchen, warum LocTeiler 0 geworden ist. So läuft das Programm - im schlimmsten Fall - fehlerfrei ohne Absturz weiter und berechnet aber "Hausnummern", die man erst bemerkt, wenn der Schaden beim Kunden eingtreten ist.Marc hat geschrieben:Der Record ist ein Datensatz der beim Programmstart automatisch und sofort von der Harddisk gelesen wird.
Die Division (Statusanzeige) wird scheinbar schon vorher ausgeführt bevor der Datensatz gelesen wurde.
Ein einfaches :Hat mein Problem erschlagen. Sollte mann sowieso immer so handhaben. Schäm....Code: Alles auswählen
If LocTeiler > 0 then LocResult := 100 / LocTeiler;
-
- Beiträge: 6912
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: [gelöst] Durch Variable dividieren
Code: Alles auswählen
Data : ARRAY [0..5000] OF VocRecord;
Oder hast du deine Array einfach auf Vorrat deklariert ?
Im Fall du es noch nicht weist, es gibt auch dynamische Arrays.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Lazarusforum e. V.
- Beiträge: 208
- Registriert: Fr 11. Nov 2016, 14:09
- OS, Lazarus, FPC: Linux Mint 20 (WinXP VBox)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: [gelöst] Durch Variable dividieren
@wp_xyz
Ich lasse es lieber nicht krachen. Kann ja in Zukunft eine Fehlermeldung ausgeben lassen.
Aber ja aus Fehlern lernt mann.
Einen Kunden gibts hier nicht. Ist nur der Einmillionste Voabeltrainer.
Aber einer der genau so tut wie ich es möchte.
@Mathias
Ich hab über 1000 Vokabeln. Es könnte schon hinkommen.
Aber ja die 5000 sind wohl mehr als ich brauche.
Dynamisch hab ich mal kurz probiert, es hat mir aber irgendwie nicht funktioniert.
Vieleicht weil das Array in einem Record ist.
Aber ich speichere ohnehin schon 90% leere Strings.
Effizient ist was ganz anderes.
Ich lasse es lieber nicht krachen. Kann ja in Zukunft eine Fehlermeldung ausgeben lassen.
Aber ja aus Fehlern lernt mann.
Einen Kunden gibts hier nicht. Ist nur der Einmillionste Voabeltrainer.
Aber einer der genau so tut wie ich es möchte.
@Mathias
Ich hab über 1000 Vokabeln. Es könnte schon hinkommen.
Aber ja die 5000 sind wohl mehr als ich brauche.
Dynamisch hab ich mal kurz probiert, es hat mir aber irgendwie nicht funktioniert.
Vieleicht weil das Array in einem Record ist.
Aber ich speichere ohnehin schon 90% leere Strings.
Effizient ist was ganz anderes.
Good code comes from experience, experience comes from bad code.