Les Chaînes de Caractères (STRING)
Traditionnellement, en Pascal, un STRING est une variable de 256 caractères (de 0 à 255) dont le premier contient le nombre de caractères utilisés. On peut alors, pour une chaines:string
, utiliser s[0]
pour obtenir le nombre de caractères de la chaîne.
Notez bien la différence entre l'occupation mémoire de la variable (256 octets) et le nombre de caractères utilisés (s[0]).Delphi 2 introduit un nouveau type
STRING
(supportant jusque 2 Go - deux gigaoctets - de mémoire);
l'ancien type de 256 caractères devient un SHORTSTRING
.La différence majeure entre
STRING
et SHORTSTRING
et qu'un STRING
ne possède pas d'élément 0.
{ modification de la longeur d'un SHORTSTRING } var s:shortstring; i:integer; begin s[0]:=#15; { le contenu n'est pas déterminé...} for i:=1 to 15 do s[i]:=chr(i); end;
{ modification de la longeur d'un STRING } var s:string; i:integer; begin SetLength(s,15); { le contenu n'est pas déterminé...} for i:=1 to 15 do s[i]:=chr(i); end;
SetLength
fonctionne pour les deux types de chaînes.Concrètement, un
STRING
sous Delphi 2 (et au delà) est un pointeur sur une structure contenant trois informations
- La taille de la chaîne
- L'adresse mémoire contenant la chaîne
- Le nombre de variable l'utilisant
{ Mécanismes d'allocation des STRING } var s1,s2:string; begin s1:='Exemple de données'; { allocation d'une nouvelle chaîne dont le compteur passe à 1 } s2:=s1; { s2 et s1 pointent sur la même structure dont le compteur passe à 2 } s2:=s2+' modifiées'; { allocation d'une nouvelle chaîne (compteur=1) pour une copie de s1/s2 dont le compteur repasse à 1 } s1:=''; { désallocation de s1 car son compteur passe à 0 } end; { désallocation automatique de s2 car son compteur passe à 0 }
Notez que ces mécanismes d'allocation interdisent le passage de variable de type
STRING
vers ou depuis une DLL...sauf dans le cas de DLL
écritent en Delphi qui utilisent toutes l'unité SHAREMEM; celle-ci permettant de partager entre le programme et les DLL une même gestion de la mémoire.
Les Chaînes à 0 terminal
Dans le mode C, les chaînes de caractères sont manipulées par un pointeur sur un caractère, et c'est le caractère nul (#0) qui indique la fin de la chaîne (il appartient au programmeur de gérer l'allocation mémoire).Les API Windows qui manipulent des chaînes utilisent quasiment toute ce genre de chaînes; il sagit du type Pascal
PChar
Delphi 2 propose en standard une compatibilité entre
STRING
et PChar
.
{ transtypage d'un SHORTSRING en PCHAR } var s:shortstring; p:pchar; begin s:='Exemple de chaîne'; { chaîne pascal } s:=s+#0; { ajout du 0 terminal } p:=@s[1]; { pointer sur le premier caractère } end;
{ transtypage d'un STRING en PCHAR } var s:string; p:pchar; begin s:='Exemple de chaîne'; { chaîne pascal } p:=pchar(s); <{ Delphi se charge de tout ! } end;