next up previous contents index
Next: Portée Up: No Title Previous: Construction d'algorithmes

Global contre local

    

Un programme C est une liste de définitions de noms (de fonctions, et éventuellement de variables, de tableaux et de types). Ces noms, et les objets qu'ils désignent, sont dits globaux . Un nom défini à l'intérieur d'une fonction est dit local . Par exemple, dans :

int a = 3;

int f(int x) {
  int b = 4;
  ...
}

le nom de variable a est global, tandis que b est local (à f) ; le nom de fonction f est aussi global.

Les fonctions d'un programme C sont nécessairement globales, contrairement à Pascal qui permet de définir une fonction à l'intérieur d'une autre fonction. Par contre, les autres noms (variables, tableaux, types) peuvent être globaux ou locaux.

 

Les objets globaux sont alloués statiquement , au début de l'exécution du programme, avant que la fonction main ne commence son exécution. L'allocation statique est le seul mode d'allocation qu'offre Fortran 77. Les objets alloués statiquement sont les variables et les tableaux globaux et les variables et tableaux locaux statiques.

Les noms globaux assurent un rôle important, qui est la communication entre les différentes fonctions du programme. Pour des raisons d'organisation et de clarté des programmes, il est préférable de ne pas abuser des variables ou des tableaux globaux. En effet, toute fonction est susceptible d'utiliser et surtout de modifier une variable globale quelconque ; il faut lire tout le corps de la fonction pour savoir quelles sont les variables globales qui sont effectivement modifiées par la fonction, la déclaration de la fonction ne donnant aucune information à ce sujet.

D'autre part, l'accès des fonctions aux variables globales en lecture et en écriture a pour conséquence que l'appel de fonction n'a pas un caractère applicatif. Pour certaines expressions, comme x+y, leur valeur ne dépend que de la valeur de leurs sous-expressions, ici x et y : c'est une évaluation applicative. Ce n'est pas le cas d'un appel de fonction quand la fonction à la fois utilise et modifie une variable globale. Ainsi avec

  

int a = 3;

int f(int x) {
  a = a+1;
  return x+a;
}

la valeur d'un appel f(n) ne dépend pas seulement de f et de n, mais aussi de l'état global : f(0) retourne successivement 4, 5, 6, etc.

Un autre moyen de communication est en effet offert par les arguments et le résultat d'un appel de fonction. Par exemple, on peut remplacer l'accès au tableau global t dans f

double t[10];
double f(int n) { ... t[n-1] ... }
int main() { ... f(4) ... }

par l'accès au tableau a passé en paramètre

double f(int n, double a[]) { ... a[n-1] ... }
int main() {
  double t[10];

  ... f(4, t) ...
}

Plusieurs raisons incitent à utiliser des variables globales plutôt que des paramètres : l'économie en temps et en espace de la gestion du passage des arguments, une écriture plus concise des en-têtes des fonctions, la simplicité des opérations sur les tableaux à plusieurs dimensions.


next up previous contents index
Next: Portée Up: No Title Previous: Construction d'algorithmes
Jean-Philippe Chancelier
9/29/1998