Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Pointer: Zirkumflex Frage (https://www.delphipraxis.net/154572-pointer-zirkumflex-frage.html)

Blatt 15. Sep 2010 21:34

Delphi-Version: 7

Pointer: Zirkumflex Frage
 
Hi, ich verstehe nicht so ganz, wann man das benutzen kann und wann nicht.
Mir scheint es so, als würde es gar nicht dynamisch geparst werden, sondern vielmehr statisch eingebaut.

Hier ein Beispiel:
Delphi-Quellcode:
//funktioniert
PByte(Dword(Offset)-i)^

//funktioniert nicht
^Byte(Dword(Offset)-i)^
Ich verstehe nicht, wo das Problem liegt..
Ich hätte damit gerechnet, dass es einfach ein Cast mit einer darauffolgenden Dereferenzierung ist..

Ebenso das hier:
Delphi-Quellcode:
//funktioniert
procedure test(ptr: PByte);

//funktioniert nicht
procedure test(ptr: ^Byte);
... PByte = ^Byte, oder nicht? Wo ist dann der Unterschied, sodass es nicht funktioniert?..

Und noch zum untypisierten Pointer:
Wie genau castet man den, vor dem Dereferenzieren oder danach, und wie genau, etc.

Vielen Dank!

alzaimar 15. Sep 2010 22:05

AW: Pointer: Zirkumflex Frage
 
Um Datentypen zu verwenden, musst Du sie deklarieren. '^Byte' ist kein Datentyp, sondern eine Spezifikation eines Datentyps.
Wenn "PByte = ^Byte" (übrigens eine Datentypdeklaration), dann ist 'PByte' ein Datentyp, der einen Zeiger auf ein Byte repräsentiert.

Blatt 15. Sep 2010 22:35

AW: Pointer: Zirkumflex Frage
 
Jo, aber das ist doch eigentlich nicht mein Problem.
Es ist bei mir doch genau umgekehrt.
Es funktioniert nur mit PByte, aber nicht mit ^Byte, wobei ich die Zirkumflex-Pointer-Spezifikation für generisch gehalten habe.. Also ich dachte, es müsste dann halt als Pointer anerkannt werden, egal wo man es auch benutzt..

z.B. bei der Variablendeklaration kann man als Typ ^Byte angeben.
Weshalb kann man diesen Typen bzw. diesen Typen mit der Pointer-'Eigenschaft' dann nicht überall als Typ angeben?
Wie z.B. als Typ bei Prozedur-Parametern, wo es wieder nur mit PByte, aber nicht mit ^Byte, funktioniert

Das kommt so herüber, als könne man diese Kombination aus Zirkumflex und Datentyp nur in Variablendeklarationen benutzen (dass ^Datentyp für einen Pointer halt ungenerisch/undynamisch ist und nur an bestimmten Stellen erlaubt ist (halt Variablendeklaration))

xZise 15. Sep 2010 23:09

AW: Pointer: Zirkumflex Frage
 
Zitat:

Zitat von Blatt (Beitrag 1049957)
Und noch zum untypisierten Pointer:
Wie genau castet man den, vor dem Dereferenzieren oder danach, und wie genau, etc.

Das müsste eigentlich immer danach sein. Weil man will ja i.d.R. den Inhalt casten und nicht den Pointer.

MfG
Fabian

Satty67 15. Sep 2010 23:11

AW: Pointer: Zirkumflex Frage
 
Es wird hier niemand ändern können, eine Einschränkung der Sprache Pascal oder des Compilers. Als Typangabe ist nur ein deklarierter Typ erlaubt, nicht die Deklaration ansich.

^ ist im Prinzip ein Operator wie @ oder + und wird so auch auf Variablen angewandt. Das er bei der Typdeklaration funktioniert liegt wohl daran, das dieser Operator eine Typumwandlung macht.

Blatt 15. Sep 2010 23:15

AW: Pointer: Zirkumflex Frage
 
ICh weiß zwar nicht, wie der Compiler das handhabt,
aber ich hätte eigentlich davor gesagt..
Weil weshalb ein Dword herausnehmen und dann manipulieren, statt direkt
mov ecx,[pointer]; mov eax,[byte ecx]?

Zum Zirkumflex-Problem:
Also ist es nun gottgegeben, dass ^Datentyp nur bei Variablendeklarationen funktioniert?

Satty67 15. Sep 2010 23:20

AW: Pointer: Zirkumflex Frage
 
Zitat:

Zitat von Blatt (Beitrag 1049981)
Also ist es nun gottgegeben, dass ^Datentyp nur bei Variablendeklarationen funktioniert?

Nein, bei Typdeklarationen und als Operator für Variablen.

..oder ein Operator, der auf Typen und Variablen angewandt werden kann. ^Byte ist ein Ausdruck und kein Typ, weshalb es auch nicht als Typ verwendet werden kann.

Blatt 15. Sep 2010 23:27

AW: Pointer: Zirkumflex Frage
 
Also

1.
type
PByte = ^Byte;

2.
var
test: ^Byte;

und 3.?

Nebenbei: weshalb kann das Record eigentlich benutzt werden, bevor es definiert ist?

type
PXxx = ^TXxx;
TXxx = record
end;

PS: Aber die Sprache Pascal scheint ja doch, trotz ihres Alters, hier und da ein paar Mängel zu haben und kommt an manchen Stellen etwas sehr statisch benutzbar herüber..

Satty67 15. Sep 2010 23:40

AW: Pointer: Zirkumflex Frage
 
Delphi-Quellcode:
type
  PXxx = ^TXxx;
Weil der Compiler hier weis, das es ein Pointer werden soll und der erforderliche Speicherplatz bekannt ist. Das der Typ zu dem Zeitpunkt nocht nicht auf Existenx geprüft wird, ist im Prinzip nur ein Feature. Ist allerdings wirklich nicht typisch für Pascal.

Delphi ist ja nicht pures Pascal, sonder Object-Pascal mit Spracherweiterungen (mit Mängeln, wie meine Rechtschreibung um diese Zeit :-D )

alzaimar 16. Sep 2010 06:26

AW: Pointer: Zirkumflex Frage
 
Das mit dem Operator war gut erklärt, stimmt aber nicht 100%.

Ich meine, das die VErwendung in einer Variablendeklaration ein Zugeständnis ist, mehr nicht. Denn eigentlich sollte sowas auch in einer Parameterdeklaration möglich sein. Isses aber nicht.
Aber vielleicht wollte N.Wirth auch sowas vermeiden:

Delphi-Quellcode:
Procedure Foo (Var Bar: Record BarFoo, Foobar :Integer; End; Blub : ^Byte);


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:14 Uhr.
Seite 1 von 2  1 2      

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