Transfert d'une variable locale comme PChar
Remonter à Conversions de chaînes en PChar
Considérez le cas dans lequel vous avez une variable chaîne locale qui doit être initialisée en appelant une fonction qui attend un paramètre PChar. Une solution consiste à créer une variable locale array of char
et à la transmettre à la fonction. Il faut ensuite affecter cette variable à la chaîne :
// assume FillBuffer is a predefined function
function FillBuffer(Value:Integer; Buf:PChar; Count:Integer):Integer
begin
// …
end;
// assume MAX_SIZE is a predefined constant
var
i: Integer;
buf: array[0..MAX_SIZE] of char;
S: string;
begin
i := FillBuffer(0, buf, SizeOf(buf));// treats buf as a PChar
S := buf;
//statements
end;
Cette manière de procéder est envisageable si la taille du tampon reste suffisamment petite pour être allouée sur la pile. Elle est également fiable car la conversion est automatique entre un type array of char
et un type string
. La longueur (Length
) de la chaîne adopte automatiquement la valeur adéquate une fois que buf
est attribué à la chaîne.
Pour éliminer le surcoût de la copie du tampon, il est possible de transtyper la chaîne en un PChar
(si vous êtes certain que la routine n’a pas besoin que le PChar
reste en mémoire). Mais dans ce cas, la synchronisation de la longueur de la chaîne n’est pas effectuée automatiquement comme c'est le cas lors de l'affectation d'un array of char
à un string
. Vous devez réinitialiser la longueur (Length
) de la chaîne afin de refléter la largeur réelle de la chaîne. Si vous utilisez une fonction qui renvoie le nombre d’octets copiés, une seule ligne de code suffit à le faire :
var
S: string;
begin
SetLength(S, MAX_SIZE);// when casting to a PChar, be sure the string is not empty
SetLength(S, GetModuleFilename(0, PChar(S), Length(S)));
// statements
end;