Komponente Division durch Null
Komponente Division durch Null
Hallo
Ich habe vor einiger Zeit eine Komponente namens „Windrose“ geschrieben. Wenn ich diese in einen Testprogramm einfüge, kann ich mit einem Scrollbar den Zeiger von 0 bis 359 Grad drehen. Das läuft tiptop.
Jetzt bin ich am Schreiben eines Programms zum Anzeigen der Daten meiner Wetterstation. Da habe ich diese Windrose auch drin. Wenn diese angezeigt werden soll, kommt eine Fehlermeldung „Division durch 0 im File Windrose.pas", also in der Komponente Windrose, die ich mit Uses Windrose eingebunden habe. In Windrose.pas hat es irgendwo eine Zeile. mit irgendwas/(maxwert-minwert). Diese beiden Werter setze ich weder im Testprogramm noch im Wetterstationsprogramm. Im Testprogramm keine Fehlermeldung, Im Wetterstationsprogramm schon
Warum wohl?
Gruss
Uli
Ich habe vor einiger Zeit eine Komponente namens „Windrose“ geschrieben. Wenn ich diese in einen Testprogramm einfüge, kann ich mit einem Scrollbar den Zeiger von 0 bis 359 Grad drehen. Das läuft tiptop.
Jetzt bin ich am Schreiben eines Programms zum Anzeigen der Daten meiner Wetterstation. Da habe ich diese Windrose auch drin. Wenn diese angezeigt werden soll, kommt eine Fehlermeldung „Division durch 0 im File Windrose.pas", also in der Komponente Windrose, die ich mit Uses Windrose eingebunden habe. In Windrose.pas hat es irgendwo eine Zeile. mit irgendwas/(maxwert-minwert). Diese beiden Werter setze ich weder im Testprogramm noch im Wetterstationsprogramm. Im Testprogramm keine Fehlermeldung, Im Wetterstationsprogramm schon
Warum wohl?
Gruss
Uli
- Zvoni
- Beiträge: 442
- Registriert: Fr 5. Jul 2024, 08:26
- OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
- CPU-Target: 32Bit
- Wohnort: BW
Re: Komponente Division durch Null
Debug-Version nutzen, und StackTrace anschauen?
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
-
- Beiträge: 756
- Registriert: Do 27. Sep 2012, 00:07
- OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
- CPU-Target: x86_64-win64
- Wohnort: Hamburg
Re: Komponente Division durch Null
Bei der Formel irgendwas/(maxwert-minwert) ergibt das (maxwert-minwert) wahrscheinlich bei bestimmten Umständen Null.
Du kannst es mit exception abfangen:
Du kannst es mit exception abfangen:
Code: Alles auswählen
try
x:=irgendwas/(maxwert-minwert);
except
x:=0; //oder irgendetwas anderes
end;
- Zvoni
- Beiträge: 442
- Registriert: Fr 5. Jul 2024, 08:26
- OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
- CPU-Target: 32Bit
- Wohnort: BW
Re: Komponente Division durch Null
Wieso Exception abfangen?Soner hat geschrieben: Mo 1. Sep 2025, 10:16 Bei der Formel irgendwas/(maxwert-minwert) ergibt das (maxwert-minwert) wahrscheinlich bei bestimmten Umständen Null.
Du kannst es mit exception abfangen:Code: Alles auswählen
try x:=irgendwas/(maxwert-minwert); except x:=0; //oder irgendetwas anderes end;
Gleich von vornherein defensiv programmieren
Code: Alles auswählen
If MaxWert-Minwert<>0 Then //bzw. ggfs. auf >0 prüfen --> kein negativer Nenner
x:=Irgendwas/(MaxWert-MinWert)
Else
ShowMessage('Uuupss! Du willst durch 0 teilen?');
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Re: Komponente Division durch Null
Hab mir das mit der Nulldivision mal kurz allgemein angeschaut. Das ist schon recht knifflig.

Code: Alles auswählen
aDouble:=1 / 0; //Keine Exception, Resultat ist +Inf
integer_null:=0;
aDouble:=1 div integer_null; //RunError(200) EDivByZero / Division by zero
aDouble:=1 / integer_null; //RunError(208) / EZeroDivide / Floating point Division by zero
Re: Komponente Division durch Null
Das "versteckt" den Fehler, ohne ihn zu lösen, und erschwert das Debuggen, denn dass hier eine Fehlermeldung verschluckt wird, muss man erst finden. Da ist die DIVIDE_BY_ZERO Exception-Meldung die bessere Lösung, denn nun weiß man, dass durch Null dividiert wurde und kann nach dem Fehler suchen.Soner hat geschrieben: Mo 1. Sep 2025, 10:16 Bei der Formel irgendwas/(maxwert-minwert) ergibt das (maxwert-minwert) wahrscheinlich bei bestimmten Umständen Null.
Du kannst es mit exception abfangen:Code: Alles auswählen
try x:=irgendwas/(maxwert-minwert); except x:=0; //oder irgendetwas anderes end;
- Zvoni
- Beiträge: 442
- Registriert: Fr 5. Jul 2024, 08:26
- OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
- CPU-Target: 32Bit
- Wohnort: BW
Re: Komponente Division durch Null
Breakpoint vor die Zeile setzen, und sich dann die Werte anschauen?wp_xyz hat geschrieben: Mo 1. Sep 2025, 10:59Das "versteckt" den Fehler, ohne ihn zu lösen, und erschwert das Debuggen, denn dass hier eine Fehlermeldung verschluckt wird, muss man erst finden. Da ist die DIVIDE_BY_ZERO Exception-Meldung die bessere Lösung, denn nun weiß man, dass durch Null dividiert wurde und kann nach dem Fehler suchen.Soner hat geschrieben: Mo 1. Sep 2025, 10:16 Bei der Formel irgendwas/(maxwert-minwert) ergibt das (maxwert-minwert) wahrscheinlich bei bestimmten Umständen Null.
Du kannst es mit exception abfangen:Code: Alles auswählen
try x:=irgendwas/(maxwert-minwert); except x:=0; //oder irgendetwas anderes end;
Ist ja seine eigene Unit
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Re: Komponente Division durch Null
Wenn man der Angabe der Fehlermeldung von USchoch trauen kann, wäre es eine Integerdivision, also eine mit "div", sonst wäre es eine "Floating point Division by zero", soweit ich das überschaue.
Falls es jemand besser weiss, immer her damit!
Falls es jemand besser weiss, immer her damit!

