Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Von C++ in Delphi - Mal wieder Pointer... (https://www.delphipraxis.net/144786-von-c-delphi-mal-wieder-pointer.html)

MisterNiceGuy 16. Dez 2009 17:59


Von C++ in Delphi - Mal wieder Pointer...
 
Hi, ich versuche folgende Zeile von C++ in Delphi zu übersetzen:

Code:
m_pBits = (void*)((BYTE*)(m_pMemory) + 20);
m_pBits und m_pMemory sind Pointer.

Ich verstehe die Zeile so, dass der Zeiger m_pBits nicht mehr auf m_pMemory zeigt, sondern auf
m_pMemory+20. Frage ist nur, wie übersetz ich das in Delphi?

Danke im Voraus :)

edit:
Delphi-Quellcode:
m_pBits := Ptr(cardinal(m_pMemory) + 20);
...lässt sich kompilieren, aber ob's stimmt ist die Frage.

Namenloser 16. Dez 2009 18:04

Re: Von C++ in Delphi - Mal wieder Pointer...
 
Kenn mich mit C zwar nicht aus, würde aber mal vermuten, dass es sich so nach Delphi übersetzen lässt:
Delphi-Quellcode:
m_pBits := Pointer(Integer(m_pMemory) + 20));
Erklärung: VOID ist ja "nichts", also müsste void* ein untypisierter Pointer sein. BYTE* ist ein Pointer auf ein Byte, wahrscheinlich um sicher zu gehen, dass 20 Bytes nach vorne gesprungen wird und nicht 20 Integer-Breiten o.ä. (gibt's ja in Delphi bei typisierten Pointern auch). In Delphi kann man aber zu Pointern keinen Wert hinzuaddieren, daher der Typecast nach Integer.

[edit]
Okay, du hast ja fast das gleiche... sollte beides funktionieren, denke ich.
[/edit]

Mithrandir 16. Dez 2009 18:05

Re: Von C++ in Delphi - Mal wieder Pointer...
 
Mal so aus dem Kopp:

Delphi-Quellcode:
m_pBits := Pointer(BYTE(m_pMemory) + 20);
Geht das?

Roter Kasten:

Nee du. :mrgreen: Warum machst du denn jetzt aus dem "Byte" einen Cardinal? ;)
@NamenLozer: Ich würde aber nicht nach Integer casten, sondern nach "Byte".

Namenloser 16. Dez 2009 18:06

Re: Von C++ in Delphi - Mal wieder Pointer...
 
Zitat:

Zitat von Daniel G
Nee du. :mrgreen: Warum machst du denn jetzt aus dem "Byte" einen Cardinal? ;)
@NamenLozer: Ich würde aber nicht nach Integer casten, sondern nach "Byte".

Da steht aber nich BYTE, sondern BYTE*.

Mithrandir 16. Dez 2009 18:08

Re: Von C++ in Delphi - Mal wieder Pointer...
 
Tatsache. Gut, dann wird aus dem generischen Pointer ein Byte-Pointer. Erklärt aber immer noch nicht den Integer bzw. Cardinal. Dann bräuchten wir einen pByte...

//Edit: Hab jetzt deinen Nachtrag gelesen. Sowas geht in Delphi nicht? Hmm...

Namenloser 16. Dez 2009 18:10

Re: Von C++ in Delphi - Mal wieder Pointer...
 
Zitat:

Zitat von Daniel G
Dann bräuchten wir einen pByte...

Dann versuch mal, PByte(m_pMemory+20)PByte(m_pMemory)+20 unter Delphi zu kompilieren :wink:

[edit]
Zu langsam... man, hier überschlagen sich ja die Ereignisse :mrgreen:
[/edit]

Neutral General 16. Dez 2009 18:14

Re: Von C++ in Delphi - Mal wieder Pointer...
 
Zitat:

Zitat von NamenLozer
Zitat:

Zitat von Daniel G
Dann bräuchten wir einen pByte...

Dann versuch mal, PByte(m_pMemory+20) unter Delphi zu kompilieren :wink:

[edit]
Zu langsam... man, hier überschlagen sich ja die Ereignisse :mrgreen:
[/edit]

Funktioniert, wenn m_pMemory ein Zahlendatentyp ist und kein Pointer ;)
Was aber auch funktioniert:

Delphi-Quellcode:
PByte(Cardinal(m_pMemory)+20);
oder

Delphi-Quellcode:
Pointer(Cardinal(m_pMemory)+20);
oder auch

Delphi-Quellcode:
Pointer(PByte(Cardinal(m_pMemory)+20));
:mrgreen:

himitsu 16. Dez 2009 18:14

Re: Von C++ in Delphi - Mal wieder Pointer...
 
Delphi-Quellcode:
m_pBits := Pointer(PByte(m_pMemory) + 20);
würde/sollte mit aktivierter Zeigerarithmetik funktionieren.

ist wie
Delphi-Quellcode:
m_pBits := Pointer(PAnsiChar(m_pMemory) + 20);
nur daß bei PChar-ähnlichen Typen die Zeigerarithmetik immer aktiv ist.

welchen Typen hat denn m_pBits?

Mithrandir 16. Dez 2009 18:15

Re: Von C++ in Delphi - Mal wieder Pointer...
 
Das Delphi so eine Pointerarithmetik nicht beherrscht ist irgendwie... bitter. Naja, hab mich noch nie so sehr mit Pointern auseinandersetzen müssen, wie jetzt im Studium in C, daher merke ich das etwas... später. :mrgreen:

//Edit: (Was ist denn heute los?) :wall:
Also gehts doch? Was ein HickHack. Wie schaltet man die denn ein, und ab welcher Version geht das? Weil, ich finde einen pByte schöner als einen pAnsiChar. Bei pByte sehe ich den Bereich immerhin auf dem ersten Blick.

MisterNiceGuy 16. Dez 2009 18:16

Re: Von C++ in Delphi - Mal wieder Pointer...
 
m_pBits ist auch ein Pointer.


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