ich habe folgendes Problem im Bezug auf verkettete Records für eine Art Datenbank (arbeitet mit sortierten Listen). Es soll gespeichert werden, für welche Schlüssel die selben Werte verwendet werden und umgekehrt sollen die Werte Bezug zum dazugehörigen Schlüssel haben. Ich wollte vermeiden, mit Pointern zu arbeiten. Ich denke euch wird klar was ich meine wenn ihr euch folgendes (so nicht funktionierendes) Beispiel mal anseht (mal abgesehen vom Sinn des Beispiels ):
type
TWerteRecord = record
Eigenschaft: String;
SchluesselRecord: TSchluesselRecord;
end;
TWerteArray = Array of TWerteRecord;
TSchluesselRecord = record
Schluessel: String;
SelbeInhalte: TWerteArray;
end;
TSchluesselArray = Array of TSchluesselRecord;
var
Werte: TWerteArray; // sortierte Liste für Werte (nach Werten sortiert)
Schluessel: TSchluesselArray; // sortierte Liste für Schlüssel (nach Schlüsseln sortiert)
Wie stelle ich nun im WerteRecord den Bezug zum SchluesselRecord her (wenn der SchluesselRecord erst später definiert wird)?
Wäre dankbar für Antworten.
Gruß
Jay
Zuletzt geändert von Jay am Mi 18. Apr 2012, 17:05, insgesamt 2-mal geändert.
Das wäre ja eine verkettete Liste. Da ich aber mit Arrays arbeite, brauche ich keine verkettete Liste sondern ich muss eben nur den Bezug zwischen den Records herstellen. Damals hab ich das mit Index-Nummern gemacht aber ich wollte es mal auf direktem Wege lösen (ohne den Umweg über eine Nummern zu machen).
u-boot hat geschrieben:Grundsätzlich gibt es 2 Möglichkeiten ... entweder Zeiger zwischen den Listen, oder Arrayeinträge kopieren (bzw in 2 Listen eintragen).
Da du Pointer ausschliesst bleibt dir noch das zweite. Praktikabel finde ich das aber nicht unbedingt ... naja musst selber wissen
u-boot hat geschrieben:Grundsätzlich gibt es 2 Möglichkeiten ... entweder Zeiger zwischen den Listen, oder Arrayeinträge kopieren (bzw in 2 Listen eintragen).
Da du Pointer ausschliesst bleibt dir noch das zweite. Praktikabel finde ich das aber nicht unbedingt ... naja musst selber wissen
Also gibt es keine andere Möglichkeit?
Wär mir nicht bekannt (was nicht viel heissen muss). Nur weil jemand Zeiger nicht mag, heisst es nicht, dass sie schlecht sind. .
Jedenfalls wenn du einen gemeinsamen Datensatz in 2 listen haben willst, ist der Pointer die Methode schlechthin.
Ob es dafür jetzt noch andere Komponenten gibt, die das evtl bewerkstelligen weiss ich nicht. Letztenendes würden sie aber sicher auf Pointer zurückgreifen.
Dann muss ich mich mal genauer mit Pointern auseinandersetzen. Eine andere Möglichkeit wäre noch, Objekte statt Records zu verwenden, da man Objekte auch schon vor der eigentlichen Deklaration deklarieren kann. Naja 2 Records (A->B, B->A) zu verketten wäre einfacher gewesen.
u-boot hat geschrieben:Grundsätzlich gibt es 2 Möglichkeiten ... entweder Zeiger zwischen den Listen, oder Arrayeinträge kopieren (bzw in 2 Listen eintragen).
Da du Pointer ausschliesst bleibt dir noch das zweite. Praktikabel finde ich das aber nicht unbedingt ... naja musst selber wissen
Also gibt es keine andere Möglichkeit?
Wär mir nicht bekannt (was nicht viel heissen muss). Nur weil jemand Zeiger nicht mag, heisst es nicht, dass sie schlecht sind. .
Man konnte etwas nutzen was nur intern ein Zeiger ist, wie Class.
Ich muss MAC und mir gerade widersprechen. Es gibt natürlich noch eine Möglichkeit.
Man kann natürlich eine Liste bei jedem zugriff neu sortieren lassen.
Geht ganz einfach umzusetzen, wenn man über die Properties eines Objekts auf die Liste zugreift.
Elegant zu programmieren wär es schon, allerdings ist es wohl nicht gerade flott ... je nachdem wie oft man eben sortiert.
Hallo Jay,
das was du machst sieht nicht sehr elegant aus. Wenn man Relationen zwischen Daten hat, dann packt man das entweder in Klassen, in Listen oder in Generics.
Ohne Pointer aus derartigen Records herumzugurken ist zum einen langsam, zum anderen bekommst du Fehler, die in den Standard-Sprachelementen schon behoben oder vermieden wurden.
Evtl. solltest du das Re-Designen. Eigenbau wird ziemlich schnell sehr problematisch, wenn Inkonsitenzen auftreten. Und da du immer sortieren musst, sehe ich die Probleme vorprogrammiert.
Antrepolit hat geschrieben:Hallo Jay,
das was du machst sieht nicht sehr elegant aus. Wenn man Relationen zwischen Daten hat, dann packt man das entweder in Klassen, in Listen oder in Generics.
Ohne Pointer aus derartigen Records herumzugurken ist zum einen langsam, zum anderen bekommst du Fehler, die in den Standard-Sprachelementen schon behoben oder vermieden wurden.
Evtl. solltest du das Re-Designen. Eigenbau wird ziemlich schnell sehr problematisch, wenn Inkonsitenzen auftreten. Und da du immer sortieren musst, sehe ich die Probleme vorprogrammiert.
Das ist mir klar. Der Code von oben soll nur als Beispiel dienen.
So kompliziert sind die Umstrukturierungen nach meiner Einschätzung aber garnicht. Der Umgang mit Pointern ist allerdings erstmal gewöhnungsbedürftig und braucht etwas Einarbeitung.