Zum Inhalt springen

Delphi: nicht "finalisierten" Verbund in typisierten Dateien speichern


Zakum

Empfohlene Beiträge

Hallo allerseits.

Bin gerade eben auf ein eher theoretisches Problem gestoßen und mir fällt kein cleverer Ausweg ein- vielleicht kann ja jemand helfen. :)

Ich möchte einen Verbund, der dynamische Arrays enthält in typisierten Dateien speichern, um so praktischer darauf zugreifen zu können.

Der Verbund:

  user = record

      name:string[20];

      saw: array of movie;        

      favGenre: array of string[20];

      favActor: array[1..7] of string[20];    

      favDirec: array[1..3] of string[20];    

      end;
Die gewünschte Datei:
var datei:file of user;

Tja, nun liefert mir mein Freund der Compiler den Fehler:

Type user needs finalization- not allowed in file type

Ertappt! Mein saw ist dynamisch, damit unterscheiden sich also die User in ihrer Größe von einander...

Lässt sich hier trotzdem irgendwie der "file of user" verwenden?

Ich würde nur ungern auf TextFile umsteigen. :(

Vielleicht kennt ja jemand nen Ausweg, oder weiß das dies unmöglich ist?

Wäre für jeden Hinweis dankbar. :)

Ciao

Zakum

Bearbeitet von Zakum
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Zakum,

ich hätte einen Lösungsansatz.


  userfile = record

      index:string[12];

      name:string[20];    

      saw: movie;      

      favGenre: string[20];

      favActor: array[1..7] of string[20];    

      favDirec: array[1..3] of string[20];    

      end;

Hast Du jetzt zwei Einträge - Array von Länge 2 - so musst Du zwei Einträge speichern jeweils mit dem gleichen Index - Index könnte Datum + Uhrzeit sein, hängt davon ab wie schnell du Daten erzeugst. Du kannst ja einen zweiten Typ anlegen der so ist: (wie der von Dir zuvor definierte)

  userram = record

      name:string[20];

      saw: array of movie;        

      favGenre: array of string[20];

      favActor: array[1..7] of string[20];    

      favDirec: array[1..3] of string[20];    

      end;

und dann eine Routine schreiben welche die Daten von userfile in den userram

umwandelt und zurück. Anhand des Indexes könntest Du dann erkennen welche Einträge zusammengehören.

Hoffe das ich meinen Gedankengang ausreichend gut in Wortform gebracht habe.

Der Fehler müsste doch für favGenre auch kommen, oder nicht?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, ich nehme an, ich habe die Idee verstanden. :D

Clever gelöst! :uli

Ich glaube aber, das kann ich in dem Kontext nicht umsetzen:

Das ganze soll eine Content Providing Unit werden, in array of movies werden also alle Filme gespeichert, die ein User bereits gesehen hat. Auf dieser Basis soll das Programm dann Vorschläge für Filme liefern, die den User gefallen könnten.

Da für jeden Film (für jeden User) eine neue Datei zu speichern, würde wohl schnell in Chaos ausarten.

Aber den Trick merk' ich mir, der ist ziemlich praktisch!

Ist ja nicht das erste mal, das ich auf ein Finalization Problem stoße, und bestimmt nicht das Letze. ;)

Mit sivestrigen Grüßen,

Zakum

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

[...] Da für jeden Film (für jeden User) eine neue Datei zu speichern, würde wohl schnell in Chaos ausarten. [...]

also eigentlich dachte ich das Du da nur eine Datei hast.

Beispiel:

name     movie       mov-index

user001  abc         0001     

user001  abc dek     0002     

user001  def         0003     

user039  akc         0001     

user040  dkeu        0001     

user001  dkudi       0004     

jetzt muss halt die "einlese-funktion" die einzelnen Datensätze lesen und in das dafür vorgesehene Array speichern.

  userram = record

      name:string[20];

      saw: array of movie;        

      end;

ungefähr so:

userram.name = "user001  "

for zeile in datei.txt do

   begin

     // angenommen du willst nur die daten von user001

      if userfile.name = userram.name

         begin

            // weiteren Platz für Array-Element schaffen

            setlength(userrram.saw, high(userram.saw)+1)

            // daten ablegen

            userram.saw[High(userram.saw)].name := userfile.movie

         end;

   end;

Wie mir soeben auffällt braucht man den Index nicht wirklich :D, aber egal.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...