Lokale Variable als PChar übergeben

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Konvertierungen von String in PChar


Manchmal liegt eine lokale String-Variable vor, die durch den Aufruf einer Funktion initialisiert werden muss, die einen PChar. als Parameter entgegennimmt. Ein mögliches Vorgehen ist die Erstellung eines lokalen array of char, das an die Funktion übergeben wird. Anschließend weisen Sie diese Variable dem String zu:

 // FillBuffer ist hier eine vordefinierte Funktion
 function FillBuffer(Value:Integer; Buf:PChar; Count:Integer):Integer
 begin
    . . .
 end;
 // MAX_SIZE ist hier eine vordefinierte Konstante 
 var
   i: Integer;
   buf: array[0..MAX_SIZE] of char;
   S: string;
 begin
   i := FillBuffer(0, buf, SizeOf(buf));// behandelt buf als PChar
   S := buf; //Anweisungen
 end;

Dieses Vorgehen ist hilfreich, wenn der Puffer relativ klein ist, da dieser auf dem Stack zugeordnet wird. Gleichzeitig handelt es sich um eine sichere Lösung, da die Konvertierung zwischen array of char und string automatisch erfolgt. Nachdem buf dem String zugewiesen wurde, wird die Länge (Length) des Strings automatisch auf den richtigen Wert gesetzt.

Um den zusätzlichen Aufwand beim Kopieren des Puffers zu vermeiden, können Sie den String in einen PChar umwandeln, sofern die Routine nicht voraussetzt, dass der PChar im Speicher erhalten bleibt. Die Synchronisierung der String-Länge erfolgt jedoch nicht automatisch wie bei der Zuweisung von array of char an string. Sie sollten die Länge des Strings mit der Funktion Length zurücksetzen, damit sie der tatsächlichen Länge entspricht. Wenn Sie eine Funktion verwenden, welche die Anzahl der kopierten Bytes zurückgibt, ist dies in nur einer Zeile Quelltext möglich:

 var S: string;
 begin
   SetLength(S, MAX_SIZE);// bei Umwandlung in einen PChar darf der String nicht leer sein
   SetLength(S, GetModuleFilename(0, PChar(S), Length(S)));
   // Anweisungen 
 end;

Siehe auch