Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit Overflow (https://www.delphipraxis.net/35700-problem-mit-overflow.html)

DelphiFreund 10. Dez 2004 21:16


Problem mit Overflow
 
Hi,
ich weiss, dass das eine dumme Formulierung ist, aber mir ist nichts besseres eingefallen. Zum Problem: Wenn nun Byte1:= 180 und Byte2:= 90, und wenn ich diese addiere kommt glaub ich 15 raus, es gibt also einen Überlauf, kann ich irgendwie überprüfen ob es einen Overflow gibt oder bei der letzten Operation gab? Das würde alles wesentlich vereinfachen, bei Additionen. Vielen Dank für jede Resonanz.


Gruß DelphiFreund

jfheins 10. Dez 2004 21:19

Re: Problem mit Overflow
 
Du kannst irgendwo in den Tiefen des Compilers eine "Exeption bei Überlauf" bzw. "Überlaufprüfung" aktivieren ...

DelphiFreund 10. Dez 2004 21:20

Re: Problem mit Overflow
 
Klingt gut, ich mach mich auf die Suche.


Wer sucht wird fündig :) : Hier die direktiven: {$OVERFLOWCHECKS ON} oder {$OVERFLOWCHECKS OFF}

jfheins 10. Dez 2004 21:29

Re: Problem mit Overflow
 
Sonst:

Compilerbefehl:
Delphi-Quellcode:
{$Q+}

Puhbaehr 11. Aug 2006 16:16

Re: Problem mit Overflow
 
Und gleiches per Code abfangen/abfragen?

Pseudocode:
Code:
var Zahl : Byte;
...
Zahl := 200;
inc (Zahl, 100);
if (überlauf) then ...
Ich hab versucht mit dem Carry-Flag zu experimentieren.
Asm-Pseudocode:
Code:
function Carry : boolean; Register;
 asm
  push EAX

  jc @@C      // jump if carry
  jmp @@NC

  @@C:        // carry
  mov AL, 1
  jmp @@end

  @@NC:       // no-carry
  mov AL, 0

  @@end:
  mov Result, AL // mov Result

  pop EAX
 end;

...

Zahl := 200;
inc (Zahl, 100);
if (Carry) then ...
Funktioniert im genannten Beispiel. Funktioniert aber nicht nach z.B. GetFileSize :gruebel:
Reicht das Carry-Flag um auf einen Überlauf zu prüfen?

Muetze1 11. Aug 2006 16:18

Re: Problem mit Overflow
 
Dafür gibt es das Overflow Flag.

Mach den Compilerschalter an und rechne es in Delphi innerhalb eines Try/Except Blockes. Wenn es eine EOverflow Exception gibt, dann ist ein Überlauf aufgetreten.

brechi 11. Aug 2006 17:08

Re: Problem mit Overflow
 
Delphi-Quellcode:
function Carry : boolean;
asm
  db 0d6h
end;

Puhbaehr 11. Aug 2006 17:40

Re: Problem mit Overflow
 
Über einen try/except-Block wollte ich es nicht machen sondern über eine einfache Funktion.

Brechis Beispiel funktioniert soweit. Nur was passiert hier? Meine Asm-Referenz gibt zu db nicht viel her. Und das was es hergibt ist wohl das falsche (define byte - reserviert ein Byte an Speicherplatz im Programm... Buch Assembler Ge-packt) :gruebel:

Vielen Dank 4 Help :)

Edit: Delphi zaubert aus db 0D6h db 1. Warum?

Hawkeye219 11. Aug 2006 18:53

Re: Problem mit Overflow
 
Hallo,

auf den korrekten Zustand des Overflow- oder Carry-Flags nach einer Addition zweier Bytes würde ich mich nicht verlassen. Die Addition wird häufig - nach einer Erweiterung der Operanden auf 32 Bit - durch eine 32-Bit-Addition oder einen LEA-Befehl durchgeführt. In diesen Fällen besitzen die genannten Flags keine Aussagekraft.

Gruß Hawkeye

Puhbaehr 11. Aug 2006 19:41

Re: Problem mit Overflow
 
Genau das habe ich gemerkt, nachdem die Funktion GetFileSize ausgeführt wurde.
...
Wie kann ich sonst mit einer einfachen Funktion den Überlauf prüfen? Wenns geht ohne einem Try/Exception-Block.
Oder frage ich mal anders, was genau macht der Try-Except-Block bei einem Überlauf? Wie überprüft er diesen?
:|


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:32 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz