| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
| Autor |
Nachricht |
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 181
|
Verfasst am: 21.09.2026, 15:13 Titel: Berechnung der Recordlänge |
|
|
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4730 Wohnort: ~/
|
Verfasst am: 21.09.2026, 18:43 Titel: |
|
|
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 |
|
 |
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 181
|
Verfasst am: 21.09.2026, 19:13 Titel: |
|
|
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4730 Wohnort: ~/
|
Verfasst am: 21.09.2026, 20:03 Titel: |
|
|
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 |
|
 |
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 181
|
Verfasst am: 21.09.2026, 20:36 Titel: |
|
|
super, danke! _________________ Grüße
kilix |
|
| Nach oben |
|
 |
|