keine Fehlermeldung bei Division durch Null

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 1383
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 4.99, FPC-Version: 3.3.1
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

keine Fehlermeldung bei Division durch Null

Beitrag von kralle »

Lazarus-Version: 4.4, FPC-Version 3.2.2, OS: Deban Linux 13.6

Moin,

wenn ich das hier:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var ia: integer;
begin
   val(edit1.text,ia);
   form1.caption:=floattostr(ia/0);
end;       
laufen lasse, dann gibt es beim Klick auf den Button keine Fehlermeldung "Division durch 0".

Ich habe jetzt schon herausgefunden, das es bei Gleitkomma-Operationen keinen Fehler gibt, weil das Ergebnis "Unendlich" ist.
Ich bin aber kein Mathematiker und möchte an dieser Stelle ganz klassisch einen Fehler erkannt haben.
Wie muss ich Lazarus konfigurieren, das in diesem Fall auch eine Fehler gemeldet wird.
Über den Sinn des Codes brauchen wir bitte nicht diskutieren.

Gruß Kralle
OS: MX Linux, Linux Mint und Windows 11
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

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

Re: keine Fehlermeldung bei Division durch Null

Beitrag von theo »

Z.B. so:

Code: Alles auswählen

uses Math;
...
  SetExceptionMask(GetExceptionMask - [exZeroDivide]);  

Mathias
Beiträge: 7342
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: keine Fehlermeldung bei Division durch Null

Beitrag von Mathias »

Für das Gegenstück, um "division by zero" ganz zu unterbinden, habe ich dies hier, damm muss man die Unit Math nicht einbinden,
Besonders nützlich, wen man fremde libs einbindet.

Code: Alles auswählen

// wegen "division_by_zero" in den clibs
{$IF defined(CPUX86) or defined(CPUX64)}
{$asmmode intel}
procedure SetMXCSR;
var
  w2: word = 8064;
begin
  asm
           Ldmxcsr w2
  end;
end;
{$ENDIF}

begin
  {$IF defined(CPUX86) or defined(CPUX64)}
  SetMXCSR;
  {$ENDIF}
end.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 1383
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 4.99, FPC-Version: 3.3.1
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: keine Fehlermeldung bei Division durch Null

Beitrag von kralle »

Moin,
theo hat geschrieben: Sa 25. Jul 2026, 12:45 Z.B. so:

Code: Alles auswählen

uses Math;
...
  SetExceptionMask(GetExceptionMask - [exZeroDivide]);  
Wen ich das einsetze, dann bekomme ich diese Meldung, wenn ich den Button anklicke:
Projekt project1 hat Exception-Klasse »External: Unknown exception code 8« ausgelöst.
Das ist keine Meldung "Division by Zero".

Gruß Kralle
OS: MX Linux, Linux Mint und Windows 11
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

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

Re: keine Fehlermeldung bei Division durch Null

Beitrag von theo »

kralle hat geschrieben: Sa 25. Jul 2026, 14:52 Das ist keine Meldung "Division by Zero".
Ohne Debugger kommt die schon.
Mit Debugger kommt die Meldung später.

Bildschirmfoto_20260725_152846.png
Bildschirmfoto_20260725_152846.png (61.02 KiB) 86 mal betrachtet

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 1383
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 4.99, FPC-Version: 3.3.1
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: keine Fehlermeldung bei Division durch Null

Beitrag von kralle »

Moin,

mit Debugger bekomme ich:
Projekt project1 hat Exception-Klasse »External: Unknown exception code 8« ausgelöst.

In Datei 'unit1.pas' in Zeile 39:
form1.caption:=floattostr(ia/0);
ohne Debugger:
Floating point division by zero.

Press OK to ignore and risk data corruption.
Press Abort to kill the program.
Was meinst Du mit "Mit Debugger kommt die Meldung später."?
Bei mir wird die nie angezeigt.

Ist das nicht etwas ungünstig, wenn der gleiche Fehler zwei verschiedene Meldungen ausgibt?

Gruß Kralle
OS: MX Linux, Linux Mint und Windows 11
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

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

Re: keine Fehlermeldung bei Division durch Null

Beitrag von theo »

kralle hat geschrieben: Sa 25. Jul 2026, 16:43 Was meinst Du mit "Mit Debugger kommt die Meldung später."?
Bei mir wird die nie angezeigt.
Mach halt "Continue" statt "Haltepunkt", danach kommt noch der RunError(208) und danach der "EZeroDivide".
kralle hat geschrieben: Sa 25. Jul 2026, 16:43 Ist das nicht etwas ungünstig, wenn der gleiche Fehler zwei verschiedene Meldungen ausgibt?
Im richtigen Leben läuft das Programm ja nicht unter dem Debugger und in der IDE mit Debugger kannst du es verfolgen.
Du kannst es auch abfangen:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  ia: integer;
begin
  SetExceptionMask(GetExceptionMask - [exZeroDivide]);
  val(edit1.Text, ia);
  try
    form1.Caption := floattostr(ia / 0);
  except
    on E: EZeroDivide do
    begin
      writeln(E.Message);
      Close;
    end;
  end;
end;     

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 1383
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 4.99, FPC-Version: 3.3.1
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: keine Fehlermeldung bei Division durch Null

Beitrag von kralle »

Moin,

das mit dem Abfangen und Co, sind praktische Sachen wenn man ein richtiges Programm schreibt.

Ich wollte eigentlich nur schnell ein paar Zeilen Code, die definitiv einen Fehler auslösen.

Das "Div by Zero", so ein "Problem" wird, habe ich nicht geahnt.

Sollte mir vielleicht einen "anderen Fehler" suchen, der mit und ohne Debugger "funktioniert".

Gruß Kralle
OS: MX Linux, Linux Mint und Windows 11
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

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

Re: keine Fehlermeldung bei Division durch Null

Beitrag von wp_xyz »

kralle hat geschrieben: Sa 25. Jul 2026, 17:44 Ich wollte eigentlich nur schnell ein paar Zeilen Code, die definitiv einen Fehler auslösen.
Dann nimm halt eine Integer-Division durch 0:

Code: Alles auswählen

procedure TForm1.FormShow(Sender: TObject);
var
  x, y, z: Integer;
begin
  x := 1;
  y := 0;
  z := x div y;
end; 

Antworten