AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Überlauf bei Rechenoperation mitbekommen
Thema durchsuchen
Ansicht
Themen-Optionen

Überlauf bei Rechenoperation mitbekommen

Ein Thema von Popov · begonnen am 4. Apr 2014 · letzter Beitrag vom 4. Apr 2014
Antwort Antwort
Dejan Vu
(Gast)

n/a Beiträge
 
#1

AW: Überlauf bei Rechenoperation mitbekommen

  Alt 4. Apr 2014, 12:43
Natürlich: Die Operation einfach mit Int64 Werten ausprobieren.

Mein Tipp: Mach aus dem 4-Zeiler einen 20-Zeiler, denn mehr Zeilen heißt nicht gleich 'weniger Übersichtlich'. Was Du hier vorhast ist ja auch etwas merkwürdig.

Übrigens wird der 'Trick' mti den Int64-Werten bei der 'MulDiv' Funktion verwendet. Hier wird a*b div c gerechnet, aber so, das ein Überlauf (bei a*b) vermieden wird.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#2

AW: Überlauf bei Rechenoperation mitbekommen

  Alt 4. Apr 2014, 13:37
Was Du hier vorhast ist ja auch etwas merkwürdig.
Stimmt. Aber in dem speziellen Fall ist das "übliche" Verhalten gewollt (es ist ja auch die Standardeinstellung). Nur will ich es mitbekommen.

Das mit einem Int64 (bzw. allgemein größeren Zahl) ist es auch möglich (man prüft mit if ob Max überschritten wurde), ich hatte aber fixe Idee die Rechnung normal auszuführen und die Info vom System zu erhalten.

Das "Problem" ist, dass das eigentlich einfach zu lösen ist, also ein paar Dummy-Variablen usw. Nur so dumm ist der Compiler nicht. Wenn er er glaubt, dass eine Rechnung nicht nötig ist, und prüfen auf Error ist eigentlich unsinnig, dann ignoriert er die Routine.

//EDIT:

Also das kürzeste was ich hin bekomme (hier im Beispiel mit Byte) ist das:
Delphi-Quellcode:
function IncByte(var X: Byte; N: Byte = 1): Boolean;
  function IncTest: Boolean;
  begin
    Result := False;
    {$OverFlowChecks On}
    try
      Inc(X, N);
    except
      on EIntOverflow do
        Result := True;
    end;
  end;
var
  X2: Byte;
begin
  X2 := X;
  Result := IncTest;

  {$OverFlowChecks Off}
  if Result then
  begin
    X := X2;
    Inc(X, N);
  end;
end;
Es müssen zwei Funktionen sein, sonst klappt das nicht.

Geändert von Popov ( 4. Apr 2014 um 13:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.583 Beiträge
 
Delphi 12 Athens
 
#3

AW: Überlauf bei Rechenoperation mitbekommen

  Alt 4. Apr 2014, 14:46
Wieso klappt das denn nicht?

$Q, bzw. $OverFlowChecks sollte nur auf Zeilenebene gültig sein, alss nur bis zur nächsten Definition, oder bis Dateiende, falls nichts mehr kommt.



Bei INC muß man etwas aufpassen ... siehe Beschreibung vom letzten Beispiel und darum hier auch die Tempvariable.
Delphi-Quellcode:
function IncByte(var X: Byte; N: Byte = 1): Boolean;
var
  X2: Byte;
begin
  X2 := X;
  try
    {$OverFlowChecks On}
    Inc(X, N);
    {$OverFlowChecks Off}  // entweder das
    Result := True;
  except
    on EIntOverflow do begin
      X := X2;
      {$OverFlowChecks Off}  // oder das .... das wo, sollte nahezu egal sein
      Inc(X, N);
      Result := False;
    end;
  end;
end;


Wenn es vor dem Zuweisen knallt, dann geht das auch ohne zusätzliche Variable.
Delphi-Quellcode:
function IncByte(var X: Byte; N: Byte = 1): Boolean;
begin
  try
    {$OverFlowChecks On}
    X := X + N;
    Result := True;
  except
    on EIntOverflow do begin
      {$OverFlowChecks Off}
      Inc(X, N);
      Result := False;
    end;
  end;
end;
Wenn INC direkt im Ziel-Speicher rechnet, dann ist auch mit Exception dennoch das Ergebnis bereits in der Variable und muß nicht nochmal berechnet werden.
Delphi-Quellcode:
function IncByte(var X: Byte; N: Byte = 1): Boolean;
begin
  try
    {$OverFlowChecks On}
    Inc(X, N);
    {$OverFlowChecks Off}
    Result := True;
  except
    on EIntOverflow do
      Result := False;
  end;
end;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#4

AW: Überlauf bei Rechenoperation mitbekommen

  Alt 4. Apr 2014, 21:51
Also ich weiß nicht wie das in höheren Delphi Versionen ist, aber
Delphi-Quellcode:
begin
  {$Q+}
  ...
  {$Q-}
end;
beide Direktiven in einer Funktion klappt nicht bei mir. Wenn am Ende {$Q-} steht, hat bei mir {$Q+} am Anfang keine Wirkung. Es gibt bei mir keine Fehlermeldung.

Was bleib ist es auf zwei Funktionen zu verteilen:
Delphi-Quellcode:
function IncByte(var X: Byte; N: Byte = 1): Boolean;
  procedure IncTest;
  begin
    {$OverFlowChecks On}
    Inc(X, N);
  end;
var
  X2: Byte;
begin
  X2 := X;
  try
    IncTest;
    {$OverFlowChecks Off}
    Result := False;
  except
    on EIntOverflow do
    begin
      {$OverFlowChecks Off}
      X := X2;
      Inc(X, N);
      Result := True;
    end;
  end;
end;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz