![]() |
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:
Ich verstehe nicht, wo das Problem liegt..
//funktioniert
PByte(Dword(Offset)-i)^ //funktioniert nicht ^Byte(Dword(Offset)-i)^ Ich hätte damit gerechnet, dass es einfach ein Cast mit einer darauffolgenden Dereferenzierung ist.. Ebenso das hier:
Delphi-Quellcode:
... PByte = ^Byte, oder nicht? Wo ist dann der Unterschied, sodass es nicht funktioniert?..
//funktioniert
procedure test(ptr: PByte); //funktioniert nicht procedure test(ptr: ^Byte); Und noch zum untypisierten Pointer: Wie genau castet man den, vor dem Dereferenzieren oder danach, und wie genau, etc. Vielen Dank! |
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. |
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)) |
AW: Pointer: Zirkumflex Frage
Zitat:
MfG Fabian |
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. |
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? |
AW: Pointer: Zirkumflex Frage
Zitat:
..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. |
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.. |
AW: Pointer: Zirkumflex Frage
Delphi-Quellcode:
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.
type
PXxx = ^TXxx; Delphi ist ja nicht pures Pascal, sonder Object-Pascal mit Spracherweiterungen (mit Mängeln, wie meine Rechtschreibung um diese Zeit :-D ) |
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 13:37 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