Accueil
Accueil
Le
Club
Delphi
Kylix
C
C++
Java
J2EE
DotNET
& C#
Visual
Basic
Access
Pascal
Dev
Web
PHP
ASP
XML
UML
SQL
SGBD
Win
Linux
Autres

        


Qu'est-ce qu'un mot réservé ?
auteur : Hdd34
Un mot réservé est une instruction spécifique du langage Pascal. Il est interdit d'utiliser un mot réservé comme nom de variable, de procédure ou de type. Vous pouvez reconnaître aisément un mot réservé dans l'environnement de Turbo Pascal : par défaut, il apparaissent en blanc en contraste avec le reste du code en jaune.
On compte 51 mots réservés dans Turbo Pascal, mais il en existe plus de 65 dans l'implémentation actuelle du Pascal Objet (Delphi 7). Les principaux sont : begin, end, if, then, else, for, to, do, while, repeat, until, and, or, not, const, type, var, string, etc...


Que sont les directives de compilation ? A quoi servent-elles ? Quelles sont elles ?
auteur : Hdd34
Une directive de compilation est une option que vous définissez uniquement pour votre programme, ou pour une partie de votre programme. Elles sont l'équivalent des panneaux sur le bord des routes, qui vous aident à vous diriger. Les directives de compilation aident pour leur part le compilateur à se diriger dans votre programme suivant vos souhaits.
Vous reconnaîtrez aisément une directive de compilation : comme les commentaires, elles sont écrites soit entre accolades { } soit entre couples "parenthèse étoile" (* *).
Toutefois, contrairement aux commentaires, elles commencent toujours par un signe dollar $.
Attention ! Vous ne devez pas mettre d'espace entre l'accolade et le dollar, sans quoi votre directive de compilation serait prise pour un simple commentaire.


Exemple de directives de compilation
{$X+} {$IFDEF Condition} (*$N+*)

Les directives de compilation peuvent être regroupées : vous devez indiquer la première avec une signe dollar $, puis placer les autres à la suite, sans signe dollar $, et séparées entre elles par une virgule :

{$X+,N+,E-}

Il existe deux types principaux de directives de compilation. Nous ne parlerons que des plus courantes.



Les directives conditionnelles


Comme leur nom l'indique, elles émettent une condition quant à leur compilation.

Vous émettez une condition avec {$DEFINE Condition}.
Vous supprimez une condition avec {$UNDEF Condition}.

Vous contrôlez la compilation d'un bloc de code avec {$IFDEF Condition} (si Condition est vérifiée) ou {$IFNDEF Condition} (si Condition n'est pas vérifiée).
Comme avec des blocs if standard, vous pouvez utiliser un bloc else avec {$ELSE}.
Vous terminerez chaque bloc conditionnel avec {$ENDIF}.

{$DEFINE Compile} {$IFDEF Compile} const { Ce code sera compilé } Etat = 'Compilé !'; {$ELSE} const { Celui-ci ne le sera pas } Etat = 'Pas compilé !'; {$ENDIF}




Les directives d'option


Souvent, vous activerez des options du compilateur dans le code avec des directives d'option. Ainsi, si une option ne doit être activée que pour un programme ou une partie d'un programme, alors vous ferez appel à celles-ci, plutôt qu'aux options définissables dans Options|Compiler...

Nous listerons ici les plus courantes. Pour plus d'informations, consultez l'aide de Turbo Pascal.


Directive

Signification

$E

Active l'émulation du coprocesseur arithmétique (voir $N)
$F

Active les mode d'appel far
$G

Active le code pour processeurs 286 ou supérieurs
$I

Active ou désactive la détection des erreurs d'entrée/sortie
$N

Active le coprocesseur arithmétique (au niveau matériel, voir $E)
$Q

Active la détection de débordement
$R

Active la détection de domaine
$X

Active la syntaxe étendue



Les autres directives


Il existe d'autres directives. Les plus utiles sont {$M Stack, HeapMin, HeapMax} et {$I IncludeFile}. Consultez l'aide pour plus d'informations.


Quelle est la différence entre une procédure et une fonction ?
auteur : Hdd34
Les procédures et les fonctions permettent toutes deux d'assembler une partie d'un programme se répétant, pour éviter d'avoir à réécrire un même code plusieurs fois. Elles permettent aussi d'automatiser des tâches, et surtout de clarifier et donc simplifier votre code.
Alors, procédures et fonctions, même chose ? Non ! Les fonctions font une chose que les procédures ne font pas : elles renvoient un résultat.
Prenons deux exemples. Si vous voulez calculer la somme de deux nombres, vous attendez un résultat : vous utiliserez une fonction. Si vous voulez effacer l'écran, vous attendez seulement que l'écran soit effacé, donc pas de résultat concret à traiter : vous utiliserez une procédure.


function Exemple: Integer; { On renvoie un résultat de type Integer } procedure Exemple; { On ne renvoie aucun résultat }

Comment déclarer des procédures qui s'appellent mutuellement ?
auteur : Hdd34
Lorsque deux procédures doivent s'appeler mutuellement, il faut choisir dans quel ordre les déclarer. A supposer que la procédure Proc1 doive appeler la procédure Proc2 et réciproquement, doit-on délarer Proc1 avant Proc2 ou bien l'inverse ?

