![]() |
Re: Adresse eines dynamischen typisierten Arrays als Paramet
Zitat:
Bei deinem Vorhaben würdest du glaub ich um untypisierte Pointer nicht umher kommen. Dann wird das ganze ähnlich unschön wie in C :D Wird auch viel Casterei... @Chewie: Stümmt ja... Fixe Arrays, Records und generische Typen sind per Standard Call-by-Value, und Dyn. Arrays und Objekte sind immer Call-by-Reference. Wie es bei Records aussieht, die Objekte und dyn. Arrays beinhalten aussieht weiss ich es nicht genau. Das gibt u.U. ein heiloses Durcheinander :). Zusätzlich werden Objekte und dyn. Arrays immer im Heap angelegt, und lok. Variablen und fixe Arrays gewöhnlich auf dem Stack. @sniper_w: Bitte einen eigenen Thread auf machen ;) |
Re: Adresse eines dynamischen typisierten Arrays als Paramet
Zitat:
Einen ganz neuen Zeiger wird man, je nach Parameteranzahl, wohl nicht benötigen. \\edit: Die ersten 3 Paramenter werden imho in Delphi via Register übergeben (wenn möglich), und alle weiteren werden auf den Stack gepackt. Und ein Pointer ist ja im Grunde erstmal nix anderes als ein Integer. |
Re: Adresse eines dynamischen typisierten Arrays als Paramet
Zitat:
Das ist kein Durcheinander, sondern eine logische Hierarchie - man muss nur vorne anfangen ;) |
Re: Adresse eines dynamischen typisierten Arrays als Paramet
Hi @ all,
um nochmal auf das obige Beispiel zurück zu kommen, ohne das Array habe ich es durchaus geschafft eine abgewandelte Klasse anstatt einer Basisklasse einer Funktion als Parameter zu übergeben obwohl in der Deklaration der Funktion die Basisklasse verlangt war und zwar so:
Delphi-Quellcode:
Ich weiss zwar nicht so genau warum es so ging, aber es ging immerhin ;-)
type
PMyClass=^TBasicClass; procedure Foo(Class:PMyClass) begin ..... end; procedure Tuwas; var MyClass:TDerivedClass; begin Foo(@MyClass); end; Mit freundlichen Grüßen, Thomas Tschofenig |
Re: Adresse eines dynamischen typisierten Arrays als Paramet
Aus objektorientierter Sicht, benutzt man zum Verwalten von Klassen kein Array, sondern TObjectList. TList kannst du natürlich auch nehmen.
|
Re: Adresse eines dynamischen typisierten Arrays als Paramet
Hi Sprint,
da hast du sicherlich recht, aber dann müssen die ganze Zeit wieder die Typecasts herhalten wenn ich mehrere Klassen in einer Liste habe :-( Mit freundlichen Grüßen, Thomas Tschofenig |
Re: Adresse eines dynamischen typisierten Arrays als Paramet
Zitat:
Edit: \\ Sorry. Natürlich musst du ein Typcast machen. |
Re: Adresse eines dynamischen typisierten Arrays als Paramet
Zitat:
Delphi-Quellcode:
Geht genau so, und das deshalb, weil in Delphi ohnehin alle Objekte Pointer in den Heap sind, und das weiss der Compiler, und macht es dir deshalb einfach/lesbarer :)
procedure Foo(Class: TBasicClass);
begin ... end; procedure Tuwas; var MyClass:TDerivedClass; begin Foo(MyClass); end; Aber bei der Sache mit dem Array übergibst du ja keine Variable vom Typ "Klasse", sondern "Array". Ein Array weiss aber rein garnichts von Ableitung o.ä., und schon garnichts darüber was es im einzelnen für Werte beinhaltet. Für den Compiler sind das dann grundverschiedene Typen, da das eine Array ja nicht vom anderen Abgeleitet ist/sein kann. Was in den Arrays steht ist ihm wurscht ;). TList mit etwas Casterei (lässt sich mit ein paar Hilfsvariablen der möglichen Typen evtl. etwas einschränken) ist aber, wie Sprint richtigerweise sagt, "runder". Das denke ich auch. Gruss, Fabian |
Re: Adresse eines dynamischen typisierten Arrays als Paramet
Hi Fabian,
sicherlich ist es auch in meinem Fall besser TObjectlist oder änhliches zu verwenden, ich würds ja auch gerne verwenden, nur die Typcasterei geht mir auf die Nerven. Gibt nicht eine Möglichkeit mit der man sowas wie den folgenden Block vereinfachen könnte ??
Delphi-Quellcode:
Liebe Grüße und vielen Dank,
if Class is TBaseClass then
(Class as TBaseClass).Tuwas else if Class is TDerivedClass then (Class as TDerivedClass).Tuwas; Thomas |
Re: Adresse eines dynamischen typisierten Arrays als Paramet
Naja, so richtig nicht. Man kann es in der Laufzeit etwas optimieren, da der "as"-Operator nochmals eine "is"-Prüfung macht. So wie du es machst, bist du zum Zeitpunkts des Casts ja schon sicher die richtige Klasse in der Hand zu haben -> direkt casten:
Delphi-Quellcode:
Ich hab mir, wenn ich sehr viel so zugreifen musste, immer für jeden Typ eine lokale Variable angelegt, und dieser dann das gefundene zugewiesen. Dann kann man mit der ja weiter machen. Für so kurze Dinger wie oben gibt es imho keinen komfortableren Weg. (Wäre aber auch daran interessiert :))
if Class is TBaseClass then
TBaseClass(Class).Tuwas else if Class is TDerivedClass then TDerivedClass(Class).Tuwas; Gruss, Fabian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:28 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