Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Word<->SmallInt und Cardinal<->Integer mit Bereichsprüfung (https://www.delphipraxis.net/114747-word-smallint-und-cardinal-integer-mit-bereichspruefung.html)

Meta777 30. Mai 2008 15:22


Word<->SmallInt und Cardinal<->Integer mit Berei
 
hallöchen...

wie kann man bei aktivierten Bereichsprüfung ein Word einem SmallInt bzw. ein Cardinal einem Integer zuweisen?
Habe im Forum nichts finden können.

vielen Dank & Shalom

3_of_8 30. Mai 2008 15:31

Re: Word<->SmallInt und Cardinal<->Integer mit B
 
Einfach einen expliziten Typecast machen:

Delphi-Quellcode:
MyInteger:=Integer(MyCardinal);
Wenn der Cardinal aber größer als 2^31-1 ist, kracht es. Möglicherweise solltest du das vorher überprüfen.

Meta777 30. Mai 2008 16:25

Re: Word<->SmallInt und Cardinal<->Integer mit B
 
omg,
darauf hätte ich ja auch drauf kommen können :stupid:
Danke schön

Shalom

himitsu 30. Mai 2008 19:31

Re: Word<->SmallInt und Cardinal<->Integer mit B
 
wieso sollte es krachen?

bei Integer zu Cardinal wird einfach nur binär kopiert ... heißt das "Vorzeichenbit" (MSB des Integer) wird zum Hi-Bit (MSB des Cardinal)

da kracht dann schon nix :angel:

3_of_8 30. Mai 2008 21:17

Re: Word<->SmallInt und Cardinal<->Integer mit B
 
Auch bei aktivierten Rangechecks? Sicher?

himitsu 30. Mai 2008 21:23

Re: Word<->SmallInt und Cardinal<->Integer mit B
 
Ja, drum macht man das doch extra so :zwinker:

Integer ist ein 32 Bit-Speicherblock
Cardinal auch

Auf diese Weise sagt man dem Compiler einfach, daß er den Speicherbereich der Integervariabe als Cardinal interpretieren soll.

Heißt, dieses wird nun als Cardinal angesehn und somit der RangeCheck des Cardinals verwendet.
Und da Cardinal = Cardinal ist, gibt es keine Probleme.

3_of_8 30. Mai 2008 21:56

Re: Word<->SmallInt und Cardinal<->Integer mit B
 
Stimmt, du hast Recht. Ein expliziter Cast scheint keinen Fehler zu verursachen.

Meta777 31. Mai 2008 10:12

Re: Word<->SmallInt und Cardinal<->Integer mit B
 
joa,
funktioniert prima - hät ich ja noch dazu schreiben können ^^

Also vielen Dank nochmal

Shalom

himitsu 31. Mai 2008 10:18

Re: Word<->SmallInt und Cardinal<->Integer mit B
 
ach ja, statt inem explizitem Cast könnte man auch noch eine Absolute-Deklaration verwenden.

Delphi-Quellcode:
Var X: Cardinal;
  Y: Integer absolute X;
hier wird fü Y kein eigener Speicher reserviert, sondern der Speicher der ariable X genutzt.

Funktioniert nur bei gleich großen Typen ( SizeOf(X) = SizeOf(Y) ),
aber dafür auch bei Typen, wo ein expliziter Cast nicht möglich ist, da sich der Compiler weigert (z.B. Int64 und Currency, obwohl sie intern vom selben Typ sind)

Meta777 31. Mai 2008 10:21

Re: Word<->SmallInt und Cardinal<->Integer mit B
 
Zitat:

Zitat von himitsu
Funktioniert nur bei gleich großen Typen ( SizeOf(X) = SizeOf(Y) ),
aber dafür auch bei Typen, wo ein expliziter Cast nicht möglich ist, da sich der Compiler weigert (z.B. Int64 und Currency, obwohl sie intern vom selben Typ sind)

Gut zu wissen :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:25 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