Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Pointermath (https://www.delphipraxis.net/202798-pointermath.html)

Laufente 10. Dez 2019 09:48

Delphi-Version: 2009

Pointermath
 
Hallo, koennte mal jemand checken ob folgendes kompiliert in aktueller Delphi version (habe leider nur altes Delphi): Das sollte aber mit jedem PointType (d.h. auch mit array) funktionieren. Vielleicht sollte ich mal updaten...

type
TiPoint = array[0..1] of integer; // array funktioniert nicht
// TiPoint = record x, y: integer; end; // record funktioniert
{$POINTERMATH ON} PPoints = ^TiPoint; {$POINTERMATH OFF}
var
sharedPoints: array of TiPoint;
points: PPoints; point: TiPoint;
begin
setLength( sharedPoints, 10);
sharedPoints[1][0] := 10;
sharedPoints[1][1] := 11;
//sharedPoints[1].x := 10;
//sharedPoints[1].y := 11;
points := @sharedPoints[0];
point := points[1]; // point kopieren
point := (points+1)^; // sollte den gleichen point holen

Neutral General 10. Dez 2019 10:21

AW: Pointermath
 
points + 1 ist 1 Byte weiter, nicht 1 Index weiter. Das war aber schon immer so.
Die letzte Zeile muss
Delphi-Quellcode:
point := (points + SizeOf(TiPoint))^;

heißen. Das sollte mit der Array und der Record-Variante funktionieren.


Edit: Dein Code funktioniert bei mir.

Stevie 10. Dez 2019 10:35

AW: Pointermath
 
Zitat:

Zitat von Neutral General (Beitrag 1453154)
points + 1 ist 1 Byte weiter, nicht 1 Index weiter. Das war aber schon immer so.

Nö, genau dafür ist ja {$POINTERMATH ON}

Dass die Array Syntax auf dem Pointer nicht funktioniert, sieht nach nem Compiler Glitch aus, da der Fehler darauf hinweist, dass er den Indexzugriff auf den Typen hinter dem Pointer durchführt:

E2010 Incompatible types: 'TiPoint' and 'Integer'

Laufente 10. Dez 2019 16:49

AW: Pointermath
 
Zitat:

Zitat von Neutral General (Beitrag 1453154)
Edit: Dein Code funktioniert bei mir.

Danke, und welche Delphi Version funktioniert nun garantiert (ohne die E2010 message)?


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