AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Overflow

Ein Thema von DelphiFreund · begonnen am 10. Dez 2004 · letzter Beitrag vom 12. Aug 2006
Antwort Antwort
Seite 2 von 2     12   
Muetze1
(Gast)

n/a Beiträge
 
#11

Re: Problem mit Overflow

  Alt 11. Aug 2006, 20:03
Der Try/Except Block überprüft gar nix sondern kommt einfach nur zur Ausführung, wenn eine Exception auftritt.

So, ich habe mir das ganze mal angeschaut und musste feststellen, das die Überlaufprüfung nicht wirksam ist, wenn man Bytes addiert. Dadurch das die 32 Bit Register nutzt, wird das Overflow Flag nicht gesetzt, da auch 32-bittig addiert wird. Wenn aber nun die Bereichsprüfung mit eingeschaltet ist, dann überprüft er danach das Ergebnis, ob es kleiner gleich 255 ist und somit in ein Byte passt. Ist dies nicht der Fall, dann schmeisst er die ERangeError Exception.

Im Anhang ein Bild vom erzeugten Code beim addieren von 2 Bytes zu einem 3. Byte mit Überlauf. Man sieht gut den Sprung bei gesetztem Overflow Flag (jno), die Begrenzung der Werte vor der Addition (and xxx, $00ff) und den Sprung bei Werten kleiner gleich 255 über die BoundError Auslösung.
Miniaturansicht angehängter Grafiken
boundscheck_204.gif  
  Mit Zitat antworten Zitat
Puhbaehr
(Gast)

n/a Beiträge
 
#12

Re: Problem mit Overflow

  Alt 11. Aug 2006, 20:26
Hmm na dann werd ich doch mal den Weg der Überlaufprüfung über dem Try/Exception-Block gehen und testen.
Du sprichst im Moment von Byte und, dass das Overflow-Flag nicht anspringt sobald es einen Überlauf gibt. Der Typ Byte war in meinem Fall hier nur ein Beispiel. Die Überlaufprüfung benötige ich beim Typ Cardinal. Da zeigte das Flag Wirkung als ich zweimal 4000000000 zur Zahl hinzu addierte.
Ich möchte, um konkret zu werden, die Dateigröße auslesen und die in einem Cardinal speichern. Da der Typ Cardinal keine Dateigrößen über 4 GB Speichern kann hatte ich vor hier auf Überlauf zu prüfen für den Fall, dass Dateien über 4 GB ausgewählt werden was bei den heutigen Festplatten und Datenmengen ohne weiteres passieren kann.

Vielen Dank auf jeden Fall bis hier her.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#13

Re: Problem mit Overflow

  Alt 11. Aug 2006, 20:43
Ok, dann gibt es ja einen Weg für dich. Aber warum nutzt du nicht einfach den Typ Int64 für die Dateigrösse? Den Overflow Check kannst du dort ja dann trotzdem noch machen, falls die Datei halt grösser ist...
  Mit Zitat antworten Zitat
Puhbaehr
(Gast)

n/a Beiträge
 
#14

Re: Problem mit Overflow

  Alt 11. Aug 2006, 21:38
Langsam langsam. Im Moment bin ich froh, wenn ich es schaffe 4 GB große Dateien fehlerfrei zu laden und zu verarbeiten. Mehr zu laden ist im Moment auch nicht beabsichtigt und notwendig. Im Gegenteil.
Wenn ich mit all dem hier fertig bin dann können wir evtl. darüber reden Dateien zu laden die größer sind als 16 ZB (ZettaByte; 17179869184 GigaByte) MUHA LOL nein ehrlich das reicht erstmal Danke
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#15

Re: Problem mit Overflow

  Alt 11. Aug 2006, 23:11
Es geht mir ja nicht um's Laden, das kannst du ja auch weiterhin auf 4 GB beschränken, sondern darum, dass du keine Arbeit der Variable machen brauchst, in der du die Dateigrösse ablegst.
  Mit Zitat antworten Zitat
Puhbaehr
(Gast)

n/a Beiträge
 
#16

Re: Problem mit Overflow

  Alt 12. Aug 2006, 13:22
Muuuh hätt ich jetzt fast gesagt.

Habe den Try-Exception-Block erst um die gesamten Anweisungen gelegt. Nachdem das nicht funzte hab ich ihn direkt um die betreffende Stelle gesetzt.
Delphi-Quellcode:
var
  FileSize: dword;
  i : Byte;
...

{$Q+}  // Überlaufprüfung aktiviert
{$R+}  // Bereichsprüfung aktiviert

FileSize := GetFileSize (FileName, nil);

for i := 0 to 255 do
 begin
  try
    FileSize := FileSize + FileSize;
  except
    on EOverflow do // Überlaufprüfung für Gleitkommazahlen
     begin
      SetLastError (E_FILESIZE_TO_LARGE);
     end;
    on EIntOverflow do // Überlaufprüfung für Ganzzahlen
     begin
      SetLastError (E_FILESIZE_TO_LARGE);
     end;
    on ERangeError do // Bereichsprüfung
     begin
      SetLastError (E_FILESIZE_TO_LARGE);
     end;
    else
      SetLastError (E_FILESIZE_TO_LARGE);
     end;
   end;
Irgendwas hab ich/ist falsch. Die Überlauf- und Bereichsprüfung ist aktiviert. Was fehlt mir?
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#17

Re: Problem mit Overflow

  Alt 12. Aug 2006, 14:04
SetLastError setzt nur den Result Code der WinAPI - aber was erwartest du denn noch dazu? So lange keiner dieses Flag auswertet passiert nix weiter. Du könntest z.B. eine Exception auslösen nach dem SetLastError() mit  RaiseLastOSError; bzw. früher RaiseLastWin32Error; .
  Mit Zitat antworten Zitat
Puhbaehr
(Gast)

n/a Beiträge
 
#18

Re: Problem mit Overflow

  Alt 12. Aug 2006, 15:53
Ich wartete darauf, dass beim Überlauf eine Exception ausgelöst wird. Das passiert aber nicht.
...
Ne du, jetzt machen wir erstmal Pause. Für heut ist Feierabend. Nächste Woche gehts weiter

Schönes Wochende Bis dann
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 01:33 Uhr.
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