AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Warum keine dynamischen Arrays in Records möglich
Thema durchsuchen
Ansicht
Themen-Optionen

Warum keine dynamischen Arrays in Records möglich

Ein Thema von Cyberbob · begonnen am 16. Feb 2009 · letzter Beitrag vom 16. Feb 2009
Antwort Antwort
Benutzerbild von Cyberbob
Cyberbob

Registriert seit: 24. Jan 2005
Ort: Karben
626 Beiträge
 
Delphi XE7 Architect
 
#1

Warum keine dynamischen Arrays in Records möglich

  Alt 16. Feb 2009, 18:55
Hallo Community,

ich habe 2 Records:
Delphi-Quellcode:
TInhalt = Record
            Kanal : String[10];
            Effektname : String[255];
            Position : String[255];
            Ausrichtung : String[255];
          end;

TDatei = Record
           Name : String[255];
           Copyright : String[255];
           Autor : String[255];
           Inhalt : Array of TInhalt;
         end;
Weiter im Code erstelle ich eine Variable:
Datei : File of TDatei; Hier sagt der Compiler mir allerdings, dass er für den Typ TDatei eine Finalisation benötigt. Wenn ich das Array statisch mache, geht alles (Wie auch bei den Strings), ich bnötige allerdings ein Dynamisches, weil ich erst beim Erstellen der Datei ermittle, wie groß das Array sein muss!

Weiß einer Rat oder eine andere Lösung für mein Problem?

Gruß,
Chris
Christian
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Warum keine dynamischen Arrays in Records möglich

  Alt 16. Feb 2009, 18:57
Nimm eine untypisierte Datei oder einen Filestream. Das macht allerdings sowohl das Speichern als auch das Laden komplizierter.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.096 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Warum keine dynamischen Arrays in Records möglich

  Alt 16. Feb 2009, 18:57
Hi,

vergiss deinen Ansatz, mit file of ... solltest du nur statische Strukturen verwenden.

Ansonsten könntest du es per Hand schreiben Delphi-Referenz durchsuchenTFileStream, wo du erst die Länge und dann die einzelnen Elemente des Arrays speicherst.

Mfg
FAlter
Felix Alter
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Warum keine dynamischen Arrays in Records möglich

  Alt 16. Feb 2009, 19:20
mit "file of Type" legt man fest das der Inhalt einer Datei komplett mit Type gefüllt ist. Dabei ist Type immer gleich groß. Man kann also fix mal zum 5ten Eintrag in der Datei gehen weil man einfach die Position ändert. Hast du jedoch ein dynamisches Array oder dergleichen, so ist das erstmal nicht mehr als ein Pointer der auf dynamich reservierten Speicher zeigt. Delphi ist da wohl schon so schlau um zu wissen das es keinen Sinn macht diesen Pointer zu speichern weil beim nächsten Programmstart der wo ganz anders hinzeigen könnte. Und um die Daten direkt in die Datei zu schreiben ist wohl der Ansatz der konstanten Datengröße nicht gegeben.

Das sind zumindest meine Vermutungen warum das, was du vor hast nicht so zu machen geht.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Warum keine dynamischen Arrays in Records möglich

  Alt 16. Feb 2009, 21:17
Ja, eine typisierte Datei hat eine feste Recordbreite, was ja mit einem dynamischen array nicht gegeben ist.

Würde den zweiten Record erweitern:
Delphi-Quellcode:
TDatei = Record
           Name : String[255];
           Copyright : String[255];
           Autor : String[255];
           InhaltCount : Integer;
           Inhalt : Array of TInhalt;
         end;
Schreiben ist ja sowieso kein Problem und mit dem Counter sollte dann auch lesen mit einem TFileStream problemlos möglich sein.

Also vorm Schreiben InhaltCount mit der tatsächlichen Zahl füllen und die Record-Felder einzeln speichern (TInhalt in einer Schleife length(x))

Beim Lesen erst den "Header" bis bis InhaltCount einlesen und ensprechend die Anzahl der TInhalt Arrays.
  Mit Zitat antworten Zitat
Benutzerbild von Cyberbob
Cyberbob

Registriert seit: 24. Jan 2005
Ort: Karben
626 Beiträge
 
Delphi XE7 Architect
 
#6

Re: Warum keine dynamischen Arrays in Records möglich

  Alt 16. Feb 2009, 21:33
Ok, ich werde mir das mit dem TFileStream mal anschaun.
Dank an alle!
Christian
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Warum keine dynamischen Arrays in Records möglich

  Alt 16. Feb 2009, 21:38
Hier mal eine Basis zum erweitern (ohne Try...finally und with * do) zum besseren Verständnis:
Delphi-Quellcode:
    // Record mit Inhalt füllen
    [...]
    DateiRec.InhaltCount := Length(DateiRec.Inhalt);

    // Datei anlegen/öffnen -> Varianten zum Öffnen siehe Hilfe
    FileStream := TFileStream.Create('F:\Worktemp\MyFile.dat',fmCreate or fmShareExclusive);

    // Header schreiben
    FileStream.Write(DateiRec.Name,SizeOf(DateiRec.Name));
    FileStream.Write(DateiRec.Copyright,SizeOf(DateiRec.Copyright));
    FileStream.Write(DateiRec.Autor,SizeOf(DateiRec.Autor));
    FileStream.Write(DateiRec.InhaltCount,SizeOf(DateiRec.InhaltCount));

    // Body schreiben
    for i := 1 to DateiRec.InhaltCount {Length(DateiRec.Inhalt)} do
      FileStream.Write(DateiRec.Inhalt[i-1], SizeOf(TInhalt));
FileStream.Free schießt danach die Datei, aber das machst ja im finally Block. Lesen im Prinzip umgekehrt, also der High-Wert der for Schleife durch Lesen des "Header" ermitteln.

PS: wenn ich das so sehe, evtl .Name in .AutorName ändern.
  Mit Zitat antworten Zitat
Benutzerbild von lbccaleb
lbccaleb

Registriert seit: 25. Mai 2006
Ort: Rostock / Bremen
2.037 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Warum keine dynamischen Arrays in Records möglich

  Alt 16. Feb 2009, 23:32
Hab mir gerade nicht alles durchgelesen, bin faul um die Uhrzeit^^


Hab vor kurzem für jemanden nen kleines telefonbuch gemacht, wo arrays und so drin vorkommen, vllt ist ja irgendwas brauchbares für dich da drinne...
habs mal angehangen!!
Angehängte Dateien
Dateityp: zip dateizugriff_153.zip (222,3 KB, 13x aufgerufen)
Martin
MFG Caleb
TheSmallOne (MediaPlayer)
Die Dinge werden berechenbar, wenn man die Natur einer Sache durchschaut hat (Blade)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz