Delphi-PRAXiS

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);

Blatt 16. Sep 2010 09:46

AW: Pointer: Zirkumflex Frage
 
Also ist es wirklich nur sehr beschränkt implementiert und nicht so generisch wie in C?
uff, (beschäftige mich seit 2 Tagen mit Delphi) also manche Dinge stören mich echt erheblich an Object-Pascal und andere, sinnvolle Features vermisse ich sehr, bei denen ich nie gedacht hätte, dass so etwas in einem (halbwegs) aktuellen Delphi-Compiler fehlen würde..
Naja, danke für die Antworten

Hawkeye219 16. Sep 2010 10:23

AW: Pointer: Zirkumflex Frage
 
Hallo,
Zitat:

Zitat von alzaimar (Beitrag 1049998)
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.

Liegt es nicht eher daran, dass zwei Typen auch dann als unterschiedlich gelten, wenn sie die gleiche Struktur besitzen, aber unabhängig voneinander definiert wurden?
Delphi-Quellcode:
var
  a: ^Byte;
  b: ^Byte;
begin
  a := b; // Fehler: inkompatible Typen
end;
Kompatible Typen bei der Verwendung von Prozedurparametern erreicht man, wenn für die Typvereinbarung ein Name eingeführt wird, der auf beiden Seiten - beim Aufruf und bei der aufgerufenen Routine - verwendet wird.

Gruß Hawkeye

p80286 16. Sep 2010 16:52

AW: Pointer: Zirkumflex Frage
 
Was die Typdeklaration angeht, kann ich mich erinnern, daß zuerst alle "Namen" gesammelt werden, und dann erst diesen Namen die entsprechenden Typen zugewiesen werden.
also ungefähr so:
Delphi-Quellcode:
Type
 prec  =^rectyp;
 rectyp = record..........end;

 rec   =^record..........end;
 rectyp = record..........end;
Wenn man es mit dem zweiten Konstrukt versucht, bekommt man sofort die Meldung "Bezeicher erwartet" um die Ohren gehauen.
Was eigentlich hinreichend genau ist, ein Pointer weist immer auf einen beliebigen Typen hin.
Die sog. Typisierung ist eigentlich nur ein Schmankerl um ein paar Fehler zu vermeiden.

Für ein funktionierendes Programm ist so etwas durchaus ausreichend:
Delphi-Quellcode:
Type
  TListenelement = record
                     Daten : irgendwas;
                     next : pointer;
                     last : pointer;
                   end;
var
  ErstesElement,
  LetztesElement,
  AktuellesElement : pointer;
aber so ist es etwas einfacher:
Delphi-Quellcode:
Type
  PListenelement = ^TListenelement;
  TListenelement = record
                     Daten : irgendwas;
                     next : PListenelement;
                     last : PListenelement;
                   end;
var
  ErstesElement,
  LetztesElement,
  AktuellesElement : PListenelement;
Edith:
und dereferenzieren kann ich immer noch mit allen möglichen Typen!

Gruß
K-H


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