Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Wie erstellt man eine Variable mit verschiedenen variablen
musiktiger - Di 06.05.03 13:56
Titel: Wie erstellt man eine Variable mit verschiedenen variablen
Hallo ihr,
ich weiß der Titel klingt ein bisschen kömisch :nut: , aber ich weiß es nicht anders so kurz zu beschreiben.
Nun die lange Beschreibung:
Ich will einen Array erstellen in dem ich Daten für Kreise, Rechtecke und Trapeze speichern kann.
Also soll der Array nicht immer die gleichen Datentypen enthalten, sondern manchmal einen Record in dem die Kreisdaten (Radius, Mittelpunkt) gespeichert sind oder einen anderen Record, der die Rechteckdaten (Punkte: LinksOben, LinksUnten) enthält.
Hat jemand das verstanden und kann mir da helfen?
Ich wäre super dankbar! :D
Gruß,
MuTi
maximus - Di 06.05.03 15:04
Klar..habs verstanden.
Ich würd das array mit headern machen...
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| type TGeoKind = (gkCirc, gkQuad,gkTriangle...); tHeader = record kind : TGeoKind; ptr: Pointer; end;
TGeoArr : array of THeader; |
...in denen die art des records gespeichert ist und einen pointer zu dem tatsächlichen record. Bein erstellen des arrays musst du den speicher, für die einzelnen records, dann selbst reservieren (getMem, freeMem). Beim erstellen speicherst du im header, die art(kind) und die adresse(ptr) des recods ab...so kannst du später zwischen den verschiedenen records, mittels kind, differenzieren!
Wenn du fragen zu pointern hast, sag bescheid.
musiktiger - Di 06.05.03 15:19
Vielen Dank Maximus!
Puh, ich glaube ich müsste dazu erstmal ganz schön viel Neues verstehen und das dauert bei mir immer so lange. :?!?:
Wenn es aber nicht einfacher geht probiere ich es natürlich so. :nixweiss:
Ich hätte gedacht, dass man zum Beispiel die variable GeomObjekt mehrfach deklarieren könnte und dann irgendwie auswählen kann welche Deklaration man gerade meint. Das aber in der Unit selbst.
Verstehe nämlich noch nicht sooo viel von Headern und Pointern und so. :roll:
Tino - Di 06.05.03 15:36
Hi,
eventl. ist auch ein normal Record mit varianten Teilen sinnvoll. Also so:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| type TGeoKind = (gkCirc, gkQuad,gkTriangle...); tHeader = record // Hier allgemeine Variablen definieren
Case kind: TGeoKind of gkCirc: (VariableCirc1, VariableCirc2: Integer); gkQuad: (VariableQuad1, VariableQuad2: Integer); end;
TGeoArr : array of THeader; |
Verbraucht eventl. etwas mehr speicher aber es ist um einige einfacher zu programmieren.
Gruß
Tino
Udontknow - Di 06.05.03 17:25
Hier gab es doch erst letztens ein ganz ähnliches Problem, wo es um Flächen ging... Ich würde eine objektorientierte Variante nehmen, also TObject-Nachfahren erstellen, welche dann in einer Objektliste verwaltet würden. Je nach Nachfahre gibt es dann unterschiedliche "Variablen" (bei TRechteck Länge und Breite, Bei TKreis Radius etc).
Cu,
Udontknow
Tino - Di 06.05.03 18:34
maximus hat folgendes geschrieben: |
@VariableRecordTeile: hatte ich auch drann gedacht...aber dann müssen die daten-teile doch immer gleich gross sein...? |
Ne, eigentlich nicht!
Aber letztendlich würde ich die Objekt-Lösung nehmen.
Gruß
Tino
musiktiger - Mi 07.05.03 14:34
Vielen Dank,
ich habe mir die Problematik in dem anderen Forum angesehen, aber nicht herausgefunden wie mir das helfen könnte.
Ich habe mal das von Tino ausprobiert, aber es würden dann ja in jedem Record auch die Variablen z.B. für einen Kreis bereitgestellt werden, auch wenn ich ein Rechteck speichere.
Ich nehme glaube ich die Anfangslösung von Maximus.
Damit nutze ich gleich die Gelegenheit und versuche mich mal mit Pointern. Wird sowieso mal Zeit, dass ich das verstehe.
Vielen Dank an alle, ihr habt mir sehr geholfen! :D
Gruß,
MuTi
Tino - Mi 07.05.03 15:06
Hallo!
musiktiger hat folgendes geschrieben: |
Ich habe mal das von Tino ausprobiert, aber es würden dann ja in jedem Record auch die Variablen z.B. für einen Kreis bereitgestellt werden, auch wenn ich ein Rechteck speichere. |
Nein, die einzelnen Varianten-Teile des Rekords teilen sich den Speicherbereich.
musiktiger hat folgendes geschrieben: |
Damit nutze ich gleich die Gelegenheit und versuche mich mal mit Pointern. Wird sowieso mal Zeit, dass ich das verstehe. |
Dann schau Dir auch mal das neue Tutorial über Pointer in der Tutorial-Sparte an. Könnte hilfreich sein!
Gruß
Tino
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!