}

Langage de programmation C (IX). Caractéristiques des variables

1991/11/01 Alegria Loinaz, Iñaki | Maritxalar, Montse Iturria: Elhuyar aldizkaria

Il reste à analyser quelques caractéristiques relatives aux variables que gère le langage C, les plus importantes étant la durée et la portée.

Bien que les variables manipulées par le langage C et les types de données correspondants aient été analysées dans les chapitres précédents, certaines caractéristiques relatives aux variables n'ont pas été analysées, la durée et la portée les plus importantes (scope). En combinant ces caractéristiques on distingue les différents types de stockage de C : auto, static, extern et register.

Durée : Fixes vs Automatiques

Une variable fixe apparaît au début du programme et survit jusqu'à la fin de l'exécution du programme, en envahissant constamment sa partie de mémo. En revanche, une variable automatique est associée à une fonction ou bloc spécifique du programme. Par conséquent, cette fonction ou bloc n'est créée que lorsque vous commencez à démarrer et disparaîtra à la fin de l'exécution du bloc. Par conséquent, une variable automatique peut être générée plusieurs fois et si le bloc ou la fonction correspondant à la variable n'est pas utilisé dans une exécution, la variable ne sera pas générée.

Ce qui précède a une grande influence sur l'initialisation, puisque tant que les fixes ont une initialisation unique, les automatiques seront initialisés chaque fois que la fonction ou le bloc est référencé extérieurement.

Comme nous le verrons plus loin, les variables globales seront fixes et les variables locales seront automatiques.

Domaine d'application

Le cadre ou scope est le concept correspondant au programme source et représente le champ de connaissance du nom d'une variable. Dans le langage C, on distingue quatre types de domaines de connaissance:

  1. programme: le nom de la variable est global, donc il peut se référer à toute fonction, bloc ou ordre.
  2. du fichier: il n'est connu que dans le fichier source dans lequel le nom de la variable est défini. Par conséquent, lorsque la compilation distribuée est utilisée, si elle est référencée depuis un autre module, elle ne sera pas reconnue, car le compilateur le prendra comme une autre variable.
  3. de la fonction: le nom de la variable n'est connu que dans sa fonction ou sous-programme.
  4. le bloc: un bloc est celui qui se trouve entre les mêmes et les correspondants} et n'est connu que dans le bloc dans lequel la variable est définie.

La portée de la variable dépend de l'endroit où elle se trouve, bien que la static puisse changer les mots-clés.

Voici quelques exemples pour illustrer ce qui précède :

a) a)

Ces deux variables automatiques (appelées i) sont différentes car elles ont la portée du bloc.

Tout cela est dû à la localisation des définitions, étant dans la fonction la variable, sauf si on dit autre chose, est automatique et son champ est celui de blocage.

b)

j) j)

Nous avons deux variables, l'une globale, l'autre externe (fixe) et l'autre locale, incluse dans la fonction f1.

Les trois premiers résultats sont dus à l'exécution de la fonction f1 (l'initialisation est Ø lorsqu'elle est définie exclusivement) et la dernière au programme principal.

Types de stockage

Dans certains langages de haut niveau, on distingue deux types de stockage : global et local. En C, il est possible de combiner la durée et la portée des variables en obtenant différents types de stockage, en tenant compte de l'emplacement de la définition de la variable et de l'utilisation des mots-clés extern, static, auto et register.

Voyons la signification des indicateurs suivants:

extern:

Lorsque vous souhaitez utiliser une variable globale en dehors du module dans lequel elle est définie, une nouvelle estimation de la variable est effectuée, mais l'indicateur externe est prédéfini, indiquant que la définition est ailleurs.

static:

a double fonction. Réduit la vue du programme au fichier aux variables définies extérieurement (globales). Change la durée de ceux définis dans les fonctions à fixes.

auto:

s'adapte aux variables avec cadre de blocs mais définies dans les fonctions. Puisque ces variables, si elles ne correspondent à aucun indicateur, adoptent les mêmes caractéristiques que l'indicateur automatique, cet indicateur n'est pratiquement jamais utilisé.

register:

Cet indicateur ne peut être utilisé qu'avec des variables avec vue bloc et son incidence sur le temps d'exécution est l'emplacement de la variable dans un registre général. Cela permet d'accélérer l'exécution du programme en l'adaptant à des variables très utilisées.

La figure 1 contient un résumé de toutes les caractéristiques.

Figure . Durée et portée des variables selon l'indicateur. (Note: Pour bien voir l'image aller au pdf).

Utilisation

Une fois analysées toutes les fonctionnalités, nous allons voir l'utilisation des différents types de variables exposées. Nous pouvons distinguer quatre usages différents:

  • variables locales automatiques: ils sont les plus utilisés, car ils ont le champ du bloc et la durée automatique. La définition se fait dans les fonctions, sans aucun indicateur ou avec un register indicateur.
  • variable locale fixe: si une variable utilisée dans une seule fonction ou bloc doit maintenir sa valeur, d'un appel à l'autre, ce sera de ce type. La définition est faite comme ci-dessus mais en utilisant le mot-clé static.
  • variable globale simple: se caractérise par connaître et maintenir la valeur à partir de différentes fonctions ou blocs. Lors de la définition, aucun indicateur ne doit être placé, mais les fonctions sont définies séparément. Cependant, lorsqu'ils doivent être référencés depuis un autre module ou fichier, la variable doit être référencée en spécifiant l'indicateur externe. La plupart des fonctions (car il s'adapte à un type de fonction) sont généralement de ce type.
  • variable globale isolée: lors de la définition de nouveaux types de données, il est très intéressant que la variable soit captable des fonctions existantes dans le module qui définit le type de données, mais pas d'autres modules. La durée est fixe et le domaine du fichier est très intéressant. La définition est faite comme la précédente mais en préfixant l'indicateur static.
Figure . Définition d'un nouveau type de données.

Dans la figure 2, vous pouvez voir un exemple dans lequel le nouveau type de données de pile qui est défini dans celui-ci est accessible à l'extérieur uniquement par les fonctions push, pop et clear.

Dans le module dans lequel une de ces fonctions est utilisée, une mention est faite en spécifiant l'indicateur externe. Par exemple pour utiliser push: extern void push ( ).


Mémoire dynamique

Les variables vues jusqu'à présent sont statiques, c'est-à-dire que le compilateur connaîtra la quantité de mémoire qu'ils occupent et peut donc prédire leur emplacement.

La mémoire dynamique est intéressante lorsque la longueur des données que nous gérons est variable en fonction de l'exécution. Les démonstrateurs Pascalez sont dynamiques, car ils sont sollicités et libérés par les fonctions new et dispose. En C, il existe un mécanisme d'acquisition et de libération de mémoire dynamique grâce aux fonctions de bibliothèque malloc, calloc, realloc et free qui seront exposées au chapitre 11.

Gai honi buruzko eduki gehiago

Elhuyarrek garatutako teknologia