Il suffit de faire l'essai pour se rendre compte qu'aucune des deux versions ne fonctionnera. Ainsi, le code suivant provoquera une erreur à la compilation :

procedure Proc1(n: Integer); begin if n > 0 then Proc2(n - 1); end; procedure Proc2(n: Integer); begin if n > 0 then Proc1(n - 1); end;

Par contre, si on place ce code dans une unité et que Proc1 et Proc2 sont déclarées en partie interface, alors aucune erreur ne se produit.

Tout ceci s'explique par la méthode de déclaration utilisée. Ainsi, dans une unité, toutes les procédures et fonctions déclarées dans la partie interface sont déclarées implicitement avec la directive forward. Par conséquent, il suffit de déclarer une procédure avec la directive forward pour pouvoir l'utiliser par la suite.


Notre problème se résout donc de la manière suivante :

{ On délare en tant que forward, comme on le ferait dans une unité - partie interface } procedure Proc2(n: Integer); forward; procedure Proc1(n: Integer); begin if n > 0 then Proc2(n - 1); end; { On complète la déclaration, comme on le ferait dans une unité - partie implementation } procedure Proc2(:n: Integer); begin if n > 0 then Proc1(n - 1); end;

Comment se servir des tableaux ?
auteur : Hdd34
Les tableaux font partie de l'arsenal de base du Pascal. Ne pas savoir s'en servir, c'est avoir de grosses lacunes. Pourquoi ne pas aller consulter un tutorial sur le sujet ?

=> Les tableaux


Paramètre par valeur ou par adresse ? Quelle est la différence ?
auteur : Hdd34
Une procédure ou une fonction accepte deux types de paramètres différents : les paramètres par valeur, et les paramètres par adresse.

Les premiers sont les plus courants. Il se déclarent simplement, un peu comme une variable :


procedure Calcule(A: Integer);


Un paramètre par valeur est toujours copié sur la pile pour être transmis à la procédure. De ce fait, la procédure peut le modifier à volonté sans que cela influe sur la valeur de celui-ci en dehors de la procédure : il n'est jamais modifié. Ainsi, dans ce programme :


var a: Integer; procedure Calcule(A: Integer); begin A := 5; end; begin a := 2; Calcule(A); end.

La valeur de a est 2 avant d'entrer dans Calcule, et elle est encore de 2 après être sorti de Calcule.

Les paramètre par adresse se déclare eux avec le mot réservé var les précédant :


procedure Calcule(var A: Integer);

Cette fois-ci, c'est l'adresse du paramètre qui est copiée sur la pile. Ainsi, si la procédure modifie le paramètre, avec cette modification est répercutée sur la variable originale. Donc, dans le programme suivant :


var a: Integer; procedure Calcule(var A: Integer); begin A := 5; end; begin a := 2; Calcule(A); end.


La variable a vaut 2 avant de rentrer dans Calcule, et vaut 5 en sortant.


Le compilateur m'indique une erreur quand j'essaie d'ajouter une clause else à un bloc if
auteur : Hdd34
Vous avez dû mettre un point-virgule là où Turbo Pascal n'en attend pas : il ne faut pas en mettre devant un else. La structure d'un bloc if est :


Standard
if Condition = True then begin ... end;


Avec bloc else
if Condition = True then begin ... end else begin ... end;

Je voudrais simplifier mon imbrication de blocs if
auteur : Hdd34
Il suffit d'utiliser une structure case :


Imbrication à simplifier
if X = A then DoA else if X = B then DoB else if X = C then DoC else if X = D then DoD else DoE;


On obtient alors :


case X of A: DoA; B: DoB; C: DoC; D: DoD; else DoE;

Pourquoi je ne peux pas utiliser de type complexe tel un record comme valeur de retour d'une fonction ?
auteur : Hdd34
Turbo Pascal 7 ne sait pas faire ! Il ne sait renvoyer que des types scalaires, pouvant être stockés sur un maximum de 32 bits (comme le type Longint ou Pointer). La seule exception à cette règle sont les chaînes de caractères, qui bénéficient d'une gestion particulière. Afin de passer outre cette limitation, il faut transformer votre fonction en procédure, et passer votre valeur de retour comme paramètre par adresse :


function Date: DateTime;=>procedure Date(var D: DateTime);

Dois-je mettre un point-virgule à la fin d'une instruction précédant un end ?
auteur : Hdd34
Dur de s'y retrouver : beaucoup d'enseignants ont tendance à omettre le point-virgule lorsqu'il précède un end. Par exemple :


... i := 2 end;


Le code précédent est tout à fait correct en soi. Il ne manque pas de point-virgule.
Toutefois, si la facilité peut pousser à ne pas mettre cette ponctuation, cela peut sembler incongru. Je vous conseille donc de toujours mettre un point-virgule.
En effet, tous les compilateurs accepteront qu'il y en ait un. Rien est moins sûr concernant son absence. Préférez donc la forme :


... i := 2; end;

        

Consultez les autres F.A.Q's

Les sources présentés sur cette pages sont libre de droits, et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright ©2004  Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérets. Cette page est déposée à la SACD.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright 2000..2005 www.developpez.com