Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wildes Pointer-Geschubse bei Win64 (https://www.delphipraxis.net/186898-wildes-pointer-geschubse-bei-win64.html)

Codehunter 9. Okt 2015 14:02

Delphi-Version: XE8

Wildes Pointer-Geschubse bei Win64
 
Hallo!

Ich habe in einer zugekauften Unit ein Portierungsproblem für 64 Bit. Da wird wild mit Zeigern herum geschubst:
Delphi-Quellcode:
function Foo: PIrgendeinZeigerTyp;
begin
  Cardinal(Result):= Cardinal(IrgendeinObjekt)+SizeOf(TIrgendeinTyp); // <-- Mecker: "Der linken Seite kann nichts zugewiesen werden"
end;
Ich brauch mal nen kleinen Schubs, warum dieses Cardinal-Typecasting auf Win32 funktioniert und auf Win64 diesen Compilerfehler auswirft.

Danke schööö!

Cody

BUG 9. Okt 2015 14:11

AW: Wildes Pointer-Geschubse bei Win64
 
Unter Win32 sind Cardinal und Pointer gleich breit, unter Win64 nicht. Hier solltest du eine Lösung finden.
EDIT: Hier steht es noch besser.

Codehunter 9. Okt 2015 14:22

AW: Wildes Pointer-Geschubse bei Win64
 
Zitat:

Zitat von BUG (Beitrag 1318170)
Unter Win32 sind Cardinal und Pointer gleich breit, unter Win64 nicht. Hier solltest du eine Lösung finden.
EDIT: Hier steht es noch besser.

Noch vor dem Edit war deine Antwort schon genug Schubs :-D In dem Fall einfach "Cardinal" durch "NativeInt" ausgetauscht und schon wuppt das.

Schrecklichen Dank!

Uwe Raabe 9. Okt 2015 14:59

AW: Wildes Pointer-Geschubse bei Win64
 
Zitat:

Zitat von Codehunter (Beitrag 1318173)
In dem Fall einfach "Cardinal" durch "NativeInt" ausgetauscht und schon wuppt das.

Da Zeiger in der Regel nicht negativ werden, wäre ein
Delphi-Quellcode:
NativeUInt
wohl eher angebracht. Sonst kann es im 32-Bit-Bereich zwischen 2 und 4 GB schon mal zu merkwürdigen Effekten kommen.

Codehunter 9. Okt 2015 15:02

AW: Wildes Pointer-Geschubse bei Win64
 
Danke @Uwe für die Feinheiten!

himitsu 9. Okt 2015 15:07

AW: Wildes Pointer-Geschubse bei Win64
 
Man (vorallem Intel, Apple usw.) war auf die saudumme Idee gekommen und hat den Integer bei 32 eingefroren, und für 64 Bit einen neuen dynamischen Typ erfunden.

Integer = signed integer
Cardinal = unsigned integer

NativeInt und NativeUInt
IntPtr und UIntPtr <- eigentlich das Richtige, aber in Delphi standardmäßig nicht deklariert


Wenn du mit mehreren Delphi-Versionen arbeitest, oder Quellcode für mehrere Delphi-Versionen / Pascalsprachen bereitstellst, dann deklariere besser deine eigenen Typen und verwende immer nur Diese ... dann kannst du später an zentraler Stelle soeinen Drecke, wie mit dem Integer, bugfixen.


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