Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   DXE2; X64; Type cast (https://www.delphipraxis.net/164038-dxe2%3B-x64%3B-type-cast.html)

bernhard_LA 26. Okt 2011 16:28

DXE2; X64; Type cast
 
unter x32 ist folgende Code clean :

type TRGBArray = ARRAY[0..0] OF TRGBTriple;

pRGBArray = ^TRGBArray;


procedure .....
var : RowRotated : pRGBArray;
begin
.....
Dec(Integer(RowRotated), ScanLineBytes); //Move Pointer
end;


unter XE2 und x64 compiler folgender Fehler:

[DCC Fehler] Unit1.pas(3327): E2064 Der linken Seite kann nichts zugewiesen werden


ich denke der TypeCast Integer (..) geht nicht mehr unter x64, wie müsste der code denn sauber
formuliert lauten ?

SirThornberry 26. Okt 2011 16:50

AW: DXE2; X64; Type cast
 
(Integer war schon immer falsch da vorzeichenbehaftet. Speicheradressen sind nie negativ)
Integer ist hier falsch weil Integer 32 bit bleibt. Daher NativeInt bzw. NativeUInt oder besser bzw. richtig: LONG_PTR. :-)

Uwe Raabe 26. Okt 2011 17:09

AW: DXE2; X64; Type cast
 
Da bei XE2 die Pointer-Arithmetik standardmäßig eingeschaltet ist, kann man den Pointer auch direkt einsetzen. Aber Achtung: dann muss mann die Schrittweite beachten! Die Hilfe sagt dazu:


Zitat:

Wenn X ein Zeigertyp ist, wird X um N-mal der Größe des Typs, auf den gezeigt wird, dekrementiert. Für

type PMyType = ^TMyType;

und

var P: PMyType;

verringert die Anweisung Dec(P) P um SizeOf(TMyType).

SirThornberry 27. Okt 2011 12:37

AW: DXE2; X64; Type cast
 
funktioniert daher bei seinem Beispiel nicht. "Scanlinebytes" lässt vermuten das durch incrementieren die Zeile gewechselt werden soll. Und eine Zeile hat nicht zwangsläufig als Größe ein Vielfaches eines Pixels.

Uwe Raabe 27. Okt 2011 13:13

AW: DXE2; X64; Type cast
 
Zitat:

Zitat von SirThornberry (Beitrag 1132868)
funktioniert daher bei seinem Beispiel nicht. "Scanlinebytes" lässt vermuten das durch incrementieren die Zeile gewechselt werden soll.

Deshalb ja auch meine Anmwerkung.

Zitat:

Zitat von SirThornberry (Beitrag 1132868)
Und eine Zeile hat nicht zwangsläufig als Größe ein Vielfaches eines Pixels.

Aber ganz sicher hat eine Zeile als Größe ein Vielfaches der eines Pixels. Dieses Vielfache ist exakt die Anzahl der Pixel pro Zeile.

bernhard_LA 27. Okt 2011 18:40

AW: DXE2; X64; Type cast
 
wollte endlich mal sauber programmieren und mit LONG_PTR geht der Code unter XE 2 , aber nicht mehr unter DELPHI 7
(wir haben alle alle Delphi Version im Team / Projekt )

jbg 27. Okt 2011 19:29

AW: DXE2; X64; Type cast
 
Zitat:

Zitat von bernhard_LA (Beitrag 1133024)
wollte endlich mal sauber programmieren und mit LONG_PTR geht der Code unter XE 2 , aber nicht mehr unter DELPHI 7

Dann musst du eben auf das "alte" PAnsiChar zurückgreifen ;-)

jaenicke 27. Okt 2011 20:34

AW: DXE2; X64; Type cast
 
Am saubersten ist wohl für alle Versionen:
Delphi-Quellcode:
Dec(PByte(RowRotated), ScanLineBytes);
//Move Pointer
PAnsiChar macht das gleiche, hat aber einen gewissen Beigeschmack... ;-)

jbg 27. Okt 2011 21:12

AW: DXE2; X64; Type cast
 
PByte gibt es erst seit "kurzem". PAnsiChar ist älter. Es kommt also darauf an, welche Delphi Versionen man unterstützen möchte, oder ob man einfach "type PByte = ^Byte;" selbst im Code hinterlegt.

jaenicke 28. Okt 2011 04:30

AW: DXE2; X64; Type cast
 
Zitat:

Zitat von jbg (Beitrag 1133065)
PByte gibt es erst seit "kurzem". PAnsiChar ist älter.

Gut, ob es das bei Delphi 1 oder 2 schon gab, weiß ich nicht, aber weder hätte ich vermutet, dass es hier um Delphi 1 oder 2 geht (wenn es das da noch nicht gibt), noch hätte ich Delphi 3 als "seit kurzem" angesehen...

Der Code von oben funktioniert mit PByte jedenfalls auch schon bei Delphi 3, auch TRGBTriple gibt es dort.


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