Einzelnen Beitrag anzeigen

MichaelT

Registriert seit: 14. Sep 2005
Ort: 4020 Linz
532 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Bedingte Variable

  Alt 25. Dez 2018, 23:38
In dem Record steht die Typinformation und ein Wert oder ein Pointer auf einen weiteren Verbund (record)?

Pfui. Aber ich weiß eh.

An sich wäre die Entsprechung zu dem konkreten Beispiel die Verwendung eines Variant und die Varablendeklaration der Syntactic Sugar.

In einer statisch typisierten Sprache ein Array mit Elementen unterschiedlichen Typs zu befüllen mutet eher seltsam an. Konsekutive Listen leben wie der Name schon sagt von lückenlos zusammenhängend und der Ermittlung der Position durch Erhöhung der Adresse um die Länge des beinhalteten Datentyps.

Alles andere ist eine beliebige Liste die aber seit den 90ern gerne in Arrays verpackt wird und deswegen gesellt sich an sich gerne ein Record hinzu. So einen Record braucht man selten, genommen wird dieser dauernd.

---

Damit verbleibt der untypisierte Pointer als Alternative für den 'Typ' des Elements oder eben ein Wunder Wuzi Record Typ.

---

Du verlierst jede Typinformation und musst damit alle Fälle entweder in einen Variant (Datentypen) oder ein Variantenrecord (ähnlich einer UNION in C) packen und dann je nach Typ in eine eigene Prozedur springen oder halbwegs anständig innerhalb einer verarbeiten.

Der Variantenrecord lebt davon, dass du mehrere Variablen pro Variante kannst zusammenfassen oder Bits sprechend kannst benennen. Zu einem Varianten Record gehört in der Regel eine Enumeration die den Typ beschreibt. Das wäre anstatt des x aus deinem Beispielcode.

---

Records können Methoden haben sind aber nicht vererbbar.

---

Du kannst auch einen Zeiger auf die zum Typ passende Prozedur zur Behandlung des Records selbst halten. Die Typinformation ist an sich Powidl (egal österr.). Ich habe zumeist ein dynamisches Arry mit Prozedurzeigern im Head gehalten und im Datenelement indirekt auf die 'Methode' resp. Prozedur verwiesen. Wobei eigentlich ein Record genügt und geschwind das Datenelement aus dem Array je nach Belieben und Größe der Datenmenge.


Das wäre dann sinnvoll, wenn man einen Recordtyp verstecken könnte und Prozeduren zu dessen Modifikation in ein Modul packte.

Die nächste Frage die es zu beantworten gilt ist ob du von Rekursion kannst profitieren.

---

Ich mahne etwas zur Vorsicht, da Delphi abstrakte Datentypen abseits von Klassen nicht erlaubt sauber abzubilden. Es fehlt POINTER TO RECORDTYPE ohne den RECORDTYPE außerhalb des allgemein verwendbaren Interfaces zu definieren. Du kannst den Typ nicht so einfach verstecken, sodass du sobald du Zugriff auf den Pointer selbst hast nicht die Inhalt direkt könntest modifizieren. Über 3 Units pro ADT geht es schon.

---

Borland konnte das so nie und bestenfalls über einen untypisierten Pointer, was nur die halbe Miete ist. Modula II war Turbo Pascal weit überlegen. Der reine untypisierte Pointer macht nurmehr dann Sinn, wenn man sowieso zur Laufzeit eine DLL bspw. lädt usw...

---

Delphi unterstützt IS und damit einen sicheren Typecast bei Klassen. In VB.net wurde Variant an sich auch durch Klassen abgelöst. Seit Anbeginn von Delphi ist der Fall in Klassen zu verpacken.


Wie du auf das Array zugreifen willst hast du uns ja noch nicht gezeigt.
Sorry, ich übermittle das erste Array-Element als Pointer an die Prozedur und bewege mich mittels inc() durch die Elemente.
Das wesentliche was die Codes unterscheidet sind Zeiger auf verschiedene Records.

Geändert von MichaelT (25. Dez 2018 um 23:42 Uhr)
  Mit Zitat antworten Zitat