1 Rappels et compléments du langage C 2 Rappels 3 Rappel Un programme C est une

1 Rappels et compléments du langage C 2 Rappels 3 Rappel Un programme C est une fonction de nom main() qui prend des arguments textuels en paramètre et renvoie un code de retour d’erreur entier Quelques possibilités ◮ Une déclaration de variable par ligne ◮ Une instruction élémentaire (pas bloc) par ligne ◮ Structure de contrôle : début de ligne ◮ Accolade ouvrante : fin de ligne ◮ Accolade fermante : seule sur une ligne ◮ Étiquette : seule sur une ligne 4 Types d’objet ◮ Types scalaires : objets élémentaires proches du matériel Types arithmétiques : pour faire des calculs au sens classique Pointeurs : référence à d’autres objets ou fonctions ◮ Types structurés Vecteurs : répétition ordonnée d’un même type Structures : rassemble éléments hétérogènes Union : fait coexister plusieurs types au même endroit mémoire • Types de fonction : précise à la fois type valeur de retour et type arguments • Types incomplets ◮ Incomplétude totale void ◮ Vecteur de taille non précisée 5 Types synonymes Le langage C permet de créer de nouveaux noms de types de données grâce à la fonction typedef. Par exemple : typedef int longueur fait du nom longueur un synonyme de int. La déclaration longueur l est équivalente à int l. ! Un typedef ne crée pas de nouveaux types mais de nouveaux noms pour des types existants 6 Principaux codes de conversion - printf c char: caractère affiché en clair (convient aussi à short ou int compte tenue des conversions systématiques) d int (convient aussi à char) u unsigned int (convient aussi à unsigned char ou unsigned short) ld long lu unsigned long f double ou float (compte tenu des conversions systématiques float- >double)écrit en notation décimale avec six chiffres après la virgule e double ou float écrit en notation exponentielle s chaîne de caractères 7 Principaux codes de conversion - scanf c char d int u unsigned int hd short int hu unsigned short int ld long int lu unsigned long int f, e float écrit indifféremment dans l’une des deux notations: décimale (éventuellement sans point, c’est-à-dire comme un entier) ou exponentielle(avec la lettre e ou E) lf , ledouble avec la même présentation que ci-dessus s chaîne de caractères 8 Les classes d’allocation de mémoire 9 Déclaration et définition Une déclaration : une association de type avec un nom de variable ou de fonction (dans ce cas la déclaration contient aussi le type des arguments de la fonction, les noms des arguments peuvent être omis), Une définition de variable est l’association d’un identifiant à un type et la spécification d’une classe mémoire. Une définition c’est une déclaration et si c’est une variable, une demande d’allocation d’espace pour cette variable, si c’est une fonction la définition du corps de fonction contenant les instructions associées à cette fonction. De manière simpliste, une déclaration fait référence à une définition dans une autre partie du programme. Elle peut se traduire par “je sais qu’il existe une variable ayant ce type et portant ce nom”. 10 Variables et déclarations Les déclarations des variables peuvent être : En dehors de toute fonction, il s’agit alors de variables globales À l’intérieur d’un bloc, il s’agit de variables locales Dans l’entête d’une fonction, il s’agit alors de paramètres ou d’arguments formels  soit dans les parenthèses (fonction définie avec un prototype)  soit entre le nom de la fonction et la première accolade (sans prototype) 11 Avec prototype – sans prototype Exemple avec prototype ; long i = 1; int fonction (int j) { short k; … } Exemple sans prototype : long i =1; int fonction(j) int j; { short k; … } Ci-dessus i est une variable globale, k une variable locale et j un argument formel (paramètre)de fonction 12 Règle fondamentale de visibité Toute variable ou fonction doit être déclarée avant d’être utilisée. (Par convention, dans le cas où une fonction n’est pas connue, le compilateur considère qu’elle retourne une valeur de type int et il essaye d’inférer le type des paramètres à partir de l’appel (les appels postérieurs devront se conformer à ce premier appel). La fonction peut aussi être définie plus loin dans le fichier.) 13 Exemple int a; /*variable globale*/ void f1(){ long a; ; /*variable locale à f1*/ a = 50; /*modification locale à f1*/ } void f2(void){ a= 10; /*modification globale*/ } void f3(float a ){/*paramètre de f3*/ a = 10; /*modification paramètre local à f3*/ } les règles de visibilité de noms nous permettent de dire : 1. la fonction f3 peut appeler les fonctions f3, f2, et f1 ; 2. la fonction f2 peut appeler la fonction f2, et f1 ; 3. la fonction f1 ne peut que s’appeler elle-même ; 14 Les classes d’allocation mémoire La classe mémoire sert à expliciter la visibilité d’une variable et son implantation en machine. Les classes mémoire sont : global : durée de vie = celle du programme auto : dans la pile static : local au fichier ou garde une vie après la mort extern : définie ailleurs register : essaye de garder en registre (très rapide mais rare, donc chère...) 15 Les classes d’allocation mémoire Les classes mémoire sont : global cette classe est celle des variables définies en dehors d’une fonction. Ces variables sont accessibles à toutes les fonctions. La durée de vie des variables de type global est la même que celle du programme en cours d’exécution. local ou auto : cette classe comprend l’ensemble des variables définies dans un bloc. C’est le cas de toute variable définie à l’intérieur d’une fonction. L’espace mémoire réservé pour ce type de variable est alloué dans la pile d’exécution. C’est pourquoi elles sont appelées aussi auto c.a.d automatique car l’espace mémoire associé est créé lors de l’entrée dans la fonction et il est détruit lors de la sortie de la fonction. La durée de vie des variables de type local est celle de la fonction dans laquelle elles sont définies. 16 Les classes d’allocation mémoire static ce qualificatif modifie la visibilité de la variable, ou son implantation : – dans le cas d’une variable locale, il modifie son implantation en lui attribuant une partie de l’espace de mémoire globale. Une variable locale de classe statique a un nom local mais a une durée de vie égale à celle du programme en cours d’exécution. – dans le cas d’une variable globale, ce prédicat restreint la visibilité du nom de la variable à l’unité de compilation. Une variable globale de type statique ne peut pas être utilisée par un autre fichier source participant au même programme par une référence avec le mot réservé extern (voir point suivant). 17 Exemple sur l’utilisation de static int a; /*variable globale*/ void f1(void){ static long a = 1;/*variable statique locale à f1*/ a + = 10; /*modification locale à f1*/ } void f2(void){ for(a = 1;a<10;a++)/*modification globale*/ f1(); } main() { f2(); } 18 Exemple sur l’utilisation de static : commentaire La durée de vie d’une variable locale statique est la même que celle des variables globales. A chaque appel, la fonction retrouve la valeur de la variable locale statique qu’elle a modifiée lors des appels précédents. L’initialisation d’une variable statique interne à une fonction est faite à la compilation, et non à l’entrée dans la fonction. Lorsque le programme s’exécute, la variable entière a global prend successivement les valeurs : 1 2 3 4 5 6 7 8 9 la variable a locale à f1 prend successivement les valeurs : 1 11 21 31 41 51 61 71 81 91. Nous pouvons donc avoir une variable interne à une fonction qui compte le nombre d’appels à cette fonction. 19 Les classes d’allocation mémoire extern ce qualificatif permet de spécifier que la ligne correspondante n’est pas une tentative de définition mais une déclaration . Il précise les variables globales (noms et types) ou fonctions qui sont définies dans un autre fichier source et qui sont utilisées dans ce fichier source. register ce qualificatif permet d’informer le compilateur que les variables locales définies dans le reste de la ligne sont utilisées souvent. Le prédicat demande de les mettre si possible dans des registres disponibles du processeur de manière à optimiser le temps d’exécution. Le nombre de registres disponibles pour de telles demandes est variable selon les machines. Il est de toute façon limité (4 pour les données, 4 pour les pointeurs sur un 680X0). Seules les variables locales peuvent être qualifiées register. 20 Qualificatifs d’aide au compilateur Une définition de variable qualifiée du mot const informe le compilateur que cette variable est considérée comme constante et ne doit pas être utilisée dans la partie gauche d’une affectation. Ce type de définition autorise le compilateur à placer la variable dans une zone mémoire accessible en lecture seulement à l’exécution. Le qualificatif volatile informe le compilateur que la variable correspondante est placée dans une zone de mémoire qui peut être modifiée par d’autres parties du système que le programme lui-même. Ceci supprime les optimisations faites par le uploads/Ingenierie_Lourd/ langage-c 4 .pdf

  • 43
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager