Section courante

A propos

Section administrative du site

Les unités

Les unités étendent l'utilité de QuickPascal en donnant à vos programmes l'accès à des déclarations et procédures supplémentaires. Une «unité» est définie comme un ensemble connexe de telles déclarations et procédures. Référencer le nom d'une unité au début d'un programme vous donne accès au contenu de cette unité comme s'il faisait partie du Pascal standard. Le QuickPascal est livré avec plusieurs unités prédéfinies (ou "standard"), et vous pouvez également écrire les vôtres.

Cette page explique à la fois comment utiliser les unités standard QuickPascal et comment créer vos propres unités.

Comprendre les unités

Si vous avez fait beaucoup de programmation dans un autre langage de programmation, vous connaissez probablement les bibliothèques. Les bibliothèques fournissent généralement des routines spécialisées ne faisant normalement pas partie du langage de programmation. Les unités Pascal fonctionnent sur un concept similaire mais ont une portée et une application plus larges. Ils contiennent non seulement des procédures et des fonctions, mais également des variables, des constantes et des déclarations de type. De plus, une unité peut exécuter du code au démarrage du programme et faire tout ce qu'un programme peut faire, comme ouvrir des fichiers ou obtenir une entrée utilisateur. Ce sont des différences importantes par rapport aux bibliothèques d'un autre langage de programmation.

Une fois que vous avez indiqué à QuickPascal que votre programme utilise une unité particulière, vous pouvez accéder aux procédures, fonctions et déclarations définies dans cette unité comme vous le feriez pour n'importe quelle procédure, fonction ou déclaration standard.

Les unités étendent effectivement la partie d'un programme entre l'entête et le corps principal du programme, la zone où toutes les déclarations apparaissent. Au lieu d'écrire un nombre considérable de déclarations, de procédures et de fonctions, vous pouvez utiliser une unité et obtenir les mêmes résultats.

Si vous utilisez certaines de vos propres procédures de façon répétée, vous pouvez créer une unité personnalisée et mettre les procédures à la disposition de tous vos programmes. De plus, la réécriture de programmes volumineux pour utiliser des unités supprime certaines des contraintes de la limite de segment de 64 Ko. Chaque unité obtient son propre segment, donc la création d'une seule unité double votre espace de programmation. Les programmes peuvent utiliser jusqu'à 81 unités.

Les unités standard QuickPascal élargissent les capacités générales de vos programmes ; les unités personnalisées que vous écrivez fournissent toutes les fonctionnalités spécifiques dont vous avez besoin.

Utilisation des unités dans un programme

Vous accédez à une unité en ajoutant l'instruction USES et le nom de l'unité sous la déclaration PROGRAM. Par exemple, les lignes suivantes :

  1. Uses
  2.  Crt, Dos;

vous permettent d'utiliser n'importe laquelle des procédures définies dans les unités Crt ou Dos de votre programme, comme vous le feriez pour n'importe quelle procédure locale. Toutes les variables, constantes ou types déclarés dans l'unité sont disponibles pour votre programme. (Si vous écrivez des programmes nécessitant de nombreuses variables ou constantes, les déclarer dans une unité personnalisée peut simplifier votre programme principal et faciliter le débogage.)

Voici un exemple plus complet montrant une unité en contexte :

  1. Program LilUnitTest;
  2.  
  3. Uses
  4.  Crt;
  5.  
  6. BEGIN
  7.  Write('Presse une touche pour terminer');
  8.  Repeat until KeyPressed;
  9. END.

Une fois que vous avez placé l'unité dans la liste USES, vous êtes libre d'utiliser son contenu comme n'importe quelle autre procédure, fonction et déclaration Pascal.

Unités QuickPascal standard

Le QuickPascal est livré avec plusieurs unités standard. Ils améliorent votre contrôle sur l'écran et le texte, les routines DOS, l'utilisation de l'imprimante et les graphiques. Le QuickPascal insère automatiquement une autre unité standard, System, dans chaque programme que vous compilez. Il fournit toutes les procédures et fonctions standard.

Les unités standard QuickPascal incluent les éléments suivants :

Nom d'unité Description
Crt Gère la saisie au clavier, la gestion des écrans/fenêtres, la sélection des couleurs et le contrôle du curseur.
Dos Manipule les fichiers et répertoires DOS et exécute d'autres fonctions DOS.
Printer Permet aux programmes d'accéder à une imprimante.
MSGraph Crée des graphiques et affiche du texte dans différentes tailles et styles de texte.
System Contient le système d'exécution, y compris les procédures et fonctions standard QuickPascal. Cette unité est automatiquement utilisée par tous les programmes QuickPascal ; vous n'avez pas besoin de le déclarer explicitement.

Si vous utilisez régulièrement des procédures non disponibles dans les unités standard, envisagez de créer votre propre unité. Comme un programme, une unité personnalisée peut faire référence à d'autres unités. Les deux types d'unités, standard et personnalisées, ajoutent de la puissance et de la flexibilité à vos programmes.

Créer vos propres unités

Les unités standard QuickPascal fournissent la plupart des procédures dont vous avez couramment besoin. Pourtant, vous pouvez avoir besoin d'une fonction spéciale à plusieurs reprises ou vouloir initialiser un grand nombre de variables, de constantes ou de types de données. Ou vous pouvez partager des procédures avec d'autres programmeurs. Dans tous les cas, une solution pratique consiste à écrire votre propre unité.

Écrire une nouvelle unité

Les unités QuickPascal ressemblent aux autres programmes Pascal, avec les différences suivantes :

Commencer une unité

Comme tout programme commence par le mot clef PROGRAM, chaque unité commence par un mot clef UNIT :

  1. UNIT new_unit; 

Le mot clef UNIT indique à QuickPascal de compiler le fichier dans une unité plutôt que dans un programme exécutable. L'unité compilée reçoit le même nom que son fichier source, avec l'extension .QPU ajoutée. Les fichiers source des unités conservent généralement l'extension .PAS.

Portion d'interface

Tout ce qui se trouve dans la section suivante, la partie INTERFACE de l'unité, devient une information «publique» pour tous les programmes utilisant l'unité. Il comprend toutes les unités nécessaires à cette unité ; les déclarations de toute variable publique, constante ou type de données ; et le format d'appel pour toutes les procédures ou fonctions (y compris les déclarations de tous les paramètres). Le code réel pour les procédures et les fonctions vient plus tard.

Considérez l'exemple de section INTERFACE suivant :

  1. INTERFACE { Information public }
  2.  
  3. Uses
  4.  Crt;
  5.  
  6. Const
  7.  days_per_year=365;
  8.  
  9. Procedure center_line(message:String);
  10. Function cube(num:Real):Real;

Ces lignes indiquent à QuickPascal que cette unité utilise l'unité Crt standard, établit la constante days_per_year et rend une procédure (center_line) et une fonction (cube) accessibles au public.

Partie de mise en oeuvre

La deuxième partie d'une unité, la partie mise en oeuvre, soit IMPLEMENTATION, définit les procédures données dans la partie INTERFACE et toutes les données nécessaires pour mettre en oeuvre ces procédures. Ces données peuvent inclure de nouvelles définitions de variables, de constantes, de types, d'étiquettes et de procédures de support (procédures assistant les procédures primaires). Le code complet de chaque PROCEDURE ou FUNCTION déclarée dans la section INTERFACE doit apparaître dans la section IMPLEMENTATION.

La section IMPLEMENTATION suivante inclut à la fois une nouvelle variable et une fonction de support :

  1. IMPLEMENTATION
  2. { Informations privées disponibles uniquement pour new_unit }
  3.  
  4. Var
  5.  back:Word;
  6.  
  7. Function cube(num:Real):Real;
  8. Var
  9.  temp:Real;
  10. Begin
  11.  temp:=Sqr(num);
  12.  cube:=temp*num;
  13. End;
  14.  
  15. Function calc_start(message:String):Integer;Begin
  16.  calc_start:=(80-Length(message)) div 2;
  17. End;
  18.  
  19. Procedure center_line(message:String);Begin
  20.  GotoXY(calc_start(message),WhereY);
  21.  WriteLn(message);
  22. End;
  23.  
  24.  { Partie d'initialisation }
  25. BEGIN
  26.  WriteLn('Quelle couleur de fond souhaitez-vous ?');
  27.  Write('(0..7) :');
  28.  ReadLn(back);
  29.  TextBackground(back);
  30.  ClrScr;
  31. END.

Dans QuickPascal, les déclarations VAR, CONST, PROCEDURE et FUNCTION peuvent apparaître dans n'importe quel ordre. Cependant, vous devez déclarer les procédures et fonctions de support - dans ce cas, la fonction calc_start, appelée par la procédure center_line - avant de les appeler depuis une autre procédure. Assurez-vous d'inclure la définition de chaque procédure répertoriée dans la partie INTERFACE du programme. L'omission d'une définition provoque une erreur de référence directe insatisfaite :

Unsatisfied forward reference error

Bien que le compilateur ne vous oblige pas à lister les paramètres de chaque procédure (comme il l'a fait dans la partie INTERFACE), il est généralement considéré comme une bonne pratique de programmation de le faire. Gardez à l'esprit que si vous répétez les paramètres, ils doivent correspondre exactement aux paramètres répertoriés dans la partie INTERFACE.

Affichage de l'ensemble de l'unité

Ensemble, les trois exemples précédents forment une unité complète. Un programme utilisant new_unit a accès à la constante days_per_year, à la procédure center_line et à la fonction cube. Cependant, le programme ne peut pas accéder à la fonction calc_start ou à la variable temp car elles apparaissent dans la section IMPLEMENTATION ; cette section reste entièrement "cachée" au programme utilisant l'unité.

Lorsque vous avez fini d'écrire une unité, enregistrez le code source avec le nom de l'unité et l'extension .PAS. L'étape suivante, la compilation de l'unité, est abordée dans la section suivante.

Compiler une unité

Vous compilez une unité de la même manière que vous compilez un programme. Choisissez la commande Compile File dans le menu Make. Si votre code contient des erreurs empêchant la compilation de l'unité, le QuickPascal affiche un message d'erreur. Lorsque vous supprimez le message, le curseur apparaît à l'endroit où QuickPascal a détecté l'erreur. Corrigez l'erreur et répétez le processus jusqu'à ce que l'unité se compile.

Alternativement, vous pouvez compiler le programme principal et une nouvelle unité en une seule étape en choisissant la commande Rebuild Main File dans le menu Make (ou spécifiez l'option /R si vous compilez à partir de la ligne de commande QPL). Encore une fois, si QuickPascal en décompte des erreurs, la compilation s'arrête et un message d'erreur apparaît. Vous devez compiler toutes les unités personnalisées référencées par un programme avant de pouvoir compiler le programme principal.

Une fois que votre unité se compile correctement, vous pouvez l'utiliser dans n'importe lequel de vos programmes comme vous utiliseriez n'importe laquelle des unités standard. Si vous modifiez un programme utilisant une unité personnalisée, vous devez recompiler uniquement ce programme (et non l'unité). Cependant, si vous modifiez l'unité elle-même, vous devrez peut-être recompiler à la fois l'unité et le programme. Les commandes Build Main File et Rebuild Main File du menu Make simplifient cette tâche.

La commande Build Main File recompile tous les fichiers source ayant été modifiés depuis l'exécution de la dernière commande Build Main File. Rebuild Main File recompile le programme et toutes ses unités personnalisées associées, que quelque chose ait changé ou non.

Conseils pour la programmation avec des unités

Lorsque vous programmez avec des unités, évitez d'utiliser des identificateurs portant le même nom dans des unités différentes et des références circulaires entre unités.

Identifiants avec le même nom

Lorsque deux unités ou plus contiennent des identificateurs (tels que des noms de constantes ou de procédures) partageant le même nom, l'identificateur «appartient» à l'unité la plus récemment utilisée. Le QuickPascal utilise les unités dans l'ordre dans lequel elles apparaissent dans l'instruction USES.

Pour éviter toute confusion, vous pouvez référencer un identificateur de la même manière que pour référencer des champs dans des enregistrements à l'aide de cette syntaxe :

UnitName.Identifier

Par exemple, si vous avez une procédure ClrScr appelée SCRSTUFF.QPU, vous pouvez la référencer dans votre code en tant que ScrStuff.ClrScr dans une unité, et la norme ClrScr peut être référencée en tant que Crt.ClrScr. Ensuite, l'ordre des unités dans la déclaration USES n'a plus d'importance.

Référencement circulaire

Le QuickPascal permet à deux unités de se référencer. UNIT_A peut utiliser UNIT_B et UNIT_B peut utiliser UNIT_A. Cependant, le QuickPascal ne prend pas en charge les références circulaires entre trois unités ou plus. Le QuickPascal ne compilera pas un programme dans lequel UNIT_A utilise UNIT_B utilisant UNIT_C utilisant UNIT_A (une boucle A-B-C-A). Une planification minutieuse peut éviter les problèmes de référencement circulaire.

L'ordre des unités répertoriées après la déclaration USES n'a pas d'importance à moins que leurs procédures aient le même nom ou que le code d'initialisation d'une unité interfère avec le code d'initialisation d'une autre unité.



Dernière mise à jour : Dimanche, le 28 août 2022