[gelöst] Durch Variable dividieren

Für Fragen von Einsteigern und Programmieranfängern...
Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Durch Variable dividieren

Beitrag von Warf »

Projekt kompilieren, OS: win32, CPU: i386, Ziel: BWord.exe: Erfolg, Hinweise: 54


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)

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Durch Variable dividieren

Beitrag von wp_xyz »

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:

Code: Alles auswählen

  LocTeiler :=  LibDat[1].Data[4445].NrOfWrong[4];
  LibDat[1].Data[4445].NrOfWrong[4] := 5;
  LocResult := 100 / LocTeiler; 

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).
Dateianhänge
forum_compilation_crash.zip
(2 KiB) 77-mal heruntergeladen
Zuletzt geändert von wp_xyz am Fr 10. Aug 2018, 00:19, insgesamt 1-mal geändert.

Marc
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

Beitrag von Marc »

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 :

Code: Alles auswählen

 If LocTeiler > 0 then LocResult := 100 / LocTeiler; 

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.
Good code comes from experience, experience comes from bad code.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Durch Variable dividieren

Beitrag von wp_xyz »

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 :

Code: Alles auswählen

 If LocTeiler > 0 then LocResult := 100 / LocTeiler; 

Hat mein Problem erschlagen. Sollte mann sowieso immer so handhaben. Schäm....

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.

Mathias
Beiträge: 6162
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

Beitrag von Mathias »

Code: Alles auswählen

Data : ARRAY [0..5000] OF VocRecord; 
Bist du sicher, das dein Programm 5001 Datensätze hat ?
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

Marc
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

Beitrag von Marc »

@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.
Good code comes from experience, experience comes from bad code.

Antworten