[gelöst] Durch Variable dividieren

Für Fragen von Einsteigern und Programmieranfängern...

Re: Durch Variable dividieren

Beitragvon Warf » 9. Aug 2018, 21:53 Re: Durch Variable dividieren

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)
Warf
 
Beiträge: 984
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon wp_xyz » 9. Aug 2018, 22:14 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:
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).
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von wp_xyz am 9. Aug 2018, 23:19, insgesamt 1-mal geändert.
wp_xyz
 
Beiträge: 2645
Registriert: 8. Apr 2011, 08:01

Beitragvon Marc » 9. Aug 2018, 22:22 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 :
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.
Marc
 
Beiträge: 194
Registriert: 11. Nov 2016, 14:09
Wohnort: Schweiz
OS, Lazarus, FPC: Linux Mint 18 (WinXP VBox) | 
CPU-Target: 64Bit
Nach oben

Beitragvon wp_xyz » 9. Aug 2018, 23:16 Re: Durch Variable dividieren

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.
wp_xyz
 
Beiträge: 2645
Registriert: 8. Apr 2011, 08:01

Beitragvon Mathias » 10. Aug 2018, 15:45 Re: [gelöst] Durch Variable dividieren

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4327
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Marc » 10. Aug 2018, 20:44 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.
Good code comes from experience, experience comes from bad code.
Marc
 
Beiträge: 194
Registriert: 11. Nov 2016, 14:09
Wohnort: Schweiz
OS, Lazarus, FPC: Linux Mint 18 (WinXP VBox) | 
CPU-Target: 64Bit
Nach oben

• Themenende •
Vorherige

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste

porpoises-institution
accuracy-worried