Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 00:44

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Dez 13, 2004 08:53 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 02, 2003 12:47
Beiträge: 300
Wohnort: Marburg
Tach, ich speicher alle meine Sachen (3DModelle Scenen usw) in TFileStreams.

Bis jetzt habe ich texte (z.b Texturnamen in den Modellen) in eigenem Format
Code:
  1.   Meinstring = string[20]

gespeichert. Da die größe des Strings so konstant ist, gibt es natürlich mit dem filestream keine Probleme.

Jetzt wollte ich aber belibig lange strings speichern, und habe das so gelöst:

Code:
  1. // Variablen
  2. x: integer
  3. text: string //  beliebiger länge)
  4. f: tfilestream
  5.  
  6. // Speichervorgang
  7. ...
  8. x:=length(text);
  9. f.WriteBuffer(x,sizeof(x));
  10. f.WriteBuffer(text,sizeof(text));
  11. ...
  12.  
  13. // Ladevorgang
  14. ...
  15. f.readBuffer(x,sizeof(x));
  16. setlength(text,x);
  17. f.readBuffer(text,sizeof(text));
  18. ...


Produziert sehr schöne Programmfehler :-) Habe aber ansonsten am funktionierendem Programmm nichts geändert.
Folgender Versuch brachte leider auch keinen Erfolg:

Code:
  1. // Variablen
  2. x: integer
  3. text: string //  beliebiger länge)
  4. f: tfilestream
  5.  
  6. // Speichervorgang
  7. ...
  8. x:=sizeof(text);
  9. f.WriteBuffer(x,sizeof(x));
  10. f.WriteBuffer(text,x);
  11. ...
  12.  
  13. // Ladevorgang
  14. ...
  15. f.readBuffer(x,sizeof(x));
  16. f.readBuffer(text,x);
  17. ...


Lösungsvorschläge??? Oder habe ich nen Fehler gemacht, und eine der Varianten müsste funktionieren?

_________________
Nothing, oh sweet nothing,
today we are doing nothing at all...
http://www.geo-progs.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 13, 2004 12:19 
Offline
DGL Member

Registriert: Di Aug 26, 2003 20:08
Beiträge: 81
Wohnort: Mönchengladbach
Programmiersprache: ObjPas ASM C C++ etc
Strings sind normalerweise immer Ansi-/Longtsrigns, das sind quasi nur Zeiger auf eine Instanz eines Strings. Im Speicher sähe es also so aus:

Code:
  1.  
  2. 8    32-Bit-Referenzzähler
  3. 4    32-Bit-Längenangabe
  4. 0..Länge – 1 Zeichen-String
  5. Länge  NULL-Zeichen
  6.  
  7. bzw.
  8.  
  9. TString=packed record
  10.  referencecounter:integer;
  11.  stringlength:integer;
  12.  stringdata:pchar;
  13. end;
  14.  


Daher muss man bei WriteBuffer und ReadBuffer es auf das erste Zeichen ansetzen, damit es funktioniert, sonst liest/überscheibst du nur den Stringzeiger selbst. Das ursacht logischereise dann Laufzeitfehler .

so musste es funktionieren:

Code:
  1.  
  2. // Variablen
  3. x: integer
  4. text: string //  beliebiger länge)
  5. f: tfilestream
  6.  
  7. // Speichervorgang
  8. ...
  9. x:=length(text);
  10. f.WriteBuffer(x,sizeof(integer));
  11. if x>0 then f.WriteBuffer(text[1],x);
  12. ...
  13.  
  14. // Ladevorgang
  15. ...
  16. f.readBuffer(x,sizeof(integer));
  17. SetLength(text,x);
  18. if x>0 then f.readBuffer(text[1],x);
  19. ..
  20. .

_________________
Behindert ist man nicht, behindert wird man.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 13, 2004 16:46 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 02, 2003 12:47
Beiträge: 300
Wohnort: Marburg
vielen Dank! Funktioniert reibungslos :-) Mach ich noch funktionen draus und denn siehts auch ordentlich aus.

_________________
Nothing, oh sweet nothing,
today we are doing nothing at all...
http://www.geo-progs.de


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]