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 Wert eines Zeigers einem anderen Zeiger zuweisen (https://www.delphipraxis.net/127989-wert-eines-zeigers-einem-anderen-zeiger-zuweisen.html)

meisteralex 22. Jan 2009 11:49


Wert eines Zeigers einem anderen Zeiger zuweisen
 
Hi Leute, hab mal wieder ein für mich sehr unverständliches Verhalten von delphi zu beafragen:


Also ich hab ne Klasse die heißt TMyClass und 2 Zeiger auf Objekte der Klasse:
o_1 : ^TMyClass;
o_2 : ^TMyClass;

Nun weißt ich dem ersten Zeiger die Adresse mittels
o_1 := @TMyClass.create();
zu, was soweit auch funktioniert.
In o_2 möchte ich nun auch gerne diese Adresse haben, was ich mittels
o_1 := o_2;
probiere und was mir völlig logisch erscheint!

Delphi meldet jedoch: Incompatible Typen ?????

Jelen 22. Jan 2009 12:03

Re: Wert eines Zeigers einem anderen Zeiger zuweisen
 
Hast Du mal versucht, die Definition so zu schreiben:
type PMyClass = ^TMyClass;

o_1 : PMyClass;
o_2 : PMyClass;

himitsu 22. Jan 2009 12:05

Re: Wert eines Zeigers einem anderen Zeiger zuweisen
 
wieso willst du da Zeiger verwenden?

Objekte sind doch schon Zeiger
und so (wie du es machen willst), würdest du dann die Zeiger auf die Variable und nicht auf das Object übertragen.


Delphi-Quellcode:
Var o_1: TMyClass;
  o_2 : TMyClass;

o_1 = o_2;

meisteralex 22. Jan 2009 12:07

Re: Wert eines Zeigers einem anderen Zeiger zuweisen
 
seit wann sind objekte (instanzen) zeiger ??
also wenn ich eine variable vom typ TMyClass deklariere
o_1 : TMyClass
dann kann ich doch davon ausgehen, dass o_1 somit vom typ TMyClass ist und nicht ein Zeiger.
Sorry ich komm aus der C++ - Welt, deshalb versteh ich vielleicht nur bahnhof

himitsu 22. Jan 2009 12:14

Re: Wert eines Zeigers einem anderen Zeiger zuweisen
 
schon immer

die Objekt-Variable ist intern nur ein Pointer, welcher auf den Speicher der Objektinstanz zeigt.
(bei .Create wird der Speicher der Objectinstanz reserviert und diesem Zeiger zugewießen)




das beweißt zwar nichts, aber glaubst du ein riesiges Object paßt in 4 Byte rein?
Zitat:

Var o: TMyClass;

SizeOf(o) = 4

meisteralex 22. Jan 2009 12:18

Re: Wert eines Zeigers einem anderen Zeiger zuweisen
 
dann versteh ich nicht, warum ich direkt ohne Derefferenzierung so etwas machen kann:

o_1 : TMyClass;
o_1 := TMyClass.create();

o_1.attrib := 33;


Rein logisch (und objektorientiert) gedacht, würde ich damit eine eigenschaft eines Zeigers ansprechen, die es für mich nicht gibt.
somit müsste es demnach heißen
o_1^.attrib := 33;

oder nimmt delphi hier in irgendeiner art und weise eine selbständige derefferenzierung vor ? so nach dem motto: "die leute sind zu dumm um zeigerarithmetik zu verstehen, deshalb machen wir es noch unlogischer" ???

Bomberbb 22. Jan 2009 12:32

Re: Wert eines Zeigers einem anderen Zeiger zuweisen
 
Das ist ein für- und wieder. Was meinst Du wie der Quelltext aussehen würde wenn Du bei allem, was Pointer ist, das explizit ansprechen musst. Nimm zum Beispiel Java, da werden alle intern gebrauchten Pointer verdeckt. Das empfinde ich als durchaus angenehm. Krasses Gegenteil: C, da wird das mit den Objekten soweit ich weiß, auch so gemacht wie Du Dir das vorstellst . Dass Delphi so ein Mischung daraus macht, finde ich selbst auch nicht so sehr angenehm, wird allerdings darauf zurückzuführen sein, dass man eine relativ alte Programmiersprache an neue Entwicklungen anpassen will/muss.

meisteralex 22. Jan 2009 12:37

Re: Wert eines Zeigers einem anderen Zeiger zuweisen
 
Nunja, eine gute Programiersprache zeichnet sich für mich im wesentlichen dadurch aus, dass sie eine einheitliche Struktur verfolgt.
Das ist einen Pointer auf der einen Seite wie ein Objekt behandeln muss und auf der anderen Seite wie einen Zeiger, sprich deutlich gegen mein Verständnis von logik.
Das ganze Konzept von C was du ansprichst bzw. C++ scheint ein bischen Gehirnschmalz zu kosten, um es zu verstehen, jedoch ist es einheitlich und eindeutig!

Nunja, anscheinend bleibt mir nichts anderes übrig als es so zu akzeptieren wie es ist....

Bomberbb 22. Jan 2009 12:41

Re: Wert eines Zeigers einem anderen Zeiger zuweisen
 
Nun, ich würde vom reinen Umgang her die Art von Java bevorzugen. Allerdings bin ich beruflich an Delphi gebunden...
Letztlich gibt es dazu wohl so viele Meinungen wie Programmiersprachen...

himitsu 22. Jan 2009 12:54

Re: Wert eines Zeigers einem anderen Zeiger zuweisen
 
Objecte werden delphiintern dereferenziert.

Delphi-Quellcode:
type TMyRec = record
       X: Integer;
     end;
     PMyRec = ^TMyRec;

Var R: PMyRec;

R^.X := 123;
R.X := 123;
bei Pointern wird auch automatisch dereverenziert (falls nötig)
- bei Objekten kann aber nicht per ^ manuell dereferenziert werden
- und bei Pointern wird es (seit 'ner Weile), als unsicher angesehn
( R^ = OK ... R^.X = hier kommt 'nen Hinweis ... R.X = gern gesehn ... wobei ich es hier blöd find, da ich eigentlich, wegen der Übersicht, lieber weiterhin R^.X gemacht hätte :cry: )


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