Re: Komponente Division durch Null
Natürlich. Aber was machst du ein Jahr später, wenn die Unit auf 10.000 Zeilen angewachsen ist, du all die Details hierzu vergessen hast, und dein Kunde bemängelt, dass die Windrose manchmal ganz falsche Werte anzeigt. Da ist der Fehler viel schneller gefunden, wenn es eine Fehlermeldung gibt, ab der man weitersuchen kann.Zvoni hat geschrieben: Mo 1. Sep 2025, 11:20Breakpoint vor die Zeile setzen, und sich dann die Werte anschauen?wp_xyz hat geschrieben: Mo 1. Sep 2025, 10:59Das "versteckt" den Fehler, ohne ihn zu lösen, und erschwert das Debuggen, denn dass hier eine Fehlermeldung verschluckt wird, muss man erst finden. Da ist die DIVIDE_BY_ZERO Exception-Meldung die bessere Lösung, denn nun weiß man, dass durch Null dividiert wurde und kann nach dem Fehler suchen.Soner hat geschrieben: Mo 1. Sep 2025, 10:16 Bei der Formel irgendwas/(maxwert-minwert) ergibt das (maxwert-minwert) wahrscheinlich bei bestimmten Umständen Null.
Du kannst es mit exception abfangen:Code: Alles auswählen
try x:=irgendwas/(maxwert-minwert); except x:=0; //oder irgendetwas anderes end;
Ist ja seine eigene Unit
- Zvoni
- Beiträge: 442
- Registriert: Fr 5. Jul 2024, 08:26
- OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
- CPU-Target: 32Bit
- Wohnort: BW
Re: Komponente Division durch Null
-->wp_xyz hat geschrieben: Mo 1. Sep 2025, 12:21 Natürlich. Aber was machst du ein Jahr später, wenn die Unit auf 10.000 Zeilen angewachsen ist, du all die Details hierzu vergessen hast, und dein Kunde bemängelt, dass die Windrose manchmal ganz falsche Werte anzeigt. Da ist der Fehler viel schneller gefunden, wenn es eine Fehlermeldung gibt, ab der man weitersuchen kann.
Ich bezweifel dass dieses Programm an "Externe User" herausgegeben wird.Jetzt bin ich am Schreiben eines Programms zum Anzeigen der Daten meiner Wetterstation.
Unabhängig davon haste natürlich recht.
Womit wir beim Logging wären.....
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Re: Komponente Division durch Null
Hallo mitenand
Problem gelöst. Ich habe nicht beachtet, dass im erwähnten File Windrose.pas eine weiter Komponente drin ist namens Massstab. Die hat einen MaxValue und einen MinValue. Im Testprogramm habe ich den nicht verwendet, daurm geht es, Im Wetterstationsprogramm schon. Bei einem waren die Werte nicht gesetzt, also Null.
Grus
Uli
Problem gelöst. Ich habe nicht beachtet, dass im erwähnten File Windrose.pas eine weiter Komponente drin ist namens Massstab. Die hat einen MaxValue und einen MinValue. Im Testprogramm habe ich den nicht verwendet, daurm geht es, Im Wetterstationsprogramm schon. Bei einem waren die Werte nicht gesetzt, also Null.
Grus
Uli
-
- Beiträge: 7012
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Komponente Division durch Null
Wen ein divison by zero bei einer unwichtigen Stelle kommt, kann man es zumindest für Float den Fehler ignorieren lassen.
Bei Ganzzahlen schmiert er immer noch ab.
Aber wenigstens stürzt einem das Programm zB. bei einer Render-Szene nicht ab.
Bei Mathe-Aufgabe würde ich dies nicht unbedingt machen.
Bei Ganzzahlen schmiert er immer noch ab.
Aber wenigstens stürzt einem das Programm zB. bei einer Render-Szene nicht ab.
Bei Mathe-Aufgabe würde ich dies nicht unbedingt machen.
Code: Alles auswählen
program Project1;
procedure SetMXCSR;
var
w2: word = 8064;
begin
asm
Ldmxcsr w2
end;
end;
var
i: integer;
begin
SetMXCSR;
for i := -10 to 10 do begin
WriteLn(50 / i); // Läuft einfach weiter
end;
WriteLn(#10);
for i := -10 to 10 do begin
WriteLn(50 div i); // Schmiert ab
end;
end.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot