[gelöst] Integer-Überlauf bei Uint64 feststellen (FreePascal)

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
tobo
Beiträge: 1990
Registriert: 10.12.2008 10:51:41

Re: [gelöst] Integer-Überlauf bei Uint64 feststellen (FreePascal)

Beitrag von tobo » 15.08.2021 16:39:41

Und trotzdem ist die selbstprogrammierte Überlaufkontrolle nicht das, was man verwenden sollte. Wenn man also die Prüfungen aktiviert und nicht möchte, dass das Ergebnis der Prüfungen das Programm beendet, dann verwendet man Ausnahmen:

Code: Alles auswählen

program t;
{$mode delphi} {$Q+} {$R+}

uses crt, sysutils;

var
  q: qword = high(qword);
  c: cardinal = high(cardinal);
  w: word = high(word);
  b: byte = high(byte);

procedure generateOverflow(q:qword; c:cardinal; w:word; b:byte);
begin
  try
    if q<>0 then inc(q);
    if c<>0 then inc(c);
    if w<>0 then inc(w);
    if b<>0 then inc(b);
  except
    on e: exception do
      writeln(e.classname,': ',e.message);
  end;
end;

begin
  write('Max64BitValue: ', q, ' - '); generateOverflow(q,0,0,0);
  write('Max32BitValue: ', c, ' - '); generateOverflow(0,c,0,0);
  write('Max16BitValue: ', w, ' - '); generateOverflow(0,0,w,0);
  write('Max8BitValue: ', b, ' - '); generateOverflow(0,0,0,b);
end.

Code: Alles auswählen

Max64BitValue: 18446744073709551615 - EIntOverflow: Arithmetic overflow
Max32BitValue: 4294967295 - ERangeError: Range check error             
Max16BitValue: 65535 - ERangeError: Range check error     
Max8BitValue: 255 - ERangeError: Range check error
Bei der Ausnahmebehandlung kann man dann natürlich auch vielfältiger reagieren. Das heißt aber nicht, dass man den gesamten Text in try-except einschließen sollte. Das Ding nennt sich Ausnahmebehandlung, um Asunahmen abzufangen. Lokal eingesetzt und dort wo es angebracht ist.

Antworten