Transfert d'une variable locale comme PChar

De RAD Studio
Aller à : navigation, rechercher

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;

Voir aussi