Komponente Division durch Null

Rund um die LCL und andere Komponenten
Antworten
USchoch
Beiträge: 45
Registriert: Do 16. Mär 2017, 14:01

Komponente Division durch Null

Beitrag von USchoch »

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

Benutzeravatar
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

Beitrag von Zvoni »

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.

Soner
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

Beitrag von Soner »

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;

Benutzeravatar
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

Beitrag von Zvoni »

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;
Wieso Exception abfangen?
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.

Benutzeravatar
theo
Beiträge: 10998
Registriert: Mo 11. Sep 2006, 19:01

Re: Komponente Division durch Null

Beitrag von theo »

Hab mir das mit der Nulldivision mal kurz allgemein angeschaut. Das ist schon recht knifflig. :roll:

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  

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

Re: Komponente Division durch Null

Beitrag von wp_xyz »

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;
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.

Benutzeravatar
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

Beitrag von Zvoni »

wp_xyz hat geschrieben: Mo 1. Sep 2025, 10:59
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;
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.
Breakpoint vor die Zeile setzen, und sich dann die Werte anschauen?
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.

Benutzeravatar
theo
Beiträge: 10998
Registriert: Mo 11. Sep 2006, 19:01

Re: Komponente Division durch Null

Beitrag von theo »

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! :wink:

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

Re: Komponente Division durch Null

Beitrag von wp_xyz »

Zvoni hat geschrieben: Mo 1. Sep 2025, 11:20
wp_xyz hat geschrieben: Mo 1. Sep 2025, 10:59
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;
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.
Breakpoint vor die Zeile setzen, und sich dann die Werte anschauen?
Ist ja seine eigene Unit
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.

Benutzeravatar
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

Beitrag von Zvoni »

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.
-->
Jetzt bin ich am Schreiben eines Programms zum Anzeigen der Daten meiner Wetterstation.
Ich bezweifel dass dieses Programm an "Externe User" herausgegeben wird.
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.

USchoch
Beiträge: 45
Registriert: Do 16. Mär 2017, 14:01

Re: Komponente Division durch Null

Beitrag von USchoch »

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

Mathias
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

Beitrag von Mathias »

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.

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

Antworten