Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Pointer als Parameter einer Methode


GruppeCN - Sa 17.09.05 21:57
Titel: Pointer als Parameter einer Methode
Hallo,

ich kenn mich mit Pointern nicht wirklich gut aus und benutzte bis jetzt immer den @ Operator. Allerdings glaube ich, dass es da eine andere Möglichkeit gibt, ich hab nur keinen Plan, wie ich das machen muss.

Also: Ich lege einen Pointer Typen an (type pBeispiel = ^TBeispiel). Jetzt habe ich eine Funktion, die einen Parameter vom Typ pBeispiel (also einen Pointer) erwartet. Ich lege jetzt eine Instanz der Klasse TBeispiel an und möchte an meine Funktion einen Pointer auf darauf übergeben. Wie geht das, ohne das @ Zeichen zu benutzen?


BenBE - Sa 17.09.05 22:20


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
type
    PBeispiel =^TBeispiel;

procedure Foo(B: PBeispiel);
begin
    //Do something
end;

procedure Bar;
var
    B: TBeispiel;
    PB: PBeispiel;
begin
    PB := @B;
    Foo(PB);
    Foo(@B);
end;


GruppeCN - So 18.09.05 11:14

Hi,

danke für die Antwort, aber ich möchte eben nicht den @ Operator verwenden.


Alstar - So 18.09.05 11:26

Ich stelle mir die Frage, warum du den @-Operator nicht verwenden möchtest. Den gibt es, seit es Pointer gibt. Ist doch genauso, als wenn du einen String in ein PChar ohne PChar() umwandeln möchtest. Aber vielleicht proberst du es mal mit

Delphi-Quelltext
1:
PB := Pointer(P);                    

bzw

Delphi-Quelltext
1:
PB := TPointer(P);                    


(beides ungetestet!)

Alstar


Motzi - So 18.09.05 11:44

Zum Thema Pointer will ich (wiedereinmal) auf mein umfangreiches Tutorial verweisen, dass auf meiner Homepage zu finden ist: http://www.manuel-poeter.de
Dort solltest du (hoffentlich) die Antworten auf so ziemlich alle Fragen/Probleme finden..! ;)


GruppeCN - So 18.09.05 11:51

Das Tutorial ist ganz gut, aber ich hatte mir das vorher schon zu Gemüte geführt. Allerdings hilft mir das auch nicht weiter. Meine Frage ist hauptsächlich, ob es eine alternative zum @ Operator gibt, oder nicht?

PS: Das mit dem Pointer() führt zu einem Zugriffsfehler.


Motzi - So 18.09.05 11:59

Was willst du denn für eine Alternative?? Der @Operator liefert dir die Adresse, an der der jeweilige Operand (meistens wohl eine Variable) liegt. Was soll es da für Alternativen geben? Entweder du brauchst eine Adresse, dann brauchst du den @-Operator, oder du hast bereits eine Adresse (weil du bereits mit einem Pointer arbeitest), dann brauchst du meistens keinen @-Operator mehr (außer du arbeitest mit Pointern auf Pointer).

Ich versteh nicht, was du da für eine Alternative willst/brauchst.. :?


Amateur - So 18.09.05 12:27

gibt es nicht auch noch die funktion addr() die genauso wie der @ operator funktioniert? dann wäre das doch die alternative. bin mir aber net sicher


delfiphan - So 18.09.05 12:35

Addr() ist äquivalent zu @ aber wird durch die $T-Direktive nicht beeinflusst. Das alles würde auch in der Hilfe stehen.


Motzi - So 18.09.05 12:39

Gut Addr() kann man vielleicht als Alternative sehen:
OH hat folgendes geschrieben:

Delphi-Quelltext
1:
function Addr(X): Pointer;                    


Description

The Addr function returns the address of a specified object. X is any variable, procedure or function identifier. The result is a pointer to X.

The result of Addr is of the predefined type Pointer, which means that it is assignment-compatible with all pointer types but can't be dereferenced directly without a typecast.

Note: Addr is equivalent to the @ operator except that it is unaffected by the $T compiler directive.

Ob die Verwendung von Addr anstatt @ sinnvoll ist, lass ich allerdings dahingestellt..!


BenBE - So 18.09.05 18:07

Die Verwendung des @-Operators ist daher sicherer, weil er stärker ins Auge sticht und damit der entsprechende Source schneller auffindbar ist. Addr wirkt wie eine "normale" Funktion und ist daher für unübersichtliche Sources erst recht nicht zu empfehlen (Verwirrt nur).


GruppeCN - So 18.09.05 20:04

Hm, jetzt wäre es noch gut zu wissen, was $T heißt?


Motzi - So 18.09.05 20:34

user profile iconGruppeCN hat folgendes geschrieben:
Hm, jetzt wäre es noch gut zu wissen, was $T heißt?

Ich gehe mal davon aus, dass du ein Delphi hast, und dass dieses auch über eine Online-Hilfe verfügt..! Hab ich recht? :roll:


BenBE - So 18.09.05 20:37

Einmal F1 drücken, bitte:

DOH hat folgendes geschrieben:
Typ Schalter
Syntax {$T+} oder {$T-}
{$TYPEDADDRESS ON} oder {$TYPEDADDRESS OFF}
Vorgabe (Kontrollfeld) {$T-}

Delphi-Quelltext
1:
{$TYPEDADDRESS OFF}                    

Bereich Gesamter Text

Anmerkungen

Die Direktive $T legt fest, welche Zeigertypen vom Operator @ generiert werden, und steuert deren Kompatibilität.
Im Status {$T-} ist das Ergebnis des Operators @ immer ein Zeiger ohne Typ (Pointer), der mit allen übrigen Zeigertypen kompatibel ist. Wenn @ im Status {$T+} für einen Variablenverweis verwendet wird, ist das Ergebnis ein typisierter Zeiger, der nur mit Pointer und den übrigen Zeigern auf den Variablentyp kompatibel ist.
Im Status {$T-} sind festgelegte Zeigertypen (also nicht vom allgemeinen Typ Pointer) nicht kompatibel (auch wenn sie Zeiger auf denselben Typ sind). Im Status {$T+}[delphi] sind Zeiger, die auf denselben Typ zeigen, kompatibel.