Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Berechnung der Recordlänge

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 181

BeitragVerfasst am: 21.09.2026, 15:13    Titel: Berechnung der Recordlänge Antworten mit Zitat

Ich möchte die Länge von Dateirecords berechnen finde dabei aber Unterschiede zwischen den Werten die "recordlength" und die Addition der Feldlängen ergeben. Diese Unterschiede sind aber für alle Dateien unterschiedlich und hängen scheinbar mit der Anzahl Felder o.ä. zusammen.
In meinen Dateien gibt es praktisch nur Felder mit den Formaten ULONG (mit je 4 Bytes) und STRING (unterschiedlicher Längen).
_________________
Grüße
kilix
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4730
Wohnort: ~/

BeitragVerfasst am: 21.09.2026, 18:43    Titel: Antworten mit Zitat

Ich habe die Fragestellung noch nicht vollständig umrissen. Sprichst du von einem Dateizugriff mittels "OPEN Dateiname FOR RANDOM"? Das kann nur dann zuverlässig funktionieren, wenn jedes Record gleich lang ist - mit Strings variabler Länge wird es da Probleme geben.
Üblicherweise verwendest du OPEN FOR RANDOM nur in Zusammenhang mit einem benutzerdefinierten Type. Wenn dieses UDT Strings variabler Länge verwendet, sollte folgendes passieren:
Code:
TYPE myUDT
  AS ULONG a, b, c, d, e
  AS STRING x, y
END TYPE
DIM AS myUDT myVar
PRINT SIZEOF(myVar)

Die UDT-Variable belegt als Speicher (in obigem Beispiel) 5*SIZEOF(ULONG) + 2*SIZEOF(STRING), wozu dann möglicherweise noch ein FIELD-Effekt kommt, also die Größe in einem 64-Bit-System auf ein Vielfaches von 8 aufgerundet wird. SIZEOF(STRING) ist wiederum 3*SIZEOF(INTEGER); das sind in einem 32-Bit-System 3*4=12 Byte und in einem 64-Bit-System 3*8 = 24 Byte - und zwar unabhängig vom String-Inhalt, denn dieser wird an anderer Stelle gespeichert. Der Speicherplatz der String-Variablen selbst enthält nur den Header, unter anderem den Pointer zum eigentlichen String-Inhalt.
Wenn du ein UDT mit variablen Strings über den Dateimodus RANDOM speichern willst, wird ziemlich sicher nicht der Stringinhalt, sondern nur der Zeiger auf den Stringinhalt gespeichert, der natürlich nichts bringt.

Wenn ich mit meiner Antwort komplett an deiner eigentlichen Frage vorbeigerannt sein sollte, bitte ich das zu entschuldigen. Vielleicht ging es dir auch nur um das FIELD.

edit: Tippfehler korrigiert (sorry)
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.

-----

"Das wissen doch sowieso nur Nerdinauten, die Schlaumeierologie studiert haben." - coldmirror


Zuletzt bearbeitet von nemored am 21.09.2026, 19:55, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 181

BeitragVerfasst am: 21.09.2026, 19:13    Titel: Antworten mit Zitat

Danke nemored,
du hast es schon richtig angenommen: es handelt sich nur um konstante Recordlängen. Jetzt verstehe ich auch weshalb ich mit der Addition der Feldlängen nicht auf die Recordlänge komme und weshalb die Differenz zwischen der Berechnung und der tatsächlichen Länge oft unterschiedlich ist.
_________________
Grüße
kilix
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4730
Wohnort: ~/

BeitragVerfasst am: 21.09.2026, 20:03    Titel: Antworten mit Zitat

Das mit dem Padding und FIELD habe ich hier auch nochmal mit etwas grafischer Unterstützung zum Nachlesen:

https://users.freebasic-portal.de/nemored/buchBeginner/07_UDTs.htm#kap7_3
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.

-----

"Das wissen doch sowieso nur Nerdinauten, die Schlaumeierologie studiert haben." - coldmirror
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 181

BeitragVerfasst am: 21.09.2026, 20:36    Titel: Antworten mit Zitat

super, danke!
_________________
Grüße
kilix
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz