Année universitaire 2002-2003
espace

Licence d'informatique
Module 4 - partie "C / shell"



Travaux dirigés 8 :

  • 1. Variables globales et variables locales.
  • 2. Classes d'allocation des variables globales.
  • 3. Classes d'allocation des variables locales.
  • 4. Exercice 1 : variable globale.
  • 5. Exercice 2 : compilation séparée.
  • 6. Boucle do-while.
  • 7. Exercice 3 : boucle do-while.

  • 1. Variables globales et variables locales.

    Un programme C peut être composé d'un ou de plusieurs "fichiers sources" (parfois également appelés "unités de compilation"). La structuration d'un programme en plusieurs fichiers sources n'implique pas forcément qu'il y ait des relations d'inclusion entre ces fichiers (à l'aide de directives du type #include). Ce point sera vu plus en détail dans la séance 9 de travaux dirigés.

    Exemple de programme composé de deux fichiers :


    fichier1.c

    int a=0;        /* Définition de la variable globale a. */
    static int b=1; /* Définition confidentielle de b. */
    int main(void)
    {
    ...
    }


    fichier2.c

    extern int a;   /* Référence à la variable globale a. */
    static int b=2; /* Définition confidentielle de b. */
    int fonct(int i)
    {
    static int c=2; /* Classe statique. */
    int d;          /* Classe automatique. */
    c++;
    ...
    }

    En C, la déclaration d'une variable peut être :

    Dans le cadre du module 4 de licence, nous avons choisi de déconseiller systématiquement l'utilisation de variables globales. Il est nécessaire de justifier ce parti pris, en énumérant les principaux avantages et inconvénients des variables globales :

    Or, dans le cadre du module 4, les avantages des variables globales nous semblent mineurs par rapport à leurs inconvénients...

    2. Classes d'allocation des variables globales.

    2.1. Classe externe.

    Lorsqu'une même variable (globale) doit être utilisée dans plusieurs fichiers, il est nécessaire de la "déclarer" dans chacun de ces fichiers, mais de deux façons différentes :

    La différence entre définition et référence réside dans la réservation (ou non) d'un espace mémoire pour la variable (les différents fichiers doivent faire référence à la valeur contenue dans un même espace mémoire). Pour faire référence à une variable déjà définie, il suffit de la faire précéder du mot-clé extern (cf. la variable a de l'exemple précédent).

    2.2. Classe confidentielle.

    Certaines variables globales, définies dans un fichier, ne doivent pas être référencées dans d'autres fichiers pour ne pas être confondues avec des variables globales définies dans ces autres fichiers. Pour exprimer le fait que de telles variables sont confidentielles à un fichier (c'est-à-dire visibles uniquement dans ce fichier), on fait précéder leur déclaration du mot-clé static (cf. les deux variables b de l'exemple précédent).

    3. Classes d'allocation des variables locales.

    3.1. Classe automatique.

    Lorsque la classe d'une variable locale n'est pas spécifiée, la classe "automatique" lui est alors attribuée par défaut, comme pour la variable d de l'exemple précédent.

    3.2. Classe statique.

    Une variable "statique" locale à une fonction, constitue une mémoire du passé pour cette fonction. Une fois initialisée, cette variable conserve son ancienne valeur à chaque nouvel appel de la fonction. Dans l'exemple précédent, la variable c de fichier2.c est initialisée à 2 lors du premier appel à la fonction fonct, puis est incrémentée. Lors de l'appel suivant, cette variable vaut 3 avant sa nouvelle incrémentation.

    4. Exercice 1.

    Écrire le fichier somme.c, contenant la fonction somme_chiffres d'en-tête :

    dont le rôle est de :

    5. Exercice 2.

    Écrire le fichier principal.c, contenant le programme principal effectuant l'appel à la fonction somme_chiffres écrite précédemment. Pour cela, on appliquera l'algorithme suivant :

    tant que le caractère lu par "scanf" est différent du caractère '$' :
    ce caractère est envoyé à la fonction "somme_chiffres" ;

    De plus, il est demandé de modifier somme.c de manière à calculer également le produit des chiffres trouvés. Ce produit sera affiché à chaque parcours de la boucle dans le programme principal.

    6. Boucle do-while.

    Ce type de boucle permet de réaliser un parcours de la boucle avant l'évaluation de la condition de boucle. Sa syntaxe :

    est équivalente à :

    Remarque :

    7. Exercice 3.

    Modifier le fichier principal.c de l'exercice 2 de manière à utiliser une boucle do-while. On suppose maintenant que la fin de la série de caractères à saisir est spécifiée par l'entrée du caractère 9 (qui doit être pris en compte pour le calcul de la somme et du produit).


    Ces pages ont été réalisées par A. Crouzil, J.D. Durou et Ph. Joly.
    Pour tout commentaire, envoyer un mail à crouzil@irit.fr, à durou@irit.fr ou à Philippe.Joly@irit.fr.