Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zeigerarithmetik (https://www.delphipraxis.net/114867-zeigerarithmetik.html)

Viktorii 2. Jun 2008 08:14


Zeigerarithmetik
 
Hallo,

ich möchte bei einem Pointer gerne einen Offset hinzuaddieren, bekomme es aber nicht hin. So habe ich es versucht:

Delphi-Quellcode:
pDataWithOffSet := pData + (i * $10000);
Kommt leider die Fehlermeldung:

Zitat:

[Pascal Fehler] xyz.pas(340): E2015 Operator ist auf diesen Operandentyp nicht anwendbar
:(


Wie mache ich es richtig?

Vielen Dank

Muetze1 2. Jun 2008 08:24

Re: Zeigerarithmetik
 
Benutze Increment. Beachte aber, dass die Funktion um die Größe des Pointer (bei typisierten Pointer) erhöht!

Ich gehe in deinem Beispiel mal davon aus, dass pDataWithOffset ein PByte oder PChar ist, also ein Pointer auf ein Byte.

Delphi-Quellcode:
pDataWithOffSet := pData;
Inc(pDataWithOffset, i * $10000);
Wenn nicht, dann einfach den Wert einfach durch die Grösse deines Datentyps teilen. Also so:

Delphi-Quellcode:
pDataWithOffSet := pData;
Inc(pDataWithOffset, (i * $10000) div sizeof(pDataWithOffset^));

SirThornberry 2. Jun 2008 09:11

Re: Zeigerarithmetik
 
ich caste den Pointer einfach immer zu einem Cardinal denn ein Pointer ist ja nichts anderes als eine ausschließlich positive Speicheradresse.

Muetze1 2. Jun 2008 10:05

Re: Zeigerarithmetik
 
Zitat:

Zitat von SirThornberry
ich caste den Pointer einfach immer zu einem Cardinal denn ein Pointer ist ja nichts anderes als eine ausschließlich positive Speicheradresse.

Da Casts auch immer Sicherheitsmechanismen ausser Kraft setzen, versuche ich immer den "offiziellen" Weg zu gehen. Ansonsten ist dieser Weg natürlich auch möglich.

SirThornberry 2. Jun 2008 10:08

Re: Zeigerarithmetik
 
wohl war, die Sicherheitsmechanismen werden da außer kraft gesetzt - Aber das ist ja bei Pointerarthmetik sowieso der Fall wenn man diesen dann irgendwo hin zeigen lässt wo eigentlich nix mehr ist.

himitsu 2. Jun 2008 12:17

Re: Zeigerarithmetik
 
bei PChar, PAnsiChar und PWideChar kann man sowas machen.

Delphi-Quellcode:
pDataWithOffSet := PAnsiChar(pData) + (i * $10000);
allerdigns wird da immer in Einheitengröße addiert

PWideChar(P) + 9 = Cardinal(P) + (2 * 9) .. da SizeOf(WideChar) = 2

also in Bezug auf Delphi 2008 PChar besser nicht verwenden (wegen Standardunterstüzung von Unicode ... PChar = PWideChar)

Apollonius 2. Jun 2008 17:04

Re: Zeigerarithmetik
 
In Delphi 2008 soll übrigens ein Compilerschalter kommen, der Zeigerarithmetik erlaubt. Das stand in irgendeinem Codegear-Blog - dort hieß es übrigens auch, dass es ursprünglich ein Bug war, dass Inc für Zeiger funktioniert, dieser "Bug" dann aber aufgrund des Aufschreis der Beta-Tester nicht gefixt wurde.

Muetze1 2. Jun 2008 20:56

Re: Zeigerarithmetik
 
Zitat:

Zitat von Apollonius
...dort hieß es übrigens auch, dass es ursprünglich ein Bug war, dass Inc für Zeiger
funktioniert, dieser "Bug" dann aber Aufgrund des Aufschreis der Beta-Tester nicht gefixt wurde.

Naja, sie haben es nachher auch so dokumentiert und z.T. selber so genutzt.


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