Verkettete Records

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Jay
Beiträge: 65
Registriert: Sa 29. Dez 2007, 02:21
OS, Lazarus, FPC: Linux, 0.9.30.4 Beta, FPC 2.6.0
CPU-Target: 32Bit
Kontaktdaten:

Verkettete Records

Beitrag von Jay »

Hallo,

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 :lol:):

Code: Alles auswählen

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.

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Verkettete Records

Beitrag von theo »

Ich kenne es nur so: http://www.freepascal.org/docs-html/ref/refse16.html" onclick="window.open(this.href);return false;

Jay
Beiträge: 65
Registriert: Sa 29. Dez 2007, 02:21
OS, Lazarus, FPC: Linux, 0.9.30.4 Beta, FPC 2.6.0
CPU-Target: 32Bit
Kontaktdaten:

Re: Verkettete Records

Beitrag von Jay »

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
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: Verkettete Records

Beitrag von u-boot »

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
Zuletzt geändert von u-boot am Mi 18. Apr 2012, 17:15, insgesamt 1-mal geändert.
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

Jay
Beiträge: 65
Registriert: Sa 29. Dez 2007, 02:21
OS, Lazarus, FPC: Linux, 0.9.30.4 Beta, FPC 2.6.0
CPU-Target: 32Bit
Kontaktdaten:

Re: Verkettete Records

Beitrag von Jay »

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?

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: Verkettete Records

Beitrag von u-boot »

Sry ich hab wohl editiert statt geantwortet ....
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: Verkettete Records

Beitrag von u-boot »

Jay hat geschrieben:
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.
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

Jay
Beiträge: 65
Registriert: Sa 29. Dez 2007, 02:21
OS, Lazarus, FPC: Linux, 0.9.30.4 Beta, FPC 2.6.0
CPU-Target: 32Bit
Kontaktdaten:

Re: Verkettete Records

Beitrag von Jay »

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.

marcov
Beiträge: 1102
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Verkettete Records

Beitrag von marcov »

u-boot hat geschrieben:
Jay hat geschrieben:
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.

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Verkettete Records

Beitrag von MAC »

Nehmen wir an du würdest das so machen und zum so die Einträge gegenseitig "verkettest".
Dann solltest du wissen das wenn du z,B, folgendes machst

Code: Alles auswählen

Werte[0].SchluesselRecord := Schluessel[0]
und dann eine Eigenschaft von

Code: Alles auswählen

Werte[0].SchluesselRecord
änderst.
Dass dann nicht gleich die Eigenschaft in

Code: Alles auswählen

Schluessel[0]
geändert ist.
Das geht nur mit Pointern oder Objekten und Objekte sind Pointer :D

Code: Alles auswählen

Signatur := nil;

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: Verkettete Records

Beitrag von u-boot »

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.
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Verkettete Records

Beitrag von Antrepolit »

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.
Grüße, Antrepolit

care only if your os is really burning

Jay
Beiträge: 65
Registriert: Sa 29. Dez 2007, 02:21
OS, Lazarus, FPC: Linux, 0.9.30.4 Beta, FPC 2.6.0
CPU-Target: 32Bit
Kontaktdaten:

Re: Verkettete Records

Beitrag von Jay »

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.

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Verkettete Records

Beitrag von Euklid »

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.

Antworten