![]() |
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:
Wenn ich später die server speichern will mit FileWrite scheint der alles richtig abzuspeichern
Type pServer = ^tServer;
tServer = Packed Record Version : integer; Servername : string[60]; Bufferlen : integer; // Bufferlänge DescBuffer : array of PCHar; // Serverbeschreibung end; 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 |
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)
|
Re: Array of pChar Abspeichern
Zitat:
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. |
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? |
Re: Array of pChar Abspeichern
Ich würde die PChars sequentiell und durch #0 getrennt in eine Datei schreiben.
|
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); |
Re: Array of pChar Abspeichern
Zitat:
Für diejenigen die es Interessiert ;)
Delphi-Quellcode:
Schreiben In einem Stream Stream
Type pServer = ^tServer
tServer = packed Record Version : integer; DescSize : integer; Beschreibung : string; . . usw end;
Delphi-Quellcode:
Lesen vom Stream
Daten.Write(MyServer^.Version,Sizeof(Integer));
Daten.Write(MyServer^.DescSize,Sizeof(Integer)); Daten.Write(pCHAR(MyServer^.Beschreibung)^,MyServer^.DescSize);
Delphi-Quellcode:
Danke nochmals
Daten.Read(MyServer^.Version,Sizeof(Integer));
Daten.Read(MyServer^.DescSize,Sizeof(Integer)); SetLength(MyServer^.Beschreibung,MyServer^.DescSize); Daten.Read(pChar(myServer^.Beschreibung)^,MyServer^.DescSize); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz