AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Pointer: Zirkumflex Frage

Ein Thema von Blatt · begonnen am 15. Sep 2010 · letzter Beitrag vom 16. Sep 2010
Antwort Antwort
Seite 1 von 2  1 2      
Blatt

Registriert seit: 8. Sep 2010
17 Beiträge
 
#1

Pointer: Zirkumflex Frage

  Alt 15. Sep 2010, 21:34
Delphi-Version: 7
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!
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

AW: Pointer: Zirkumflex Frage

  Alt 15. Sep 2010, 22:05
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Blatt

Registriert seit: 8. Sep 2010
17 Beiträge
 
#3

AW: Pointer: Zirkumflex Frage

  Alt 15. Sep 2010, 22:35
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))
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Pointer: Zirkumflex Frage

  Alt 15. Sep 2010, 23:09
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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#5

AW: Pointer: Zirkumflex Frage

  Alt 15. Sep 2010, 23:11
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.
  Mit Zitat antworten Zitat
Blatt

Registriert seit: 8. Sep 2010
17 Beiträge
 
#6

AW: Pointer: Zirkumflex Frage

  Alt 15. Sep 2010, 23:15
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?
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#7

AW: Pointer: Zirkumflex Frage

  Alt 15. Sep 2010, 23:20
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.

Geändert von Satty67 (15. Sep 2010 um 23:27 Uhr)
  Mit Zitat antworten Zitat
Blatt

Registriert seit: 8. Sep 2010
17 Beiträge
 
#8

AW: Pointer: Zirkumflex Frage

  Alt 15. Sep 2010, 23:27
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..
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#9

AW: Pointer: Zirkumflex Frage

  Alt 15. Sep 2010, 23:40
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 )

Geändert von Satty67 (15. Sep 2010 um 23:47 Uhr) Grund: ich geht jetzt ins Bett
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

AW: Pointer: Zirkumflex Frage

  Alt 16. Sep 2010, 06:26
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:

Procedure Foo (Var Bar: Record BarFoo, Foobar :Integer; End; Blub : ^Byte);
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:31 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