FAQ PascalConsultez toutes les FAQ
Nombre d'auteurs : 10, nombre de questions : 402, dernière mise à jour : 7 janvier 2018 Ajouter une question
Bienvenue dans la F.A.Q. Pascal !
Celle-ci rassemble les réponses aux questions les plus fréquemment posées sur le langage Pascal et tous ses outils de programmation. Si elle n'a pas pour vocation de répondre à toutes les interrogations possibles, elle reste une bonne base de connaissances sur le Pascal, et ne demande qu'à être enrichie par vos expériences personnelles.
Nous vous invitons à proposer vos propres questions/réponses directement dans la FAQ ou, si vous souhaitez apporter une modification à une question/réponse existante, à la poster dans le fil de discussion renseigné ci-dessous.
Nous vous souhaitons une bonne lecture !
L'équipe Pascal.
- Qu'est-ce qu'une chaîne AZT ?
- Comment convertir une chaîne AZT en string et vice-versa ?
- Comment affecter une valeur à une chaîne AZT ?
- Comment initialiser une chaîne AZT vide ?
- Comment tronquer une chaîne AZT ?
- Comment déterminer la longueur d'une chaîne AZT ?
- Comment copier une chaîne AZT ?
- Comment comparer deux chaînes AZT ?
- Comment rechercher la position d'une chaîne AZT dans une autre ?
- Comment concaténer (ajouter) deux chaînes AZT ?
- Comment allouer une chaîne AZT dans le tas ?
- Comment utiliser les chaînes AZT avec les instructions standard du Pascal comme WriteLn ?
Une chaîne AZT est un tableau de caractères terminé par 0. Le 0 terminal est le caractère #0 (dont le code ANSI vaut 0), à ne pas confondre avec le caractère '0' (dont le code ANSI vaut 48) !
Voici la représentation d'une chaîne AZT en mémoire :
Code : | Sélectionner tout |
1 2 | |'B'|'o'|'n'|'j'|'o'|'u'|'r'| 0 | |
Code delphi : | Sélectionner tout |
1 2 | Var Chaine : Array [0..10] of Char; |
En C, il n'y a aucune différence entre un tableau en mémoire et un pointeur vers ce tableau. En Pascal, si ! Sauf pour les chaînes AZT. Un type particulier de pointeur, pChar, permet l'adressage des chaînes AZT et le passage de chaînes AZT comme paramètres aux procédures et fonctions.
- Tableau de caractères et pointeur sur un tableau de caractères sont équivalents.
Il est donc tout à fait correct d'écrire les deux instructions suivantes :
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 | Var Chaine : Array [0..10] of Char; pChaine : pChar; Begin (* Les 2 instructions suivantes font la même chose : *) pChaine := Chaine; pChaine := @Chaine; End. |
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | Var Chaine : Array [0..10] of Char; pChaine : pChar; Caractere : Char; Begin pChaine := Chaine; (* Les 2 instructions suivantes font la même chose : *) Caractere := Chaine[6]; Caractere := pChaine[6]; End. |
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Var Chaine : Array [0..10] of Char; pChaine : pChar; Procedure Traitement (p : pChar); Begin { . . . } End; Begin pChaine := Chaine; (* Les 2 instructions suivantes font la même chose : *) Traitement(Chaine); Traitement(pChaine); End. |
- Les constantes tableaux de caractères sont elles aussi équivalentes aux pointeurs pChar;
- Les paramètres de type chaîne AZT sont passés aux procédures et fonctions par adresse.
Il est possible de passer une constante tableau de caractères comme paramètre à une procédure :
Code delphi : | Sélectionner tout |
1 2 | Traitement('hello'); |
Il se passe exactement la même chose lorsqu'on assigne une constante tableau de caractères à un pointeur pChar :
Code delphi : | Sélectionner tout |
1 2 |
pChaine := 'hello'; |
Pour pouvoir utiliser les chaînes AZT, vous devez déclarer l'unité Strings dans la clause Uses de votre programme.
Il est possible de convertir une chaîne AZT en String à l'aide de la fonction StrPas :
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | Program CONVERS1; Uses Strings; Var s : String [7]; c : Array [0..7] of Char; Begin StrCopy(c,'Bonjour'); s := StrPas(c); End. |
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | Program CONVERS2; Uses Strings; Var s : String [7]; c : Array [0..7] of Char; Begin s := 'Bonjour'; StrPCopy(c,s); End. |
Pour assigner une valeur à une chaîne AZT, on utilise la fonction StrCopy :
Code delphi : | Sélectionner tout |
1 2 | StrCopy(Chaine,'Bonjour'); |
Attention : il peut être tentant, par analogie avec les Strings, d'assigner une valeur à une chaîne AZT comme ceci :
Code delphi : | Sélectionner tout |
1 2 3 4 | Var Chaine : Array [0..7] of Char; Chaine := 'Bonjour'; (* Erreur de syntaxe ! *) |
Pour initialiser une chaîne vide, c'est tout simple : il suffit qu'elle commence par le zéro terminal !
Code delphi : | Sélectionner tout |
1 2 | Chaine[0] := #0; |
On peut tronquer une chaîne en y insérant un zéro terminal :
Code delphi : | Sélectionner tout |
1 2 | Chaine[5] := #0; |
Pour déterminer la longueur d'une chaîne AZT, on utilise la fonction StrLen :
Code delphi : | Sélectionner tout |
1 2 | Longueur := StrLen(Chaine); |
StrCopy sert également à copier une chaîne 1 dans une chaîne 2 :
Code delphi : | Sélectionner tout |
1 2 | StrCopy(Chaine2,Chaine1); |
Pour comparer deux chaînes AZT, vous avez le choix entre StrComp (qui tient compte des majuscules et minuscules) et StrIComp (qui n'en tient pas compte). La valeur retournée par ces deux fonctions peut être positive, négative ou nulle :
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Var Chaine1 : Array [0..40] of Char; Chaine2 : Array [0..30] of Char; Resultat : Integer; Resultat := StrIComp(Chaine1,Chaine2); if Resultat > 0 then WriteLn('Chaine1 > Chaine2') else if Resultat < 0 then WriteLn('Chaine1 < Chaine2') else WriteLn('Chaine1 = Chaine2'); |
Pour déterminer la position d'une chaîne dans une autre, on utilise StrPos. Alors que la fonction Pos (pour les chaînes de type String) renvoie un indice, la fonction StrPos retourne un pointeur pChar.
Exemple :
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Program POSITION; Uses WinCRT,Strings; Var Chaine : Array [0..40] of Char; Extrait : Array [0..15] of Char; Adresse : pChar; Begin StrCopy(Chaine,'Salut la compagnie !'); StrCopy(Extrait,'compagnie'); Adresse := StrPos(Chaine,Extrait); WriteLn(Adresse); WriteLn('Indice de l''extrait : ',Adresse - Chaine); End. |
Code delphi : | Sélectionner tout |
1 2 | Adresse := StrPos(Chaine,Extrait); |
Code delphi : | Sélectionner tout |
1 2 | WriteLn(Adresse); |
Enfin, la dernière instruction soustrait l'adresse de la chaîne de départ à l'adresse trouvée par StrPos pour donner l'indice de l'extrait. L'indice du 1er caractère étant 0 et non 1 comme pour les chaînes à attribut de longueur, l'indice affiché est bien 9 et non 10.
Pour concaténer deux chaînes AZT, il existe l'instruction StrCat :
Code delphi : | Sélectionner tout |
1 2 3 4 5 | Var Chaine1 : Array [0..40] of Char; Chaine2 : Array [0..30] of Char; StrCat(Chaine1,Chaine2); { Ajoute Chaine2 à Chaine1 } |
La fonction StrCat n'effectue aucune vérification de débordement !
Une précaution peut être de choisir la fonction StrLCat :
Code delphi : | Sélectionner tout |
1 2 3 4 5 | Var Chaine1 : Array [0..40] of Char; Chaine2 : Array [0..30] of Char; StrLCat(Chaine1,Chaine2,SizeOf(Chaine1) - 1); |
La fonction StrNew permet d'allouer une chaîne AZT dans le tas :
Code delphi : | Sélectionner tout |
1 2 3 4 | Var p : pChar; p := StrNew('Allocation dans le tas'); |
Le principe de l'allocation dans le tas est économe en mémoire, car n'est alloué que l'espace nécessaire pour stocker une copie de chaîne avec le zéro terminal :
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | Var Chaine : Array [0..255] of Char; p : pChar; Begin StrCopy(Chaine,'Allocation dans le segment de données'); p := StrNew(Chaine); WriteLn(p); StrDispose(p); End. |
La fonction qui permet de libérer dans le tas l'espace alloué à une chaîne AZT est StrDispose.
Il est possible d'utiliser des chaînes AZT comme des strings si la syntaxe étendue est activée dans les options du compilateur.
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.