Cours C-3 1 Cours C-3 2 Procédure Introduction au langage C Cours 3 Procédures Jean-Jacques Girardot / Marc Roelens Septembre 2007 Construction du langage qui permet de désigner par un nom une portion de code, et de l exécuter à volonté Exemple void bonjour(void) printf("hello World\n") ; bonjour() ; bonjour() ; exit(0) ; Exécution [P]$ prog4 Hello World Hello World [P]$ Cours C-3 3 Retour au PGCD int A, B, C ; A = 834389 ; B = 944353 ; for ( ; ;) if (A<B) C=A ; A=B ; B=C ; if (A==B) printf("la valeur du PGCD est %d\n", A) ; exit(0) ; A=A-B ; exit(0) ; Comment calculer le PGCD de trois nombres? Cours C-3 4 Version 2 int A, B, C ; void pgcd(void) PGCD / 2 for ( ; ;) if (A<B) C=A ; A=B ; B=C ; if (A==B) return ; A=A-B ; A = 834389 ; B = 944353 ; pgcd() ; printf("la valeur du PGCD est %d\n", A) ; exit(0) ;
Cours C-3 5 Calcul du carré d un nombre Utilisation exécution int square(int x) return x*x ; Procédures avec paramètres et résultat int square(int x) return x*x ; int a=4, b=6 ; printf("%d %d %d %d\n", a, square(a), b, 3+square(b+1)) ; exit(0) ; 4 16 6 52 Cours C-3 6 Arguments, Paramètres et Résultats La déclaration des arguments et du résultat s effectue dans l en-tête de la procédure int pgcd(int A, int B) Les arguments sont des variables accessibles uniquement dans la procédure Le résultat est fourni par l instruction : return expression ; L utilisation de la procédure s effectue sous la forme nom(paramètres...) R = pgcd(a,b) ; les paramètres sont des expressions quelconques, dont les valeurs vont être affectées aux arguments de la procédure. Cours C-3 7 Cours C-3 8 Quelques types du langage C Types et prototypes Mots clefs Description Taille int entier 4 octets long entier 4 octets short entier 2 octets char entier 1 octet float flottant 4 octets double flottant 8 octets Notion de prototype Prototypes décrit les types des arguments et du résultat d une procédure int pgcd(int A, int B) ; int pgcd(int, int) ; les prototypes des procédures standard du langage sont décrits dans des fichiers tels que stdio.h sizeof(char) sizeof(short) sizeof(int) sizeof(long) sizeof(float) sizeof(double) Le type void : indique qu une procédure ne rend pas de résultat, ou n accepte pas de paramètres
Cours C-3 9 Cours C-3 10 Procédures : notes Déclaration toutes les procédures doivent être déclarées avant leur premier usage par défaut, une procédure est de type «int», sans paramètre exemple toto() int toto(void) déclaration correcte de la procédure principale Usage int main(int argc, char * argv[]) les procédures doivent être utilisées avec le nombre correct de paramètres, et des paramètres du bon type l instruction return doit fournir une valeur du type déclaré de la procédure le compilateur peut procéder à des conversions de taille ou de représentation des paramètres Appel Procédures : mécanisme d appel 1. les expressions utilisées comme paramètres dans l appel de la procédure sont calculées (dans un ordre inconnu) 2. les valeurs obtenues sont affectées aux arguments de la procédure, qui se comportent comme des variables locales à celle-ci 3. le corps de la procédure est exécuté 4. la valeur (éventuelle) fournie par une instruction return est rendue comme résultat de la procédure Cours C-3 11 Cours C-3 12 Procédures : exemple Programme int fun(int x) x = x+2 ; return x*x ; int x=3 ; printf("%d\n",fun(x)) ; printf("%d\n",x) ; exit(0) ; Résultat 25 3 Structure d un programme C Un programme C est une séquence de déclarations variables procédures la commande #include permet d inclure dans le fichier compilé les déclarations d objets (variables et procédures) des librairies du système ces déclarations sont dites «globales» Contraintes tout objet doit être déclaré avant sa première utilisation dans le texte pour cette raison, on place souvent les déclarations de variables en premier une procédure est «déclarée» soit par sa définition elle-même, soit par la déclaration de son prototype. Les deux peuvent apparaître dans un même fichier L exécution d un programme consiste en l exécution de la procédure de nom main
Cours C-3 13 Nature des variables Variables globales Ce sont celles qui sont déclarées dans le fichier du programme (hors procédure) Variables locales Les arguments d une procédure Les variables déclarées à l intérieur d une procédure note on ne peut définir de procédure à l intérieur d une autre procédure (mais on peut déclarer un prototype) déclarations locales : s effectuent après une accolade ouvrante avant toute instruction ne sont visibles que dans le bloc (défini par les accolades) où elles sont déclarées if (X<Y) int C ; C=X ; X=Y ; Y=C ; Cours C-3 14 Variables globales Initialisation des variables Elle reçoivent leur valeur initiale au lancement du programme ; les variables non initialisées ont la valeur 0. les valeurs initiales doivent être des constantes ou des expressions ne faisant intervenir que des constantes Variables locales Les arguments d une procédure reçoivent comme valeur initiale les valeurs des expressions utilisées dans l appel de la procédure Les variables déclarées dans un bloc avec initialisation reçoivent leur valeur à chaque entrée dans le bloc ces «valeurs initiales» peuvent être des expressions quelconques Les variables déclarées dans un bloc, mais non initialisées reçoivent une valeur indéterminée à chaque entrée dans le bloc (ce qui se trouve à cet endroit de la mémoire de l ordinateur) Cours C-3 15 Cours C-3 16 Visibilité des variables Les variables «visibles» à un emplacement d un programme sont les variables déclarées dans le bloc courant, puis les variables déclarées dans le bloc englobant, etc, jusqu aux variables globales int toto=2, toutou=3 ;... void fun(int titi,int tutu) int toutou=5 ; toto+titi+toutou ; /* E1 : 11 */ int toto = 10 ; toto+titi+toutou ; /* E2 : 19 */... fun(4,6) ;... Passage des paramètres le passage des paramètres se fait par valeur modifier l argument à l intérieur d une fonction n a pas d effet à l extérieur de celle-ci, et en particulier ne modifie pas une éventuelle variable utilisée comme paramètre
Cours C-3 17 Procédure PGCD - v2 Cours C-3 18 Fonctionnement du compilateur int pgcd(int A, int B) for ( ; ;) if (A<B) int C ; C=A ; A=B ; B=C ; if (A==B) return A ; A=A-B ; printf("la valeur du PGCD est %d\n", pgcd(834389,944353)); exit(0) ; Préprocesseur gère les lignes débutant par # commandes d inclusion d autres fichiers autres commandes, par exemple des «macro-définitions» #define PI 3.1415926535 remplacement des «macro-définitions» par leurs valeurs, suppression commentaires... Compilateur Analyse du programme source, transformation en «instructions élémentaires» Optimiseur Assembleur transformation des «instructions élémentaires» en langage machine Éditeur de liens (ou «relieur») rassembler tous les modules objets nécessaires pour constituer un programme exécutable Cours C-3 19 Cours C-3 20 Préprocesseur Exemple [P]$ cat prog01.c #define PI 3.1415926535 float c ; c = PI*2.5 ; [P]$ gcc -E prog01.c # 2 "prog01.c" float c ; c = 3.1415926535*2.5 ; Édition des liens Opération qui consiste à rassembler les modules objet et des librairies pour obtenir un programme exécutable exemple : édition des liens après compilation séparée des modules sources gcc -c square.c gcc -c prog07b.c gcc -o xyz prog07b.o square.o on peut mélanger sources et objets gcc -c square.c gcc -o xyz prog07b.c square.o
Cours C-3 21 Cours C-3 22 Édition des liens : bibliothèques Bibliothèques de nombreuses bibliothèques sont disponibles libc.a la bibliothèque «standard» du langage libgcc.a modules spécialisés de gcc libm.a procédures mathématiques libdbg.a mise au point les bibliothèques libc.a et libgcc.a sont liées par défaut, les autres doivent être indiquées explicitement : gcc -o zzz prog07c.o /usr/lib/libm.a gcc -o zzz prog07c.o -lm le relieur n ajoute pas la totalité du contenu d une bibliothèque, mais seulement les modules objets nécessaires au programme Quelques fonctions Prototype Fonctions utilitaires et mathématiques int abs(int p) double atof(char* s) int atoi(char* s) long atol(char* s) void exit(int cr) long labs(long p) int rand(void) void srand(int seed) Description Valeur absolue Conversion caractères vers flottant Conversion caractères vers entier Conversion caractères vers entier Arrêt du programme Valeur absolue Entier pseudo-aléatoire Init. du générateur pseudo-aléatoire Utilisation des fonctions utilitaires inclure stdlib.h dans le source ajouter -lc à la compilation Utilisation des fonctions mathématiques (page suivante) inclure math.h dans le source ajouter -lm à la compilation Cours C-3 23 Cours C-3 24 Prototype double acos(double x) double asin(double x) double atan(double x) double atan2(double x, double y) double ceil(double x) double cos(double x) double cosh(double x) double exp(double x) double fabs(double x) double floor(double x) double fmod(double x, double y) double log(double x) double log10(double x) double pow(double x, double y) double sin(double x) double sinh(double x) double sqrt(double x) double tan(double x) double tanh(double x) Description arc cosinus arc sinus arc tangente arc tangente partie entière cosinus cosinus hyperbolique exponentielle valeur absolue partie entière reste logarithme logarithme x y sinus sinus hyperbolique racine carrée tangente tangente hyperbolique Notes Écriture des programmes indenter correctement vos programmes sources consulter les manuels man gcc man 3 printf man 3 pow Compilation utiliser toutes les options permettant d obtenir les avertissements du compilateur gcc -Wall -ansi -pedantic toto.c -o toto Test écrire de petits morceaux, que l on teste au fur et à mesure ajouter des ordres d impression, à des fins de mise au point, que l on transforme ensuite en commentaires ne pas hésiter à utiliser gdb