Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Array of pChar Abspeichern (https://www.delphipraxis.net/8282-array-pchar-abspeichern.html)

Cyrus1972 1. Sep 2003 16:38


Array of pChar Abspeichern
 
Hallo zusammen.

Ich habe da Folgenes Problem mit Delphi ich möchte Typisierte Dateien speichern und Einladen, das Abspeichern funktioniert anscheind wunderbar, das einladen jedoch macht mir immer wieder Exeptions wegen Bereichsprüfung oder Fehler bei zugriff auf Speicher.

Hier mal ein Beispiel (Aus dem Kopf) ;)

Delphi-Quellcode:
Type pServer = ^tServer;
     tServer = Packed Record
     Version   : integer;
     Servername : string[60];
     Bufferlen : integer;   // Bufferlänge
     DescBuffer : array of PCHar; // Serverbeschreibung
end;
Wenn ich später die server speichern will mit FileWrite scheint der alles richtig abzuspeichern

Und so wird gespeichert

FileWrite(fh,MyServer^.Version,Sizeof(Integer));
FileWrite(fh,MyServer^.Servername,60);
FileWrite(fh,MyServer^.bufferlen,Sizeof(Integer));
FileWrite(fh,MyServer^.DescBuffer,myServer^.Buffer Len)

Jetzt wird es Heftig denn das einladen klappt hier nicht

Und so wird versucht einzuladen
FileRead(fh,MyServer^.Version,Sizeof(Integer));
FileRead(fh,MyServer^.Servername,60);
FileRead(fh,MyServer^.Bufferlen,Sizeof(Integer));
FileRead(fh,MyServer^.DescBuffer,myServer.BufferLe n);

Version,Servername,Bufferlen liest der richtig ein
den Descbuffer (Array of pChar) bekommt er nicht auf die Reihe.
Egal ob ich MyServer^.DescBuffer[0] oder 1 eingebe oder
es mit pChar(myServer.DescBuffer) (Mit und ohne ([])

Wer kann mir bei den Denkfehler weiterhelfen ??

Ich hab es nur ebend aus dem Kopf aufgeschrieben, damit man weiss was in etwa gemeint ist, bin gerade nicht zuhause sondern an einen Fremden PC.

Gruß und danke im Voraus

Christian Seehase 1. Sep 2003 17:59

Re: Array of pChar Abspeichern
 
Moin Cyrus,

bist Du Dir sicher, dass Du ein array of PChar an der Stelle brauchst?
Ein PChar ist ein Pointer auf einen Char also ein "normaler" 32 Bit Wert. Descbuffer ist also eine Liste von Pointern, und für mich sieht es so aus, als sollte das hier einfach ein PChar sein.

Probier doch mal das hier aus:

Delphi-Quellcode:
FileWrite(fh,MyServer.DescBuffer[0]^,myServer.BufferLen)

Cyrus1972 1. Sep 2003 20:11

Re: Array of pChar Abspeichern
 
Zitat:

Zitat von Christian Seehase
Moin Cyrus,

Delphi-Quellcode:
FileWrite(fh,MyServer.DescBuffer[0]^,myServer.BufferLen)

Diese Variante habe ich auch schon ausprobiert.
Abgespeichert wird der Text ja schon richtig, nur beim Einladen gibt es später Probleme.

Ich habe deswegen ein Array of pChar versucht, weil manchmal sogar ein paar Kilobytes an Text dabei rumkommen.

Für ein Anderes Projekt habe ich ähnliches vorhaben mit Typisierten dateien, dort muss ich aber ein Buffer von 1k bis xMB zb verwalten können.

Christian Seehase 1. Sep 2003 21:24

Re: Array of pChar Abspeichern
 
Moin Cyrus,

das kommt jetzt bei Deinem Source nicht raus, aber das Du den Buffer vor dem Einlesen erst wieder initialisieren musst ist Dir schon klar?

Assarbad 1. Sep 2003 21:37

Re: Array of pChar Abspeichern
 
Ich würde die PChars sequentiell und durch #0 getrennt in eine Datei schreiben.

Leuselator 1. Sep 2003 21:44

Re: Array of pChar Abspeichern
 
Wie Christian schon sagte:
versuch mal:

Und so wird versucht einzuladen
FileRead(fh,MyServer^.Version,Sizeof(Integer));
FileRead(fh,MyServer^.Servername,60);
FileRead(fh,MyServer^.Bufferlen,Sizeof(Integer));
// hier kommt's:
GetMem(MyServer.DescBuffer,myServer.BufferLen);
FileRead(fh,MyServer^.DescBuffer,myServer.BufferLe n);

Cyrus1972 3. Sep 2003 11:55

Re: Array of pChar Abspeichern
 
Zitat:

Zitat von Leuselator
Wie Christian schon sagte:
versuch mal:

Und so wird versucht einzuladen
FileRead(fh,MyServer^.Version,Sizeof(Integer));
FileRead(fh,MyServer^.Servername,60);
FileRead(fh,MyServer^.Bufferlen,Sizeof(Integer));
// hier kommt's:
GetMem(MyServer.DescBuffer,myServer.BufferLen);
FileRead(fh,MyServer^.DescBuffer,myServer.BufferLe n);

Danke für die Bemühungen, ich hab es jetzt andersweitig hinbekommen.

Für diejenigen die es Interessiert ;)

Delphi-Quellcode:
Type pServer = ^tServer
     tServer = packed Record
     Version     : integer;
     DescSize    : integer;
     Beschreibung : string;
     .
     . usw
end;
Schreiben In einem Stream Stream
Delphi-Quellcode:
 Daten.Write(MyServer^.Version,Sizeof(Integer));
 Daten.Write(MyServer^.DescSize,Sizeof(Integer));
 Daten.Write(pCHAR(MyServer^.Beschreibung)^,MyServer^.DescSize);
Lesen vom Stream
Delphi-Quellcode:
 Daten.Read(MyServer^.Version,Sizeof(Integer));
 Daten.Read(MyServer^.DescSize,Sizeof(Integer));
 SetLength(MyServer^.Beschreibung,MyServer^.DescSize);
 Daten.Read(pChar(myServer^.Beschreibung)^,MyServer^.DescSize);
Danke nochmals


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:04 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