![]() |
IntToStr bereitet Probleme beim umstieg auf Delphi 12
Guten Morgen zusammen,
wir haben es nun endlich geschafft auf Delphi 12 umzusteigen, leider stehe ich grade vor einem seltsamen "Fehler(?)". In Delphi 11 hat noch alles getan in Delphi 12 wirft folgender Ausdruck leider einen Fehler (Fehler bei der Bereichsprüfung):
Code:
(Das sind 16 F -> also -1).
IntToStr($FFFFFFFFFFFFFFFF);
Sobald ich folgendes schreibe, geht es witzigerweise. (Das sind nur 15 F)
Code:
Vermutlich eine wichtige Info:
IntToStr($FFFFFFFFFFFFFFF);
Wir Compilieren diese Software als 32bit. Hat jemand eine Idee woran das liegt? Natürlich ist das oben nur ein (sinnloses aber sehr einfach nachzuvollziehendes) Beispiel. Vielen lieben Dank fürs Lesen, über Hinweise was sich geändert hat wäre ich super dankbar. Abhilfe schafft übrigens:
Code:
Das ist für uns aber eher nicht zielführend, daher würde ich gerne ernsthaft verstehen was los ist um die beste mögliche Lösung zu finden.
IntToStr(Integer($FFFFFFFFFFFFFFFF));
|
AW: IntToStr bereitet Probleme beim umstieg auf Delphi 12
$FFFFFFFFFFFFFFFF wird vermutlich jetzt als UInt interpretiert
D.h. mit einem expliziten Cast sollte es gehen:
Delphi-Quellcode:
IntToStr(Integer($FFFFFFFFFFFFFFFF));
|
AW: IntToStr bereitet Probleme beim umstieg auf Delphi 12
Nur 'ne Vermutung?
Was ergibt $FFFFFFFFFFFFFFFF als Dezimalzahl? Was ergibt $FFFFFFFFFFFFFFF als Dezimalzahl? Welchen Dezimalzahlbereich deckt Integer unter 32 Bit ab? 7FFFFFFF (hex) = 2.147.483.647 (dezimal) 80000000 (hex) = -2.147.483.648 (dezimal) Damit dürften die verwendeten Werte für 32-Bit deutlich zu hoch sein. Für 64-Bit sind diese Werte Maximalwert: 7FFFFFFFFFFFFFFF (hex) = 9.223.372.036.854.775.807 Minimalwert: 8000000000000000 (hex) = -9.223.372.036.854.775.808 Demnach sind $FFFFFFFFFFFFFFFF einfach $8000000000000000 zuviel, in Dezimal entspricht das 92.233.720.368.54.775.808, das ist schon eine ziemlich große Menge (Faktor 10) ;-) Letztlich liegt $FFFFFFFFFFFFFFFF schlicht und einfach außerhalb des für Integer gültigen Bereiches und damit ist die Fehlermeldung "Fehler bei der Bereichsprüfung" absolut korrekt. |
AW: IntToStr bereitet Probleme beim umstieg auf Delphi 12
Hallo Bernhard,
ok, das könnte sein. Wüsstest du wo ich eine Änderungsnotiz finden könnte, falls es eine gibt? Ich werde einfach nicht fündig diesbezüglich... Hallo Delphi.Narium, für mich auch absolut einleuchtend (nachdem ich kurz gebraucht habe um zu verstehen was du da erklärt hast - vielen Dank dafür!) warum tritt das dann aber jetzt erst mit Delphi 12 auf und war vorher nie ein Thema? Wo liegt die Änderung? Bisher hat der Wert $FFFF FFFF FFF FFFF einfach -1 ergeben... jetzt erzeugt er den Überlauf... du hast absolut recht, aber trotzdem hat sich etwas verändert und ich würde gerne wissen was :oops::shock::?: |
AW: IntToStr bereitet Probleme beim umstieg auf Delphi 12
Einmal die Bereichsprüfung beim Kompilieren eingeschaltet, einmal ausgeschaltet.
|
AW: IntToStr bereitet Probleme beim Umstieg auf Delphi 12
In beiden Versionen ist der Code der Funktion IntToStr der Gleiche, auch drumherum:
Code:
Sprich es hat sich nichts verändert. Das Verhalten tritt auch bei absolut neuen leeren Projekten auf die nichts anderes enthalten als:
{$IFOPT Q+}
{$DEFINE __OVERFLOWCHECKS} {$OVERFLOWCHECKS OFF} {$ENDIF} function IntToStr(Value: Integer): string; begin Result := _IntToStr32(Abs(Value), Value < 0); end; function IntToStr(Value: Int64): string; begin Result := _IntToStr64(Abs(Value), Value < 0); end; {$IFDEF __OVERFLOWCHECKS} {$UNDEF __OVERFLOWCHECKS} {$OVERFLOWCHECKS ON} {$ENDIF}
Code:
Oder möchtest du mir mitteilen das sich das auch tatsächlich Verändert hat? Falls ja, wo finde ich die passende Releasenote?
ShowMessage(IntToStr($FFFFFFFFFFFFFFFF));
|
AW: IntToStr bereitet Probleme beim umstieg auf Delphi 12
Die Konstante $FFFFFFFFFFFFFFF ist untypisiert und wird als (2^64 -1) interpretiert.
IntToStr() ist für Integer und Int64 deklariert. Da ist die Meldung schon richtig. Hier ist auch eine Typumwandlung notwendig:
Delphi-Quellcode:
Das ist übriegens die Überlaufprüfung, nicht die Bereichsprüfung.
const
i: Integer = Integer($FFFFFFFF); i64: Int64 = Int64($FFFFFFFFFFFFFFFF); |
AW: IntToStr bereitet Probleme beim umstieg auf Delphi 12
Hi Blup,
Ja, habe ich auch grade festgestellt... und auch das an der besagten Stelle an der mein Problem auftaucht tatsächlich folgendes gemacht wird:
Code:
Aber uInt64 kann IntToStr gar nicht. Gibt es hier eine schlaue Lösung für? Denn Integer(Variable) ist an der Stelle ja einfach Falsch, oder? Und meine Frage bleibt tatsächlich bestehen... was genau hat sich geändert das es jetzt plötzlich Auswirkungen hat?
IntToStr(Meine_uInt64_Variable)
|
AW: IntToStr bereitet Probleme beim umstieg auf Delphi 12
Die Funktion ist überladen:
function IntToStr(Value: Integer): string; function IntToStr(Value: Int64): string; Int64() wäre dann die richtige Umwandlung. |
AW: IntToStr bereitet Probleme beim umstieg auf Delphi 12
Aber auch int64(Meine_uInt64_var) könnte durchaus Informationsverlust bedeuten, oder übersehe ich gerade etwas?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:11 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