cour langage c


LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 1123 APPRENTISSAGE DU LANGAGE quotCquot
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 2123 Licence de ce document Permission est accorde de copier distribuer etou modifier ce document selon les termes de la quotLicence de Documentation Libre GNUquot GNU Free Documentation License version 11 ou toute version ultrieure publie par la Free Software Foundation En particulier le verbe quotmodifierquot autorise tout lecteur ventuel apporter au document ses propres contributions ou corriger dventuelles erreurs et lui permet dajouter son propre copyright dans la page quotRegistre des ditionsquot mais lui interdit denlever les copyrights dj prsents et lui interdit de modifier les termes de cette licence Ce document ne peut tre cd dpos ou distribu dune autre manire que lautorise la quotLicence de Documentation Libre GNUquot et toute tentative de ce type annule automatiquement les droits dutiliser ce document sous cette licence Toutefois des tiers ayant reu des copies de ce document ont le droit dutiliser ces copies et continueront bnficier de ce droit tant quils respecteront pleinement les conditions de la licence La version actuelle de ce document est la 20 et sa version la plus rcente est disponible en tlchargement ladresse httpfrlangfreefr Copyright 2006 Frdric Lang frederic-langfrfm
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 3123 Registre des ditions Version Date Description des modifications Auteur des modifications 10 2000 Cration du document Frdric Lang frederic-langfrfm 11 6 fvrier 2004 Modification de lexercice quotTriangle de Pascalquot Refonte du chapitre sur les pointeurs Ajout du registre des ditions Ajout de la licence de ce document Ajout dexemples et exercices Frdric Lang frederic-langfrfm 12 20 fvrier 2004 Corrections mineures dans lexercice quotTriangle de Pascalquot Ajout de la fonction quotstrerrorquot Corrections mineures fautes dothographes etc Frdric Lang frederic-langfrfm 13 27 avril 2004 Ajout des fonctions quottruncatequot et quotftruncatequot Modification des en-ttes Frdric Lang frederic-langfrfm 14 30 juillet 2004 Modification de petits dtails sur les structures et sur les options de compilation Frdric Lang frederic-langfrfm 15 26 aot 2004 Ajout des types quotlong longquot et quotlong doublequot Ajout des fonctions quotgetlinequot et quotgetdelimquot Ajout des fonctions quotfpurgequot et quotfpurgequot Modifications de mise en page Frdric Lang frederic-langfrfm 16 16 mars 2005 Rajout des notions quotstdinquot quotstdoutquot et quotstderrquot Rajout des fonctions quotgetcquot et quotputcquot Rajout des fonctions quotgetcharquot et quotputcharquot Rajout des fonctions quotgetsquot et quotputsquot Correction de la fonction quotfflushquot Corrections mineures Frdric Lang frederic-langfrfm 20 5 avril 2005 Modification du titre du document Rajout de la notation constante en quotfloatquot Rajout du type des fonctions quotmainquot dans les exemples et exercices Frdric Lang frederic-langfrfm
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 4123 SOMMAIRE I GENERALITES 7 1 INTRODUCTION HISTORIQUE 7 2 NOTIONS DE FONCTIONS ET DE BLOCS 8 3 LE COMPILATEUR C SOUS quotUNIXquot 9 4 LA DOCUMENTATION C SOUS quotUNIXquot 10 II ELEMENTS DE BASE DU LANGAGE 11 1 LES IDENTIFICATEURS 11 2 LES MOTS RESERVES 11 3 LES SEPARATEURS 12 4 LES COMMENTAIRES 12 5 LES VARIABLES 13 III LEMENTS DE BASE POUR DEBUTER 14 1 LES TYPES DE BASE 14 a Les entiers 14 b Les rels 14 c Les boolens 14 2 LES CONSTANTES 15 3 LES INSTRUCTIONS 16 4 LES OPERATEURS 17 a Oprateurs binaires 17 b Oprateurs dopration avec affectation 17 c Oprateurs unaires 18 d Oprateurs ternaire 18 e Valeur et renvoi dinstruction 18 f Oprateur de concatnation 18 g Exercices 18 5 LAFFICHAGE LA SAISIE 19 6 LA CONVERSION DE TYPE CASTING 20 a Gnralits 20 b Conversions de type explicites 20 c Conversions de type implicites 20 IV LES TYPES DERIVES 21 1 LES TABLEAUX 21 2 EXERCICE 22 3 LES CHAINES DE CARACTERES 23 4 LA CREATION DE NOUVEAU TYPE 24 V LES INSTRUCTIONS DE CONTROLES 25 1 LINSTRUCTION quotIF ELSEquot 25 2 LINSTRUCTION quotWHILE quot 26 3 LINSTRUCTION quotDO WHILE quot 27 4 LINSTRUCTION quotFOR quot 28 5 LES INSTRUCTIONS quotBREAKquot ET quotCONTINUEquot 29 6 LINSTRUCTION quotGOTOquot 30 7 LINSTRUCTION quotSWITCH CASEquot 31 8 LINSTRUCTION quotEXIT quot 32 9 EXERCICES 33 VI LES FONCTIONS 36 1 DEFINITION DE FONCTION 36 2 PROTOTYPE DES FONCTIONS 37 3 APPEL DUNE FONCTION 37 4 PASSAGE DE PARAMETRES 38 5 RETOUR DU RESULTAT 38 6 LA FONCTION quotMAINquot 38
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 5123 7 EXERCICE 39 8 CAS PARTICULIER FONCTION RECEVANT UN TABLEAU EN PARAMETRE 40 9 CAS PARTICULIER FONCTION DEVANT RENVOYER UN TABLEAU 40 VII LA RECURSIVITE 41 1 RECURSIVITE SIMPLE 41 2 RECURSIVITE DOUBLE 41 3 RECURSIVITE CROISEE 42 4 CONCLUSION 42 5 EXERCICE CHANGEMENT DE BASE 43 VIII ETUDE DE CAS LE TRIANGLE DE PASCAL ETUDE DES DIFFERENTS SOLUTIONS 44 1 PRINCIPE DES DIFFERENTES SOLUTIONS 44 2 SOLUTION UTILISATION DE LA FACTORIELLE POUR CALCULER LES COMBINAISONS 45 3 SOLUTION METHODE PAR ADDITION DES VALEURS DE LA LIGNE PRECEDENTE 47 4 SOLUTION CONSERVATION DES COMBINAISONS DEJA CALCULEES 49 5 SOLUTION CALCUL DE LA COMBINAISON PAR SIMPLIFICATION DE LA FRACTION 51 6 CONCLUSION 52 IX LA VISIBILITE DES VARIABLES - LES CLASSES DALLOCATION DES VARIABLES 53 1 VISIBILITE DES VARIABLES 53 a Variable locale 53 b Variable globale 54 2 CLASSES DALLOCATION DES VARIABLES 55 a Classe automatique mot-clef quotautoquot 55 b Classe registre mot-clef quotregisterquot 55 c Classe statique mot-clef quotstaticquot 55 d Classe externe mot-clef quotexternquot 56 3 RESUME VISIBILITEDUREE DE VIE 57 4 LES EXCEPTIONS quotCONSTquot ET quotVOLATILEquot 57 X LES POINTEURS 58 1 GENERALITES 58 2 PREMIER ESSAI DE POINTEUR 59 a Premier pointeur Le pointeur simple 59 b Second pointeur Le pointeur sur un pointeur ou double pointeur 61 3 POINTEURS ET TABLEAUX 64 4 OPERATION SUR LES POINTEURS 65 5 OU LA LOGIQUE DEMONTRE LIMPOSSIBLE 66 6 DANGER DU POINTEUR 66 7 TABLEAUX DE POINTEURS 67 8 FONCTIONS PARAMETRES ET POINTEURS 69 a Modification dune variable passe une fonction 69 b Doit-on mettre quotampquot ou quotquot 70 c Fonction renvoyant un pointeur 70 9 POINTEUR SUR RIEN POINTEUR SUR TOUT 71 10 EXERCICES 72 11 POINTEUR SUR FONCTION 76 a Gnralits 76 b A quoi a sert 76 c Exemple 77 d Exercice 78 XI LES TYPES DERIVES 79 1 LES STRUCTURES 79 a Gnralits 79 b Dfinition dune structure 79 c Laccs aux membres dune structure 81 2 LES UNIONS 82 a Gnralits 82 b Dfinition dune union 82 c Laccs aux membres 82
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 6123 3 LES ENUMERATIONS 83 XII LE PRE PROCESSEUR 84 1 LA DIRECTIVE quotDEFINEquot 84 a Utilisation 84 b Les dangers - Les prcautions prendre 85 c Les macro dfinitions internes 86 d Cration et suppression de macro dfinitions lors de la compilation 86 2 LA COMPILATION CONDITIONNELLE 87 3 LINCLUSION DES FICHIERS 88 a Utilisation 88 b Les dangers - Les prcautions prendre 89 4 LA GESTION DES CHAINES 90 5 LES AUTRES DIRECTIVES 90 XIII LES PARAMETRES DE quotMAINquot 91 1 EXPLICATION 91 2 SCHEMA 92 3 EXEMPLE 93 XIV LA BIBLIOTHEQUE STANDARD 94 1 GESTION DE LA MEMOIRE 94 a Fonctions de rservation et de libration de zones mmoires 94 b Fonctions de manipulation de zones mmoires 95 c Exemple 96 2 GESTION DES CARACTERES 98 a Fonctions de vrification de la catgorie du caractre 98 b Fonctions de modification de la catgorie de caractre 98 c Dangers 98 3 GESTION DES CHAINES DE CARACTERES 99 4 GESTION DES FICHIERS MODE BUFFER 103 a Fonctions douverture et de fermeture de fichiers 103 b Fonctions de lecture et dcriture 104 c Autres fonctions 107 d Exercice 110 5 GESTION DES EXCEPTIONS 113 a La variable quotextern int errnoquot 113 b La variable quotextern const char const syserrlistquot 114 c La variable quotextern int sysnerrquot 114 d La fonction quotstrerrorquot 115 e Fonction quotperrorquot 116 6 FONCTIONS MATHEMATIQUES 117 XV ANNEXES 118 1 PRIORITES DES OPERATEURS PAR ORDRE DECROISSANT 118 2 OPTIONS DE quotPRINTFquot ET quotSCANFquot 119 3 LES PROBLEMES LES PLUS FREQUENTS 120 a Mes affichages ne se font pas au bon moment 120 b Mes saisies se font une fois sur deux 121 c Mes boucles ne sarrtent pas 122 d Les fonctions de la librairie mathmatique renvoient des valeurs incohrentes 122 INDEX 123
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 7123 I GENERALITES La programmation en C cest comme le sexe chez les adolescents Tout le monde y pense Tout le monde en parle Tout le monde croit que le voisin le fait Presque personne ne le fait Ceux qui le font le font mal Pensent que la prochaine fois ce sera mieux Ne prennent pas de prcautions Nosent pas avouer leurs lacunes de peur de paratre niais Sont fort bruyants quand ils y arrivent 1 Introduction Historique Le langage C est un langage de programmation conu pour de multiples utilisations Son dveloppement est parallle au systme UNIX car le noyau du systme UNIX est crit en langage C Dsormais il est utilis sur tous les systmes dexploitation et donc sur toutes les machines Les principes fondamentaux du langage C sont issus des langages B et BCPL crs vers 1970 pour le premier systme UNIX dans les laboratoires ATampT par Ken Thompson et Dennis Ritchie En 1970 Ken Thompson cre le langage B inspir du BCPL En 1972 Dennis Ritchie dfinit le langage C partir des travaux de Ken Thompson Ces travaux seront continus par Brian W Kernigham et Dennis Ritchie en 1972 pour donner naissance au premier ouvrage de rfrence quotLe langage Cquot ditions MASSON Si le noyau du langage C est assez restreint il senrichit dune librairie standard qui contient des fonctions permettant les traitements les plus divers Entres-Sorties Fichiers Traitements des chanes de caractres Gestion dynamique de la mmoire etc Ltude du systme UNIX passe obligatoirement par ltude du langage C Ultrieurement il sera possible daborder ltude de la POO Programmation Oriente Objet en C Des travaux de normalisation ont t entrepris partir de 1983 Le C-ANSI a t approuv fin 1988 Norme X3-159-1989 Dans ce document on sefforcera dutiliser la norme ANSI Tous les exemples sauf avertissement seront donns pour un compilateur UNIX cc ou gcc respectant la norme ANSI
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 8123 2 Notions de fonctions et de blocs Les units de structurations du langage C sont la fonction qui correspond la notion de sous-programme en PASCAL FORTRAN ou ADA Il ny a pas de distinction entre procdure qui effectue une action mais qui ne renvoie rien et fonction qui calcule et renvoie un rsultat en fonction de paramtres les fichiers comprenants des dclarations de fonctions et dobjets Les fichiers peuvent tre compils sparments Ils constituent des modules briques de base dans la construction dapplications Un programme C cest en fait un ou plusieurs fichiers comprenant des dclarations de fonctions des dclarations dobjets variables ou constantes des instructions de travail des directives pour le pr processeur Contrairement PASCAL ou ADA on ne peut dclarer de fonction lintrieur dune autre fonction Une fonction est un module ou sous programme destine effectuer une opration lmentaire et une seule en dfinissant les cas limites En langage C un programme source est constitu de fonctions dont une particulire appele main constitue le point dentre et de sortie du programme On doit donc imprativement trouver quotmainquot dans un programme et on ne doit en trouver quun seul Un bloc est un ensemble dinstructions formant une entit logique indissociable borne par une accolade ouvrante quotquot dbut et une accolade fermante quotquot finLe plus grand bloc est la fonction mais celle-ci peut contenir dautres blocs dinstructions Exemple de programme en C fonction1 Fonction 1 Point dentre dans la fonction 1 Variables ventuelles Commentaires ventuels Instructions Point de sortie de la fonction 1 main Fonction principale - Point dentre du programme Variables ventuelles Commentaires Instructions Point de sortie du programme fonctionN Fonction N Point dentre dans la fonction N Variables ventuelles Commentaires ventuels Instructions Point de sortie de la fonction N
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 9123 3 Le compilateur C sous quotUnixquot Lensemble dun excutable peut tenir dans plusieurs fichiers sources chacun contenant une ou plusieurs fonctions utilises par le programme La compilation dun programme consistera alors transformer chaque source en un module quotobjetquot et relier ensuite les diffrents modules quotobjetquot pour produire un excutable Objet 1o Objet 2o Objet 3o Bibliothque 1a Bibliothque 2a Edition de liens EXECUTABLE Pr-compilation Traduction en assembleur Assemblage Source 1c Source 2c Source 3c Source 1i Source 2i Source 3i Source 1s Source 2s Source 3s
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 10123 Le passage du fichier source au module quotobjetquot est gnralement automatique pour le compilateur sauf si on lui demande expressment de sarrter en chemin De plus comme il existe trs souvent quun seul source par excutable le compilateur continue gnralement son travail jusqu produire lexcutable La commande de compilation sous UNIX est cc options liste de fichiers Extension des fichiers c Fichier source i Fichier interprtable par le compilateur s Module assembleur o Fichier objet a Librairie statique sans extension Excutable Quelques exemples de la commande quotccquot cc ficc Compilation de quotficcquot Lexcutable gnr est automatiquement nomm quotaoutquot cc ficc -o prog Compilation de quotficcquot Lexcutable gnr est nomm quotprogquot cc -O ficc -o fic Compilation optimise de quotfic1cquot Lexcutable gnr est nomm quotficquot cc -c ficc Compilation partielle de quotficcquot La compilation sarrte au module objet nomm quotficoquot cc -S ficc Compilation partielle de quotficcquot La compilation sarrte la cration dun source en assembleur nomm quotficsquot cc -P ficc Compilation partielle de quotficcquot La compilation sarrte la cration dun source quotficiquot directement compilable cc fic1c fic2c -o prog Compilation des deux sources lis quotfic1cquot et quotfic2cquot pour produire un excutable quotprogquot cc fic1o fic2o -o prog Compilation des deux modules objets lis quotfic1oquot et quotfic2oquot pour produire un excutable quotprogquot cc ficc libtruca -o prog Compilation de quotficcquot en le liant la librairie quotlibtrucaquot pour produire un excutable quotprogquot cc ficc lm -o prog Compilation de quotficcquot en le liant la librairie mathmatique quotusrliblibmaquot pour produire un excutable quotprogquot Loption quot-lltqqchosegtquot est un raccourci vers quotusrliblibqqchoseaquot cc -g ficc Compilation de quotficcquot avec insertion automatique dinstructions de dbogage Lexcutable gnr est automatiquement nomm quotaoutquot cc ficc -qsrcmsg Compilation de quotficcquot avec affichage de toutes les lignes contenant des erreurs si erreur il y a Lexcutable gnr est automatiquement nomm quotaoutquot cc ficc -qxref Compilation de quotficcquot et cration dun listing quotficlstquot qui donne les rfrences croises quelle fonction appelle quelle autre fonction Lexcutable gnr est automatiquement nomm quotaoutquot Remarques la librairie standard quotusrliblibcaquot contenant une multitude de fonctions de travail est toujours automatiquement lie lors de la compilation 4 La documentation C sous quotUnixquot Chaque fonction du langage est explique dans la documentation intgre dUnix commande quotmanquot En cas de besoin laccs est toujours possible Exemple Pour une aide sur la fonction quotprintfquot man printf
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 11123 II ELEMENTS DE BASE DU LANGAGE 1 Les identificateurs Un identificateur permet de nommer une variable une pseudo constante sera vue en fin de cours ou une fonction Ils doivent tre crits selon les rgles suivantes 32 caractres maximum certains systmes ne tiennent compte que des 8 premiers le premier caractre doit obligatoirement tre soit une lettre soit le caractre quotsoulignquot mais cest viter pour la clart du source les autres caractres peuvent tre indiffremment des lettres a-z des chiffres 0-9 ou le caractre quotsoulignquot le signe quotmoinsquot lespace parfois les caractres accentus ainsi que tous les caractres non cits prcdemment sont interdits En rgle gnrale le nom des variables est crit en lettres minuscules avec quelques majuscules pour faire ressortir le but de la variable et celui des pseudo constantes cf chapitre sur le prprocesseur totalement en majuscules conventions des programmeurs Le compilateur C fait la diffrence entre majuscules et minuscules Certains identificateurs sont interdits car ils constituent les mots rservs du langage vu plus loins Autoriss Interdits Raison de linterdiction i Cpt-Lig Prsence du caractre quotmoinsquot j a z Prsence de lespace CompteurLignes 3f25 Commence par un chiffre Compteur2Col a Prsence du caractre quotdollarquot 2 Les mots rservs Certains mots sont rservs par le langage car ils ont une signification particulire Il est alors interdit dutiliser un de ces mots comme identificateur Bien que le compilateur fasse la diffrence entre majuscules et minuscules et quon puisse donc utiliser un de ces mots en majuscules comme identificateur il est prfrable pour la clart du source dviter cette attitude de programmation Types Classes Instructions Autres char auto break case double const continue default float extern do enum int register else sizeof long static for typedef short volatile goto signed if struct return union switch unsigned while void
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 12123 3 Les sparateurs Les diffrents sparateurs reconnus par le compilateur peuvent avoir plusieurs significations Type Nom Significations Crochets Indice daccs dans un tableau Parenthses 1 Groupement dexpressions force la priorit 2 Isolement des expressions conditionnelles 3 Dclaration des paramtres dune fonction 4 Conversion explicite dun type casting Accolades 1 Dbut et fin de bloc dinstructions 2 Initialisation la dclaration dun tableau 3 Dclaration dune structure Virgule 1 Spare les lments dune liste darguments 2 Concatnation dinstructions Point virgule Terminateur dinstruction Deux points Label Point Accde un champ dune structure -gt Flche quotmoinsquot suivi de quotsuprieurquot Accde un champ dun pointeur sur une structure 4 Les commentaires Les commentaires permettent de porter des remarques afin de faciliter la lecture dun programme source Chaque commentaire est dlimit par les combinaisons suivantes quot Commentaire quot Les commentaires ne sont pas pris en compte par le compilateur et naugmentent donc pas la taille des programmes excutables Les commentaires peuvent tenir sur plusieurs lignes du style Je commente mon programme Je continue mes commentaires Jai fini mes commentaires Les commentaires ne peuvent pas tre imbriqus comme dans le style Dbut Commentaire 1 Commentaire 2 Fin commentaire 1 Remarque Les compilateurs rcents acceptent comme commentaire la squence quotquot spcifique au langage quotCquot qui permet de ne commenter quune ligne ou une partie de la ligne Cette ligne est totalement mise en commentaire int i Le commentaire ne commence qu la squence quotquot
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 13123 5 Les variables Comme tout langage dclaratif le langage C exige que les variables soient dclares avant leur utilisation En fait pour chaque bloc dinstructions dlimit par des accolades quotquot il faut dclarer toutes les variables avant que soit crite la premire instruction du bloc Mais cette rgle tant valable pour chaque bloc on peut aussi dclarer des variables dans des sous-bloc dinstructions Exemple Bloc dinstruction n 1 Dclaration des variables avant toute instruction du bloc n 1 Instruction Instruction Sous-bloc dinstruction n 2 Dclaration des variables avant toute instruction du bloc n 2 Instruction Instruction Instruction appartenant au bloc n 1 Une variable est dfinie par plusieurs attributs certains facultatifs mais ayants alors une valeur par dfaut sa classe dallocation en mmoire quotautoquot par dfaut en cas de variable numrique lindication quotsignquot ou quotnon-signquot sign par dfaut le type de la valeur quelle doit stocker entier par dfaut nombre en virgule flottante etc son nom lidentificateur de la variable Dclaration classe unsignedsigned lttypegt ltidentificateurgt noubliez pas le point-virgule final Exemple static int nb Dclaration dune variable nb de type int de classe static int i Dclaration dune variable i de type int de classe auto par dfaut Remarque la notion de classe sera revue plus en dtail par la suite du cours Jusque l il suffira de ne pas spcifier de classe pour vos variables Lors de sa cration en mmoire une variable possde nimporte quelle valeur Il convient donc de ne jamais prsumer de la valeur dune variable non-initialise
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 14123 III LEMENTS DE BASE POUR DEBUTER 1 Les types de base Les types de base correspondent aux types directement supports par la machine Dans le langage C tout type de base est un nombre cod sur un ou plusieurs octets Donc tout type de base accepte toute opration mathmatique de base a Les entiers int entier cod sur 2 ou 4 octets suivant la machine sur laquelle on travaille Dans le monde Unix il est gnralement de 4 octets Sa plage de valeur peut donc aller de -231 231 1 cest dire de 2 147 483 648 2 147 483 647 sil est dclar sign 0 232 1 cest dire de 0 4 294 967 296 sil est dclar non-sign short int entier court cod sur 2 octets Le mot quotshortquot est suffisant par lui-mme donc le mot quotintquot nest pas obligatoire Sa plage de valeur peut aller de -215 215 1 cest dire de 32 768 32 767 sil est dclar sign 0 216 1 cest dire de 0 65 535 sil est dclar non-sign long int entier long cod sur 4 octets Le mot quotlongquot est suffisant par lui-mme donc le mot quotintquot nest pas obligatoire Sa plage de valeur peut aller de -231 231 1 cest dire de 2 147 483 648 2 147 483 647 sil est dclar sign 0 232 1 cest dire de 0 4 294 967 296 sil est dclar non-sign long long int entier long cod sur 8 octets Les mots quotlong longquot sont suffisants par eux-mmes donc le mot quotintquot nest pas obligatoire Sa plage de valeur peut aller de -263 263 1 cest dire de 9 223 372 036 854 775 808 9 223 372 036 854 775 807 sil est dclar sign 0 264 1 cest dire de 0 18 446 744 073 709 551 615 sil est dclar non-sign char caractre ASCII qui est un nombre entier cod sur 1 octet Lui aussi de par sa nature numrique accepte des oprations mathmatiques Sa plage de valeur peut aller de -27 27 1 cest dire de 128 127 sil est dclar sign 0 28 1 cest dire de 0 255 sil est dclar non-sign Remarques Ajouter 1 une variable ayant atteint sa limite maximale la fait basculer en limite minimale perte de la retenue Cest dire que quot127 1 -128quot si on travaille sur une variable de type quotchar signquot Il est possible de forcer un entier tre sign ou non-sign en rajoutant le mot clef quotsignedquot ou quotunsignedquot avant son type char int short int long int Dans le monde Unix une variable est signe par dfaut donc le mot clef quotsignedquot est inutile b Les rels Ils respectent les rgles de codage IBM des rels utilisant un bit pour le signe quotxquot bits pour la mantisse et quotyquot pour lexposant Ils sont de deux types standard et un troisime non-standard float rel en virgule flottante cod sur 4 octets Sa plage de valeur est de -701 411 x 10-38 - 701 411 x 1038 double rel en virgule flottante cod sur 8 octets Sa plage de valeur est de -10 x 10-307 - 10 x 10307 long double Rel en virgule flottante cod sur 12 octets Sa plage de valeur est de -34 x 10-4932 -11 x 104932 Mais ne faisant pas partie de la norme ANSI il est souvent transform en quotdoublequot par les compilateurs normaliss c Les boolens Il nexiste pas en langage C de type boolen Mais la valeur zro est considre par le langage Comme quotfauxquot et toute autre valeur diffrente de zro est considre comme quotvraiquot
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 15123 2 Les constantes Les constantes permettent de symboliser les valeurs numriques et alphabtiques de la programmation courante Il peut paratre trivial den parler tellement on y est habitu mais cela est utile en langage C car il existe plusieurs formats de notation constantes numriques en base 10 on les note de la mme faon que dans la vie courante Ex 5 cinq -12 moins douze 17 dix-sept -45 moins quarante cinq etc constantes numriques en base 8 on les note en les faisant toutes commencer par le chiffre quot0quot Ex 05 cinq -012 moins dix 017 quinze -045 moins trente-sept etc constantes numriques en base 16 on les note en les faisant toutes commencer par les caractres quot0xquot ou quot0Xquot Ex 0x5 cinq -0x12 moins dix-huit 0x17 vingt-trois -0x45 moins soixante-neuf etc Remarque il est possible de demander explicitement le codage des constantes prcdemment cites sur un format quotlongquot en les faisant suivre de la lettre quotlquot ou quotLquot Ex 5L nombre quotcinqquot cod sur 4 octets constantes ascii on les notes en les encadrant du caractre quotquot guillemet simple ou accent aigu Comme il sagit dun code ascii le langage les remplacera par leur valeur prise dans la table des codes ascii Ex a quatre-vingt dix sept A soixante-cinq 5 cinquante-trois etc constantes code ascii permettent de coder une valeur ascii ne correspondant aucun caractre imprimable On utilise alors un backslash quotquot suivi de la valeur ascii convertie en base 8 sur trois chiffres en compltant avec des zros si cest ncessaire ou bien la valeur ascii convertie en base 16 et prcd du caractre quotxquot le tout encadr des caractres quotquot guillemet simple ou accent aigu Ex 141 quatre-vingt dix sept code ascii de quotaquot x35 cinquante-trois code ascii de quot5quot etc constantes en virgule flottante notation anglo-saxonne un nombre avec un quotquot point sparant la partie entire de la partie fractionnelle Ex 31416 notation scientifique un nombre avec un quotequot ou un quotEquot indiquant lexposant du facteur quot10quot Ex 3e18 3 x 1018 Remarque toutes les constantes en virgule flottantes sont codes en format quotdoublequot Il est cependant possible de demander explicitement le codage de ces constantes sur un format quotfloatquot en les faisant suivre de la lettre quotfquot ou quotFquot Ex 31416F nombre quot31416quot cod sur 4 octets constantes prdfinies il sagit de constantes prdfinies par le compilateur et ayant une fonction spciale On utilise la constante telle quelle encadre des caractres quotquot guillemet simple ou accent aigu Constante Signification Valeur n Fin de ligne 10 t Tabulation horizontale 99 v Tabulation verticale 11 b Retour arrire 8 r Retour chariot 13 f Saut de page 12 a Signal sonore 7 Anti slash 92 quot Guillemet 34 Apostrophe 44 Remarque Comme le langage ramne toutes ces constantes vers un codage binaire unique et commun il est possible de les mlanger loisir A 1 66 0102 0x42 B
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 16123 3 Les instructions Le corps dun programme est compos dinstructions Ces instructions peuvent tre de deux types les instructions simples les instructions composes Les instructions simples sont termines par un point virgule On peut les crire sur plusieurs lignes en inhibant la fin de ligne par un anti slash dconseill Elles correspondent des ordres donns au langage dclarations de variables utilisations de variables appels de fonctions Exemple int a5 Instruction simple pour dclarer quotaquot int b6 Instruction simple pour dclarer quotbquot int c Instruction simple pour dclarer quotcquot ca b Instruction simple pour utiliser quotaquot quotbquot et quotcquot printf Instruction simple pour appeler la fonction quotprintfquot Les instructions composes sont des squences dinstructions simples encadres par des accolades Il sagit en fait de la notion de bloc Exemple Dbut du bloc dinstructions int a5 Instruction simple du bloc int b6 Instruction simple du bloc int c Instruction simple du bloc ca b Instruction simple du bloc printf Instruction simple du bloc Fin du bloc dinstructions
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 17123 4 Les oprateurs Les oprateurs permettent de manipuler les variables et les constantes Ils sont de trois type oprateurs unaires ils prennent en compte un seul lment oprateurs binaires ils prennent en compte deux lments oprateurs ternaires ils prennent en compte trois lments a Oprateurs binaires Ce sont les plus simples apprhender Les premiers peuvent sappliquer tout type de variable ou constante entire ou virgule flottante Egal Affectation dune valeur une variable Ex a 5 Plus Addition de deux valeurs Ex 13 3 Moins - Soustraction de deux valeurs Ex 13 3 Multipli Multiplication de deux valeurs Ex 13 3 Divis Division de deux valeurs Ex 13 3 Test dgalit Permet de vrifier lgalit entre deux valeurs Ex a b si quotaquot est gal quotbquot alors lexpression vaudra une valeur quelconque diffrente de quot0quot symbolisant le boolen quotvraiquot sinon lexpression vaudra quot0quot Attention Ecrire quotquot en pensant quotquot peut produire des incohrences graves dans le programme qui se compilera cependant sans erreur Test de diffrence Permet de vrifier lingalit entre deux valeurs Ex a b si quotaquot est diffrent de quotbquot alors lexpression vaudra une valeur quelconque diffrente de quot0quot symbolisant le boolen quotvraiquot sinon lexpression vaudra quot0quot Cet oprateur est loppos du quotquot Tests dingalits diverses gt lt gt lt Permet de vrifier les grandeurs relatives entre deux valeurs Ex a gt b si quotaquot est suprieur ou gal quotbquot alors lexpression vaudra une valeur quelconque diffrente de quot0quot symbolisant le boolen quotvraiquot sinon lexpression vaudra quot0quot Les autres ne peuvent sappliquer quaux valeurs variables ou constantes de type entire char short long int Modulo Reste dune division entire entre deux valeurs Ex 13 3 quotETquot logique ampamp Opration boolenne quotETquot entre deux boolens Ex a ampamp b si quotaquot est quotvraiquot ET quotbquot est quotvraiquot alors lexpression vaudra une valeur quelconque diffrente de quot0quot symbolisant le boolen quotvraiquot sinon lexpression vaudra quot0quot quotOUquot logique Opration boolenne quotOUquot entre deux boolens Ex a b si quotaquot est quotvraiquot de quot0quot OU quotbquot est quotvraiquot alors lexpression vaudra une valeur quelconque diffrente de quot0quot symbolisant le boolen quotvraiquot sinon lexpression vaudra quot0quot Les suivants ne peuvent sappliquer quaux valeurs variables ou constantes de type entire char short long int et agiront individuellement sur chaque bit de la constante ou variable quotETquot bit bit amp Opration boolenne quotETquot applique pour chaque bit des deux valeurs le nime bit de la premire valeur tant compar au nime bit de la seconde valeur Ex a amp 5 Cette expression vaudra quot5quot si le premier et troisime bits de quotaquot sont quot1quot masque quotOUquot bit bit Opration boolenne quotOUquot applique pour chaque bit des deux valeurs le nime bit de la premire valeur tant compar au nime bit de la seconde valeur Ex a 5 Cette expression donnera une valeur o les premier et troisime bits seront toujours quot1quot quotOU EXCLUSIFquot bit bit Opration boolenne quotOU EXCLUSIFquot applique pour chaque bit des deux valeurs le nime bit de la premire valeur tant compar au nime bit de la seconde valeur Ex a 5 Cet expression donnera une valeur o les premier et troisime bits seront linverse de ceux de quotaquot bascule Dcalage droite gtgt Chaque bit de la valeur sera dcal vers la droite de quotxquot positions Ex 12 gtgt 3 Cela donne le mme rsultat que de diviser par 23 Dcalage gauche ltlt Chaque bit dune valeur sera dcal vers la gauche de quotxquot positions Ex 12 ltlt 4 Cela donne le mme rsultat que de multiplier par 24 b Oprateurs dopration avec affectation Chaque oprateur binaire prcdemment dcrit peut tre associ loprateur quotquot daffectation Cela permet de raccourcir une expression du style quota a xquot par lexpression quotaxquot sans espace entre le quotquot et le quotquot
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 18123 c Oprateurs unaires Une fois que lon a compris les oprateurs binaires les oprateurs unaires viennent plus facilement Les premiers peuvent sappliquer tout type de variable ou constante entire ou virgule flottante Moins unaire - Fait passer en ngatif un nombre positif et inversement Ex -5 Plus unaire Juste pour assurer la cohrence avec la vie relleEx 5 Ngation logique Inverse les boolens quotvraiquot et quotfauxquot Ex 5 Taille de sizeof Renvoie la taille en octet de la valeur ou du type demand Ex sizeofchar Le suivant ne peut sappliquer quaux valeurs variables ou constantes de type entire char short long int et agira individuellement sur chaque bit de la constante ou variable quotNOT bit bitquot Opration boolenne quotNOTquot applique chaque bit de la valeur Ex a Cet expression donnera une valeur o tous les bits seront linverse de ceux de quotaquot Les quatre derniers ne sappliquent quaux variables de type entire char short long int Pour chaque exemple nous prendrons une variable quotiquot initialement affecte avec quot5quot Pr-incrmentation plac avant la variable Ex i quotiquot commence par sincrmenter et passe quot6quot Ensuite lexpression renvoie la valeur finale de quotiquot soit quot6quot Post-incrmentation plac aprs la variable Ex i lexpression renvoie dabord la valeur initiale de quotiquot soit quot5quot Ensuite quotiquot sincrmente et passe quot6quot Pr-dcrmentation -- plac avant la variable Ex --i quotiquot se commence par se dcrmenter et passe quot4quot Ensuite lexpression renvoie la valeur finale de quotiquot soit quot4quot Post-dcrmentation -- plac aprs la variable Ex i-- lexpression renvoie dabord la valeur initiale de quotiquot soit quot5quot Ensuite quotiquot se dcrmente et passe quot4quot d Oprateurs ternaire Il ny en a quun seul qui peut sappliquer tout type de valeur vraialorssinon Ex x y z si quotxquot est diffrent de quot0quot donc quotvraiquot alors lexpression complte vaut quotyquot sinon elle vaut quotzquot e Valeur et renvoi dinstruction Toute instruction renvoie une valeur Exemple linstruction quot5quot renvoie une valeur qui est quot5quot Il est possible pour ne pas la perdre de rcuprer cette valeur par loprateur daffectation quotquot dans linstruction quota5quot Mais cette dernire instruction renvoie aussi une valeur qui est quot5quot Il est alors encore possible de la rcuprer par un nouvel oprateur daffectation quotquot dans linstruction quotba5quot etc Il est ainsi possible de rcuprer la valeur de chaque instruction crite Ex ab 2 rcupre dans quotaquot le boolen quotvraiquot ou quotfauxquot rsultant de la comparaison entre quotbquot et quot2quot f Oprateur de concatnation Celui-ci ne sapplique quaux instructions Concatnation dinstruction Permet de mettre plusieurs instructions suivre et de ne prendre que la valeur de la dernire Ex int abc5 dclare trois variables quotaquot quotbquot et quotcquot de type quotintquot et affecte quot5quot quotcquot g Exercices Calculez les rsultats des expressions suivantes 2 3 4 Rponse 20 2 ltlt 4 3 Rponse 35 1 3 Rponse 3 2 ltlt 1 gt 3 25 gtgt 2 25 gtgt 1 Rponse 6 4 gt 5 Rponse 0 quotfauxquot 2345 Rponse 9 2 et 3 ne sont pas traits Lensemble complet des oprateurs avec leurs priorits est mis en annexe
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 19123 5 Laffichage La saisie Laffichage dune valeur variable ou constante se fait en utilisant la fonction quotprintfquot qui signifie quotprint formatingquot Cette fonction sutilise de la manire suivante Premier argument et le plus complexe Message afficher Ce message encadr par des quot double guillemets constitue en fait tout le texte que le programmeur dsire afficher A chaque position du texte o il dsire que soit report une variable ou une valeur dexpression il doit lindiquer en positionnant un signe quotquot pour cent suivi dun caractre indiquant la manire dont il dsire afficher ladite valeur Autres arguments Expressions et variables dont on dsire afficher la valeur Exemple main int a5 int b6 printfquotLe rsultat de d ajout d plus 1 est dquot a b a b 1 La saisie dune variable se fait en utilisant la fonction quotscanfquot qui signifie quotscan formatingquot Cette fonction sutilise de la manire suivante Premier argument et le plus complexe Masque de saisie Ce masque encadr par des quot double guillemets constitue en fait tout ce que devra taper lutilisateur quand il saisira ses variables A chaque position du texte o le programmeur dsire que soit report une variable saisir il doit lindiquer en positionnant un caractre quotquot pour cent suivi dun caractre indiquant la manire dont il dsire que soit saisie ladite valeur Bien souvent il ny a aucun masque de saisie car cest trs contraignant Autres arguments Variables saisir chacune prcde du caractre quotampquot Exemple main int jj int mm int aa printfquotSaisissez une date sous la forme jjmmaa nquot scanfquotdddquot ampjj ampmm ampaa Erreur frquente main int i scanfquotSaisissez un nombre dquot ampi Erreur gt scanf naffiche rien Une invite saffiche avec quotprintfquot Il faut crire printfquot Saisissez un nombre nquot scanfquotdquot ampi Lensemble des options de saisie et daffichage sont mises en annexe
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 20123 6 La conversion de type casting a Gnralits Lorsque le langage doit faire un calcul avec des valeurs numriques ce calcul se fait dans la plus grande prcision des nombres intervenants et non dans la prcision du rsultat attendu Exemple float f20 7 Rsultat quotfquot vaut quot20000quot alors quil tait srement attendu quot28571quot Mais quot20quot et quot7quot tant une criture typique de nombres au format quotintquot le calcul a t entirement fait en codage quotintquot Pour obtenir le bon rsultat il aurait fallu crire au-moins une des deux constante dans une notation en virgule flottante en crivant par exemple quotfloat f 200 7quot ou bien quotfloat f 20 7e0quot b Conversions de type explicites Le problme prcdent reste le mme si on opre avec des variables de type quotintquot pour mettre le rsultat dans un quotfloatquot Le rsultat rcupr dans le quotfloatquot ne correspondra pas la valeur attendue Exemple int a20 b7 float fa b La seule faon davoir un rsultat dans quotfquot correct est de forcer au moins une des deux variables tre considre comme un quotfloatquot Cette opration se nomme quotcastingquot du verbe anglais quotto castquot qui signifie quotjouer un rlequot On cre un quotcastingquot sur une variable en indiquant avant la variable et entre parenthses dans quel type elle doit tre considre Exemple int a20 int b7 float f ffloata b Le calcul est effectu en considrant quotaquot comme un quotfloatquot fa floatb Le calcul est effectu en considrant quotbquot comme un quotfloatquot ffloata floatb Les deux variables quotaquot et quotbquot sont considres comme des quotfloatquot Dans ces trois critures on aura bien quotf28571quot c Conversions de type implicites Les conversions de type implicites se font de faon naturelle chaque fois que des variables de types diffrents sont utilises dans une opration A ce moment l la variable de type le plus quottroitquot est convertie dans la variable de type le plus quotlargequot et le quotcastquot nest pas ncessaire int a20 float b70 double fa b Conversion implicite de quotaquot en quotfloatquot On peut aussi copier une variables dun type dans une variable dun autre type Mais si la variable rceptrice est plus quottroitequot il y a perte de donnes Conversion automatique sans perte de prcision et sans perte de signe char int le caractre est plac dans loctet le moins significatif short long expansion du signe int float pas de problme float double pas de problme Conversions automatiques avec perte de prcision int char perte des octets les plus significatifs long short perte des octets les plus significatifs float int perte de la partie dcimale double float perte de prcision
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 21123 IV LES TYPES DERIVES 1 Les tableaux Chaque type vu prcdemment peut tre dclar sous forme de tableau en faisant suivre le nom de la variable de crochets quotquot et en indiquant entre les crochets le nombre dlments du tableau On aura alors en mmoire plusieurs zones contigus rserves pour le tableau et chaque zone aura la taille dun lment du tableau La contigut des zones sera importante lorsquon parlera des pointeurs Linitialisation peut se faire lors de la dclaration en indiquant les valeurs mises entre accolades quotquot et en sparant chaque valeur par le caractre quotquot virgule Les tableaux peuvent tre sur plusieurs dimensions en mettant plusieurs sries de crochets daffiles Si on initialise un tableau lors de sa dclaration on peut omettre la taille de sa premire dimension le compilateur remplira de lui-mme le vide en fonction des valeurs quil doit initialiser Exemple main int i10 Tableau de 10 entiers double d20 Tableau de 20 doubles char voyellea e i o u y Tableau de 6 caractres quot6quot implicite char semaine78 Tableau de 7 lignes sur 8 colonnes l u n d i La taille quot7quot de la premire dimension m a r d i est facultative On aurait pu mettre m e r c r e d i aussi quotchar semaine8quot j e u d i v e n d r e d i s a m e d i d i m a n c h e Fin du tableau plus lisible ainsi Laccs un lment du tableau se fait en donnant le nom du tableau suivi de lindice voulu entre crochets Cet indice peut lui-mme tre une variable ou une expression Attention en C un tableau commence lindice quot0quot De plus il nest fait aucun contrle sur la cohrence de lindice contrle de dpassement par exemple Cest au programmeur de vrifier la bonne validit de lindice par rapport la taille du tableau Exemple suite int j3 i-1i420 Autoris par le compilateur malgr lindice incohrent printfquotla premire voyelle est c la quatrime voyelle est cnquot voyelle0 voyellej printfquotla premire lettre du dernier jour de la semaine est cnquot semaine60 Un tableau ntant pas un type de base du langage il ne peut pas tre manipul copi ou compar comme une variable simple En particulier la syntaxe quottabquot nest autorise que lors de la dclaration du tableau Si on dsire le remplir en dehors de sa dclaration il faut alors travailler dans le tableau lment par lment avec une boucle
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 22123 2 Exercice Ecrire un programme qui fasse saisir un tableau de 5 nombres virgule flottante Ensuite il les affiche main Dclaration des variables float tab5 Tableau des nombres saisir Saisie printfquotSaisissez le premier nombre quot scanfquotfquot amptab0 printfquotSaisissez le second nombre quot scanfquotfquot amptab1 printfquotSaisissez le troisime nombre quot scanfquotfquot amptab2 printfquotSaisissez le quatrime nombre quot scanfquotfquot amptab3 printfquotSaisissez le cinquime nombre quot scanfquotfquot amptab4 Affichage printfquotle premier nombre saisi est f not aussi enquot tab0 tab0 printfquotle second nombre saisi est f not aussi enquot tab1 tab1 printfquotle troisime nombre saisi est f not aussi enquot tab2 tab2 printfquotle quatrime nombre saisi est f not aussi enquot tab3 tab3 printfquotle cinquime nombre saisi est f not aussi enquot tab4 tab4 Evidemment cela aurait t plus simple avec une boucle
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 23123 3 Les chanes de caractres Une chane de caractre nexiste pas en C Cest dire que le langage ne connat pas le type quotchanequot Les programmeurs ont alors adopt la convention suivante une chane de caractres sera reprsente par un tableau de caractres chaque lettre de la chane occupant un caractre du tableau termin par un caractre de valeur quot0quot rappelons quun caractre nest quun nombre entier cod sur 8 bits et donc pouvant prendre une valeur comprise entre 128 et 127 ou entre 0 et 255 Bien souvent cette valeur sentinelle terminant une chane est note dans le format quotconstante code ascii 0quot 0 Il en rsulte les corollaires suivants tout tableau de caractres contenant un caractre 0 pourra tre trait comme une chane de caractres par les fonctions de manipulation de chanes toute fonction de cration ou de remplissage de chanes rajoutera toujours un caractre 0 en fin de tableau Evidemment il appartient au programmeur qui va crer un tableau destin stocker une chane de prvoir un emplacement supplmentaire pour stocker la valeur quot0quot Exemple char jour6l u n d i 0 Cette notation tant lourde le compilateur autorise dcrire la chane dun seul bloc entre doubles quottes sans crire le quot0quot final Mais il ne faut pas oublier que ce nest quune autre faon dcrire et que mme si on ne lcrit plus le quot0quot final reste prsent donc on doit en tenir compte dans la place rserve au tableau Exemple char jour6quotlundiquot Ce tableau contient 5 lettres plus la valeur quot0quot Attention aux erreurs de programmation suivantes Si un caractre 0 vient se mettre au milieu dune chane de caractres cette dernire sera considre ensuite comme tronque car toutes les fonctions de manipulation de chanes sarrteront au premier 0 rencontr Si le caractre 0 disparat du tableau de caractres les fonctions de manipulation de chanes ne pourront plus reprer la fin de chane et risquent de boucler indfiniment dans leur traitement La fonction quotprintfquot offre au programmeur la possibilit dafficher une chane dun seul coup sans avoir programmer de boucle car celle-ci a t programme dans la fonction Il suffit de mettre loption quotsquot et de ne donner que le nom du tableau sans crochet La fonction quotscanfquot offre au programmeur la possibilit de saisir une chane dun seul coup sans avoir programmer de boucle car celle-ci a t programme dans la fonction Il suffit de mettre loption quotsquot et de ne donner que le nom du tableau sans crochet ni caractre quotampquot Exemple scanfquotsquot jour printfquotLe jour saisi est snquot jour Comparer deux tableaux ne peut se faire quen comparant chaque lment des deux tableaux avec une boucle Ncrivez donc pas if jour quotlundiquot car cette instruction est possible mais elle ne fait que comparer les adresses mmoires des deux tableaux cf chapitre sur les pointeurs
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 24123 4 La cration de nouveau type Il est possible en C de crer un nouveau type partir dun type existant en utilisant linstruction quottypedefquot typedef typeexistant nouveautype Ceci offre en fait une souplesse en ce qui concerne la maintenance Imaginons quun programme travaille sur un tableau de moins de 250 lments Tous les indices du tableau peuvent tre dfinis comme des quotunsigned charquot puisque ce format permet de coder les nombres entiers jusqu 255 Mais si le tableau change de taille et dpasse 256 lments il faudra reprendre tout le programme et modifier les types de tous les indices En utilisant linstruction quottypedefquot il est possible de crer un alias sur le type quotunsigned charquot et de dfinir tous les indices sur cet alias Si le tableau change de taille il suffit de changer lalias Exemple1 tableau lt 256 lments typedef unsigned char tindice main Dclaration des variables float tableau250 tindice i Balayage du tableau for i0 i lt 250 i tabi0 Exemple2 tableau gt 256 lments typedef unsigned short tindice main Dclaration des variables float tableau5000 tindice i Balayage du tableau for i0 i lt 5000 i tabi0
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 25123 V LES INSTRUCTIONS DE CONTROLES Une instruction de contrle est une instruction qui permet de rompre lexcution squentielle du programme en fonction de diffrents critres 1 Linstruction quotif elsequot Cette instruction permet une excution conditionnelle dune partie du code Syntaxe if X Attention pas de quotpoint-virgulequot Y else Facultatif Z T Si linstruction quotXquot est quotvraiquot cest dire si elle renvoie une valeur diffrente de quot0quot alors le langage ira excuter linstruction quotYquot Sinon et condition quil y ait une instruction quotelsequot le langage ira excuter linstruction quotZquot Dans tous les cas le langage ira excuter linstruction quotTquot La premire remarque que lon peut faire est quune structure quotifquot ne permet quune seule instruction pour chaque cas quotvraiquot ou quotfauxquot Mais rien nempche que cette instruction soit complexe donc un bloc if X Remarquez le dbut de bloc Y1 Y2 Y3 Ici on a la fin du bloc else Remarquez aussi le dbut de bloc Z1 Z2 Z3 Ici on a encore la fin du bloc T La seconde remarque est le contenu des parenthses Il faut que cette instruction renvoie une valeur Or toute instruction renvoie une valeur Par exemple linstruction quot5quot renvoie la valeur quot5quot qui peut tre rcupre dans une variable quotaquot dans la syntaxe quota5quot Ainsi toute instruction peut tre teste par un quotifquot if 5 Idiot car toujours vrai printf if 0 Idiot car toujours faux printf Jamais excut if var5 Affecte quot5quot quotvarquot et renvoie quot5quot donc quotvraiquot printf Peut-tre que le programmeur pensait quotsi var est gal 5quot Auquel cas il aurait fallu crire quotif var 5quot avec deux signes quotquot colls if var Si quotvarquot est quotvraiquot donc quotdiffrent de quot0quot printf
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 26123 2 Linstruction quotwhile quot Cette instruction permet une excution un certain nombre de fois boucle quottant quequot Syntaxe while X Attention pas de quotpoint-virgulequot Y Z Tant que linstruction quotXquot est quotvraiquot cest dire tant quelle renvoie une valeur diffrente de quot0quot alors le langage excutera linstruction quotYquot Ds que la linstruction quotXquot devient fausse le langage sort de la boucle et passe linstruction quotZquot Mme remarque pour le quotifquot la structure quotwhilequot ne permet de boucler que sur une seule instruction Mais ici aussi rien nempche que cette instruction soit un bloc entre accolades while X Remarquez le dbut de bloc Y1 Y2 etc Ici on a la fin du bloc Z Il en va de mme pour linstruction entre parenthses Cest la valeur rsiduelle de linstruction qui est value while 5 Toujours vrai donc boucle infinie printf while 0 Toujours faux donc pas de boucle utilit printf Jamais excute while var5 Affecte quot5quot quotvarquot et renvoie quot5quot donc quotvraiquot printf Probablement crit cela en pensant quottant que quotvarquot est gal quot5quot Alors il faut crire quotwhile var 5quot Cette erreur est trs frquente chez les dbutants while var Tant que quotvarquot est quotvraiquot donc quotdiffrent de quot0quot printf
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 27123 3 Linstruction quotdo while quot Cette instruction permet une excution un certain nombre de fois boucle quottant quequot mais lvaluation de la condition de boucle se faisant en fin de boucle celle-ci est au moins excute une fois Syntaxe do Attention pas de quotpoint-virgulequot X Excut au-moins une fois while Y Attention il faut un quotpoint-virgulequot Z Le langage excute linstruction quotXquot puisremonte en dbut de boucle tant que linstruction quotYquot est quotvraiquot Ds que la linstruction quotYquot devient fausse le langage sort de la boucle et passe linstruction quotZquot Mme remarque pour le quotifquot et le quotwhilequot prcdent la structure quotwhilequot ne permet de boucler que sur une seule instruction Mais ici aussi rien nempche que cette instruction soit un bloc entre accolades do Remarquez le dbut de bloc X1 X2 etc while Y Ici on a la fin du bloc Z Il en va de mme pour linstruction entre parenthses Cest la valeur rsiduelle de linstruction qui est value do printf while 5 Toujours vrai donc boucle infinie do printf Excut une fois while 0 Toujours faux donc pas de boucle utilit do printf while var5 Toujours la mme erreur Ecrire quotquot en pensant quotquot do printf while var Tant que quotvarquot est quotvraiquot donc quotdiffrent de quot0quot
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 28123 4 Linstruction quotfor quot Cette instruction permet de rassembler dans une seule ligne une initialisation une condition de continuation de boucle et un incrment Syntaxe for X Y Z Attention des quotpoints-virgulequot entre chaque instruction mais pas en fin de for T Q Le langage ira excuter linstruction quotXquot avant la boucle Celle-ci est souvent une initialisation de variable Ensuite tant que linstruction quotYquot est quotvraiquot cest dire tant quelle renvoie une valeur diffrente de quot0quot alors le langage excutera linstruction quotTquot En gnral linstruction quotYquot contrle la valeur de la variable Enfin il excute linstruction quotZquot qui est souvent un incrment de la variable Ds que la linstruction quotYquot devient fausse le langage sort de la boucle et saute linstruction quotZquot pour passer directement linstruction quotQquot Mme remarque pour les autres structures la structure quotforquot ne permet de boucler que sur une seule instruction qui peut tre un bloc entre accolades Par ailleurs on peut toujours remplacer un quotforquot par un quotwhilequot Exemple avec quotforquot for X Y Z Remarquez le dbut de bloc T1 T2 etc Ici on a la fin du bloc Q Remplacement par un quotwhilequot X while Y Remarquez quand-mme le dbut de bloc T1 T2 etc Z Ici on a la fin du bloc Q Exemples Incrment simple for i0 i lt 10 i printfquotdnquot i Incrment double remarquez lutilisation judicieuse de la virgule dans le quotforquot for i0 j10 i lt 10 i j printfquotd dnquot i j Erreur frquente dans la programmation dune boucle quotforquot for i0 i 10 i Lerreur est de penser jusqu i gal 10 alors que le langage lit tant que i gal 10 printfquotdnquot i La syntaxe quotfor i0 i 10 iquot nest pas non plus correcte
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 29123 5 Les instructions quotbreakquot et quotcontinuequot Linstruction quotbreakquot permet au langage dinterrompre une boucle sans retourner valuer sa condition Dans le cas dune boucle quotforquot linstruction quotbreakquot fait aussi viter la troisime instruction de la parenthse instruction quotZquot Linstruction quotcontinuequot permet au langage de remonter lvaluation de la condition de boucle Bien entendu si cette condition nest plus remplie le langage sort de la boucle Ces deux instructions sont contraires la philosophie de quotprogrammation structurequot mais elles vitent beaucoup de lourdeurs dcritures Exemple sans quotbreakquot Boucle de 0 9 i0 while i lt 10 if problme quelconque printfquotProblmenquot i12 else printfquotdnquot i i Exemple avec quotbreakquot Boucle de 0 9 i0 while i lt 10 if problme quelconque printfquotProblmenquot break printfquotdnquot i i Exemple sans quotcontinuequot Boucle de 0 9 i0 while i lt 10 if problme quelconque printfquotProblmenquot else printfquotdnquot i i Exemple avec quotcontinuequot Boucle de 0 9 i0 while i lt 10 if problme quelconque printfquotProblmenquot continue printfquotdnquot i i
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 30123 6 Linstruction quotgotoquot Cette instruction permet de se positionner nimporte o dans le source et de continuer lexcution partir du nouveau positionnement Elle est totalement abhorre de tous les programmeurs qui respectent le langage et sa philosophie Syntaxe etiquette Remarquez le caractre quotdouble-pointquot for X if Y etc goto etiquette Pour se placer sur ltiquette
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 31123 7 Linstruction quotswitch casequot Cette instruction permet un branchement sur cas multiples Syntaxe switch X Attention pas de quotpoint-virgulequot Attention une quotaccoladequot dbut de bloc obligatoire case ltconstante 1gt Y Z break case ltconstante 2gt P Q break etc default R S Fin du bloc Le langage value linstruction quotXquot Selon sa valeur il se positionne sur la constante qui lui correspond et excute les instructions qui sy trouvent Sinon il se positionne dans le cas quotdefaultquot qui est facultatif et qui correspond aux cas non prvus Le terme quotltconstantegtquot signifie quil est impossible dy mettre une variable Le programmeur dsirant utiliser un algorithme de ce type devra alors passer par des instructions quotif elsequot Remarque Le compilateur transforme littralement une instruction quotswitchquot en suite dinstructions quotgotoquot remarquez le caractre quotdouble pointquot terminant chaque constante lui donnant ainsi le rle dune tiquette Cela implique quune fois positionn sur ltiquette correspondante le programme droule et excute ensuite linairement toutes les instructions suivantes y compris les instructions correspondantes dautres cas Cette attitude peut tre heureusement inhibe par lemploi judicieux de linstruction quotbreakquot la fin de chaque cas inutile malgr tout pour le cas quotdefaultquot Exemple main int nb printfquotSaisissez un nombre quot scanfquotdquot ampnb switch nb case 0 Sera excut si quotnbquot vaut 0 printfquotValeur zronquot case 2 case 4 case 6 case 8 Sera excut si quotnbquot vaut 2 4 6 8 mais aussi 0 printfquotNombre d pair infrieur 10nquot nb break case 1 case 3 case 5 case 7 case 9 Sera excut si quotnbquot vaut 1 3 5 7 9 printfquotNombre d impair infrieur 10nquot nb break default printfquotNombre d trop grand pour tre valunquot nb
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 32123 8 Linstruction quotexit quot Cette instruction permet darrter et quitter volontairement le programme en dehors de sa fin naturelle fin de la fonction quotmainquot Syntaxe exitn La valeur quotnquot correspond une valeur numrique qui sera rcupre par le processus ayant lan le programme Si ce programme a t lanc depuis un quotshellquot dUnix cette valeur est renvoye dans la variable shell quotquot Par convention une valeur quot0quot indique que le programme sest droul normalement et une valeur diffrente de quot0quot indique que la sortie est due une exception erreur Bien que cette instruction puisse tre appele de nimporte quelle fonction la philosophie du langage veut que seule la fonction quotmainquot utilise linstruction quotexitquot
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 33123 9 Exercices Ecrire un programme qui fasse saisir un tableau de 10 nombres virgule flottante Ensuite il les affiche Enfin il recherche et affiche les lments du tableau de valeur comprise entre quot-1quot et quot1quot main Dclaration des variables unsigned short i Indice de boucle dans le tableau float tab10 Tableau des nombres saisir Saisie for i0 i lt 10 i Le premier indice est quot0quot printfquotSaisissez le nombre hu quot i 1 quoti 1quot pour faire correspondre lindice affich avec la quotvision humainequot scanfquotfquot amptabi Affichage des valeurs du tableau for i0 i lt 10 i printfquotLlment hu est fnquot i 1 tabi Recherche et affichage des valeurs correspondantes aux critres for i0 i lt 10 i if tabi gt -10 ampamp tabi lt 10 printfquotLlment hu de valeur f correspond aux critresnquot i 1 tabi Mme recherche mais en utilisant la condition inverse juste pour le quotfunquot for i0 i lt 10 i if tabi lt -10 tabi gt 10 Remarquez que le quotETquot est devenu un quotOUquot loi de quotDe Morganquot continue On va directement sur quotiquot Ici on est certain que llment du tableau correspond aux critres printfquotLlment hu de valeur f correspond aux critresnquot i 1 tabi
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 34123 Ecrire un programme qui affiche XXXXXXXXXX YXXXXXXXXX YYXXXXXXXX YYYXXXXXXX YYYYXXXXXX YYYYYXXXXX YYYYYYXXXX YYYYYYYXXX YYYYYYYYXX YYYYYYYYYX YYYYYYYYYY Remarque Si on numrote chaque ligne en commenant par quot0quot alors la ligne quotnquot il y a quotnquot Y et quot10 nquot X main Dclaration des variables unsigned short lig Indice de ligne unsigned short i Indice de boucle Boucle sur 11 lignes for lig0 lig lt 11 lig La premire ligne est quot0quot Boucle sur le nombre de quotYquot for i0 i lt lig i Affichage des quotYquot printfquotYquot Boucle sur le nombre de quotXquot for i10 - lig i gt 0 i-- Affichage des quotXquot printfquotXquot On peut mettre plus simplement quotfor i0 i lt 10 lig iquot mais lopration 10 lig est alors excute chaque boucle ce qui les ralentit Fin de ligne printfquotnquot
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 35123 Ecrire un programme qui affiche 1 12 123 1231 12312 123123 1231231 etc Remarque Si on numrote chaque ligne en commenant par quot0quot alors la ligne quotnquot contient quotn 1quot valeurs et sarrte quotn 3 1quot main Dclaration des variables unsigned short lig Indice de ligne unsigned short i Indice de boucle Initialisation de la ligne lig0 Boucle infinie while 1 Boucle sur le nombre de valeurs afficher for i0 i lt lig i Affichage des valeurs printfquotdquot i 3 1 Fin de ligne Incrment numro de ligne printfquotnquot lig
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 36123 VI LES FONCTIONS Une fonction est un sous-programme qui reoit ventuellement des arguments en entre ces arguments sont toujours des valeurs numriques et qui retourne ventuellement une valeur dun certain type vers la fonction appelante Lcriture dune fonction se fait en plusieurs tapes On dfinit ce dont elle a besoin en entre et ce quelle retourne en sortie On crit le prototype Le prototype indique notamment le nombre et les types des arguments ncessaires ainsi que le type du rsultat renvoy Le prototype est dclar avant la dfinition de la fonction Il permet au compilateur de contrler la cohrence des appels Cette tape nest pas obligatoire mais le compilateur doit connatre la fonction avant quelle ne soit appele Si le programmeur ne dsire pas tablir de prototype il doit coder le corps de la fonction appele avant de coder le corps de la fonction appelante On crit enfin le corps de la fonction on code le traitement attendu Cette dfinition peut tre place dans le mme fichier source que la fonction appelante ou dans un autre fichier mais il faudra indiquer au compilateur quels fichiers utiliser Il ny a pas de possibilit dimbrication des fonctions comme en Pascal 1 Dfinition de fonction Syntaxe dune fonction visibilitclasse typederetour nom-de-fonctiondclarations de paramtres Instructions VisibilitClasse Cet lment sera vu dans le chapitre traitant de la visibilit et des classes dallocation des variables Type de retour Cet lment indique le type du rsultat renvoy par la fonction Ce type peut tre simple int char etc ou plus complexe Si la fonction ne renvoie aucun rsultat un type spcial quotvoidquot permet dindiquer ce fait Sil nest pas prcis le type dune fonction est int par dfaut Nom-de-Fonction Le nom dune fonction peut tre nimporte quel identificateur valide Dclarations darguments Ce sont les donnes venant de lextrieur qui sont ncessaires lexcution de la fonction Ils sont placs entre parenthses Avec ou sans argument les parenthses sont obligatoires La position des paramtres est primordiale Si la fonction reoit des paramtres ils seront dclars sous la forme type ltidentificateurgt type ltidentificateurgt Il est bien vident que le type de lidentificateur qui stockera la valeur du paramtre reu par la fonction doit tre le mme que le type de la valeur envoye par la fonction appelante Si tel nest pas le cas il y aura conversion implicite si cest possible avec perte si le type du paramtre reu nest pas suffisanmment grand pour stocker le paramtre envoy Chaque paramtre est spar dun autre par une virgule Ces paramtres sont locaux la fonction o ils sont dclars Deux fonctions distinctes peuvent donc utiliser chacune des mme noms de variables pour leurs paramtres Bloc de la fonction Celui ci commence par une accolade ouvrante et se termine par une accolade fermante comme pour le quotmainquot A lintrieur on trouve dans lordre La dclaration des variables locales Les instructions ou blocs dinstructions de la fonction
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 37123 2 Prototype des fonctions Placs en tte du programme au maximum avant le codage de la premire fonction les prototypes de fonctions sont facultatifs mais ont pour intrt de vrifier la validit en quantit et qualit des paramtres transmis aux fonctions de ne pas tre oblig de coder la fonction appele avant la fonction appelante appelante ce qui est impossible si deux fonctions sappellent lune lautre On crit un prototype de fonction en crivant le type de la fonction le nom de la fonction le type des paramtres entre parenthses spars par une virgule le nom des paramtres nest pas obligatoire Si la fonction na pas recevoir de paramtre on peut mettre le mot clef quotvoidquot dans les parenthses ou ne rien mettre un point-virgule final obligatoire Il ny a lexcution aucun contrle ni sur le nombre ni sur le type des paramtres Do lintrt dutiliser un prototype systmatique afin de dtecter la compilation les erreurs non dceles lexcution Exemple void fonc1 fonc1 ne reoit rien et ne renvoie rien void fonc2void fonc2 ne reoit rien et ne renvoie rien comme quotfonc1quot void fonc3int fonc3 reoit un quotintquot et ne renvoie rien float fonc4int char fonc4 reoit un quotintquot et un quotcharquot et renvoie un quotfloatquot double fonc5void fonc5 ne reoit rien et renvoie un quotdoublequot double fonc6double fonc6 reoit un double et renvoie un quotdoublequot 3 Appel dune fonction Une fonction est appele par lutilisation de son nom suivi de deux parenthses obligatoires contenant ventuellement des paramtres effectifs Ces derniers peuvent tre soit des variables soit des constantes soit des expressions Un appel de fonction tant une instruction celle-ci a pour valeur rsiduelle la valeur renvoye par la fonction et cette valeur peut tre utilise comme nimporte quelle autre valeur Exemple fonc1 Appel de quotfonc1quot sans paramtre ni utiliser ce quelle renvoie fonc2 Appel de quotfonc2quot sans paramtre ni utiliser ce quelle renvoie fonc31 Appel de quotfonc3quot en lui passant une valeur numrique fonc41 3 a Appel de quotfonc4quot avec deux paramtres un calcul valant quot4quot et quotaquot resultatfonc4i j Appel de quotfonc4quot en rcuprant son rsultat dans une variable resultat2 fonc5 Utilisation du rsultat de quotfonc5quot dans une expression fonc62 fonc5 Appel de quotfonc6quot en lui passant un calcul utilisant quotfonc5quot fonc6fonc600 Appel de quotfonc6quot en lui passant un calcul utilisant quotfonc6quot
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 38123 4 Passage de paramtres Chaque paramtre est initialis automatiquement avec la valeur passe par lappelant A lappel de la fonction les valeurs passes par lappelant paramtres quotrelsquot ou quoteffectifsquot sont recopis dans les identifiants de la fonction paramtres quotformelsquot et cette dernire travaille sur ces copies stockes dans la pile cf cours sur les processus Unix Le nom donn ces variables de copie importe peu A la sortie de la fonction la zone de la pile occupe par les paramtres est libre Les valeurs de lappelant nayant pas t touches celles-ci ne sont jamais modifies par la fonction sauf si un des paramtres passs est un quottableauquot cf paragraphe sur les cas particuliers Dans ce cas la fonction recevant un tableau reoit loriginal et non une copie et peut modifier le contenu du tableau cf chapitre sur les pointeurs Exemple Prototype dune fonction quotaffichequot recevant un nombre entier et ne renvoyant rien void void afficheint Fonction principale du programme main int nb5 Nombre afficher affichenb Appel de la fonction quotaffichequot printfquotnbdnquot nb Affichage de quotnbquot pour voir sil a chang Codage de la fonction quotaffichequot void affiche int x Variable o stocker le paramtre reu Affichage du nombre reu but de la fonction quotaffichequot printfquotNombre reu dnquot x Modification du paramtre reu juste pour voir xx 1 5 Retour du rsultat Une fonction peut renvoyer le rsultat de son travail Ceci sera fait grce linstruction quotreturn expressionquot les parenthses ne sont pas obligatoires Cette instruction interrompt le droulement de la fonction et excute le retour la fonction appelante qui peut rcuprer ou simplement utiliser le rsultat renvoy On peut trouver plusieurs quotreturnquot dans une fonction bien que ce soit contraire la notion de programmation structure chaque quotreturnquot ntant trait que si certaines conditions se prsentent En ce cas lors de lappel et selon les conditions values la fonction sortira lun ou lautre des quotreturnquot Une fonction ne renvoyant rien void na pas lutilit du quotreturnquot Cependant celui-ci peut tre utilis dans la mesure o il ne sert qu interrompre lexcution de la fonction sans vouloir renvoyer de rsultat On emploie alors linstruction quotreturnquot unique sans parenthse ni expression 6 La fonction quotmainquot La fonction quotmainquot est une fonction au mme titre que les autres De plus elle renvoie elle-aussi une valeur de type quotintquot par dfaut quot0quot au processus qui invoque le programme Enfin elle peut dclarer recevoir des paramtres sera vu ultrieurement ou pas void
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 39123 7 Exercice Ecrire une fonction permettant de calculer la racine carre dun nombre La racine carre dun nombre quotNquot et note quotNquot correspond un nombre quotPquot tel que quotP x P Nquot Elle est donne par la limite de la suite U0 X X nombre quelconque diffrent de 0 Un1 12 Un NUn Fonction quotracinequot double racine float nb Paramtre recevant le nombre dont on veut la racine Dclaration des variables double calc Calcul de la racine dans la boucle double diff Pour tester la diffrence avec la valeur prcdente Si la racine na pas besoin dtre calcule pour quot0quot ou quot1quot if nb 00 nb 10 return nb Ici racine de quotnbquot vaut quotnbquot Initialisation dbut de boucle calcnb Ou nimporte quel nombre diffrent de quot0quot do Rcupration de quotcalcquot pour comparer avec le calcul suivant diffcalc Approximation de la racine le calcul se fera en prcision quotdoublequot calc05 calc nb calc Tant que le processeur peut faire la diffrence entre ce calcul et le prcdent limite while calc diff Renvoi du rsultat calcul return calc Ou bien quotreturn diffquot puisque ici quotdiffquot quotcalcquot Fonction principale du programme juste pour lexemple int mainvoid Dclaration des variables float nb Nombre dont on veut la racine Saisie et affichage de la racine printfquotEntrez votre nombre quot scanfquotfquot ampnb printfquotLa racine de f est lfnquot nb racinenb return 0 Remarque La racine carre dun nombre quotNquot peut aussi tre donne par lalgorithme suivant choisir 2 variables quotXquot et quotYquot avec quotXquot diffrent de quot0quot et boucler sur les oprations suivantes Y N X X X Y 2 A chaque boucle les variables quotXquot et quotYquot vont se rapprocher de la racine de quotNquot par encadrement
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 40123 8 Cas particulier fonction recevant un tableau en paramtre Un programmeur dsirant appeler une fonction en lui passant un tableau dans lun des paramtres appelle la fonction en mettant entre les parenthses juste le nom du tableau sans crochet ni indice comme pour quotprintfquot ou quotscanfquot qui sont des fonctions pouvant traiter des chanes de caractres Du cot de codage de la fonction il faut dclarer une variable de mme type que la variable reue cest dire un tableau Quelle que soit sa dimension on peut omettre dans la dclaration du tableau la longueur de la premire dimension nombre entre les premiers crochets Attention une fonction recevant un tableau en paramtre a possibilit de modifier le contenu du tableau chose impossible quand le paramtre est une variable simple cf chapitre sur les pointeurs Exemple Ecrire une fonction permettant dafficher une chane de caractres lcran comme le fait quotprintfquot Rappel Une chane de caractres est un tableau de caractres dont le dernier vaut quot0quot Prototype fonction quotaffichequot recevant un tableau de caractres et renvoyant un entier long unsigned long affichechar Remarquez ici les crochets vides Fonction principale du programme int mainvoid Dclaration des variables char chaine100 Chane afficher 100 est choisi arbitrairement Saisie de la chaine printfquotEntrez votre chane quot scanfquotsquot chaine Attention pas de quotampquot pour un tableau Affichage de la chaine printfquotVotre chane saisie est quot affichechaine Passage du tableau la fonction sans mettre de crochet Fin du programme return 0 Fonction quotaffichequot Elle reoit un tableau de caractres et renvoie un entier long non-sign unsigned long affiche char chaine Chane afficher - Longueur quot100quot pas obligatoire Dclaration des variables unsigned long ind Indice de boucle sur le tableau Boucle sur la chane jusqu la valeur quot0quot conventionnelle for ind0 chaineind 0 ind Affichage de chaque lettre de la chane printfquotcquot chaineind Il se trouve que ici quotindquot contient la longueur relle de la chane return ind Renvoi de la longueur tant qu faire 9 Cas particulier fonction devant renvoyer un tableau Il nest pas possible dans ltat actuel de faire renvoyer un tableau par une fonction rappelons-le un tableau nest pas une entit manipulable par le langage Il faut pour rgler le problme utiliser les pointeurs cf chapitre sur les pointeurs
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 41123 VII LA RECURSIVITE Il a t vu au chapitre sur les fonctions que celles-ci conservent leur environnement de travail pendant quune sous-fonction est excute et quil ny a pas mlange des variables puisque chaque fonction possde fonction appele qui peut elle-aussi tre mise en attente par le rsultat Il est vident quune fonction rcursive doit possder une condition darrt de rcursivit car sinon la fonction sappellerait elle-mme linfini La condition darrt se place en gnral par facilit de programmation au dbut du code de la fonction mais ce nest nullement une obligation 1 Rcursivit simple La rcursivit simple est le cas le plus courant La fonction sappelle elle-mme une fois jusqu arriver au bout de sa rcursivit Exemple La factorielle de quotnquot notquot quotn quot si n 0 alors factoriellen 1 sinon factoriellen n x factoriellen 1 Fonction rcursive quotfactoriellequot unsigned long fact unsigned short n Nombre dont on veut la factorielle Vrification fin de rcursivit if n 0 On peut aussi mettre quotif n lt 1quot return 1 Factorielle de quot0quot ou quot1quot vaut quot1quot Renvoi du rsultat de quotnquot multipli par ce que vaut la fonction pour quotn 1quot return n factn 1 Ce que vaut quotfactn 1quot sera dabord calcul dans une sous-fonction etc 2 Rcursivit double La rcursivit double est le cas o la fonction sappelle elle-mme deux ou plusieurs fois Le nombre dempilements mmoire est alors phnomnal Exemple La suite de Fibonacci est une suite numrique o les deux valeurs quotU0quot et quotU1quot sont dj tablies et la valeur quotUnquot pour n gt 2 est donn par laddition des deux termes prcdents Un Un-2 Un-1 Fonction rcursive quotFibonacciquot On considre que U0 vaut quot1quot et U1 vaut quot2quot unsigned long fib unsigned short n Nombre dont on veut la valeur de Fibonacci Vrification fin de rcursivit if n 0 return 1 On renvoie la valeur correspondante U0 if n 1 return 2 On renvoie la valeur correspondante U1 Renvoi du rsultat de laddition des deux appels infrieurs return fibn 2 fibn 1
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 42123 3 Rcursivit croise La rcursivit croise est le rare cas o une fonction quotAquot appelle une fonction quotBquot qui elle-mme appelle la fonction quotAquot Si un programmeur reprend le travail dun autre il peut avoir du mal dceler quil y a rcursivit do limportance des commentaires 4 Conclusion La rcursivit est un mcanisme offrant une trs grande souplesse de codage au programmeur mais se payant par une consommation trs importantes des ressources du systme En effet chaque appel rcursif ce dernier doit sauvegarder tout le contexte de la fonction afin de pouvoir offrir la sous-fonction une zone de travail vierge Par exemple pour la valeur quot6quot la fonction quotfactoriellequot sempilera 7 fois en mmoire tandis que la fonction quotFibonacciquot sempilera 24 fois Tous ces empilements seront autant de contextes de travail diffrents et individuels mais gros consommateurs de ressources systme lors du droulement du programme Avant demployer la rcursivit il faut donc se demander si elle ne peut pas tre vite par lemploi de boucles appropries Exemple La factorielle de quotnquot sans rcursivit unsigned long fact unsigned short n Nombre dont on veut la factorielle Dclaration des variables unsigned short i Indice de boucle unsigned long resultat1 Rsultat de la factorielle Boucle de factorielle for i2 i lt n i Si quotnquot vaut 0 ou 1 boucle non excute resultatresultat i Calcul de la factorielle intermdiaire Renvoi du rsultat toujours au moins gal 1 return resultat Exemple La suite de Fibonacci sans rcursivit unsigned long fib unsigned short n Nombre dont on veut la valeur de Fibonacci Dclaration des variables unsigned long U31 2 Tableau de 3 quotUnquot on ninitialise que U0 et U1 Test des valeurs particulires if n 0 n 1 return Un Renvoi U0 ou U1 si quotnquot vaut quot0quot ou quot1quot Boucle de Fibonacci for i2 i lt n i U2U0 U1 Calcul de llment en cours U0U1 Dcalage de U1 vers U0 U1U2 Dcalage de U2 vers U1 Renvoi du rsultat dernier U2 return U2
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 43123 5 Exercice Changement de base Ecrire une fonction rcursive affichant nimporte quel nombre dans une base infrieure 10 Rappel Pour afficher un nombre quotnquot dans une base quotbquot on divise euclidiennement quotnquot par quotbquot tant quon peut diviser Ds que le rsultat de la division atteint quot0quot on affiche dans lordre inverse tous les restes des divisions prcdentes Prototype fonction quotaffichequot recevant un nombre long afficher et un nombre court la base void afficheunsigned long unsigned short Fonction principale du programme int mainvoid Dclaration des variables unsigned long nb Nombre afficher unsigned short base Base daffichage Saisie du nombre afficher printfquotEntrez le nombre afficher quot scanfquotluquot ampnb Saisie de la base daffichage contrle de la saisie base0 Pour tre certain que le quotwhilequot sera vrai while base lt 2 base gt 9 Tant que base lt 2 ou base gt 9 printfquotEntrez la base daffichage entre 2 et 9 quot scanfquothuquot ampbase Affichage printfquotLe nombre lu en base huquot nb base affichenb base printfquotnquot Fin du programme return 0 Fonction quotaffichequot void affiche unsigned long nb Nombre afficher unsigned short base Base daffichage Dclaration des variables Aucune variable Vrification fin rcursivit if nb 0 return Fin rcursivit Appel rcursif affichenb base base Affichage du reste plac aprs lappel rcursif pour tre affich lors de la remonte printfquothuquot nb base Le modulo quotquot donne le reste dune division
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 44123 VIII ETUDE DE CAS LE TRIANGLE DE PASCAL ETUDE DES DIFFERENTS SOLUTIONS Ecrire un programme affichant le triangle de Pascal sur quotnquot lignes Rappel Le triangle de Pascal permet de donner les coefficients de multiplication pour dvelopper lexpression a bn Les coefficients de cette expression sont ceux de la ligne quotnquot Chaque ligne quotnquot est construite de la faon suivante - elle contient quotn 1quot chiffres - le premier et le dernier sont quot1quot sauf pour la ligne quot0quot o il ny a quune fois le chiffre quot1quot - chaque chiffre intermdiaire est laddition du chiffre plac au dessus et du chiffre plac avant ce dernier Exemple - ligne 0 1 - ligne 1 1 1 - ligne 2 1 2 1 - ligne 3 1 3 3 1 - ligne 4 1 4 6 4 1 - ligne 5 1 5 10 10 5 1 - ligne 6 1 6 15 20 15 6 1 etc Ce triangle peut aussi tre calcul en utilisant les combinaisons C des probabilits La ligne quotnquot est donn par la suite des chiffres C0 n C1 n Cn n La combinaison Cx y est donn par la formule y x y - x Le triangle de pascal a pour but de montrer le dveloppement de a bn Par exemple la ligne quot5quot du triangle permet de dvelopper a b5 a b5 1a 5 5a 4 b 1 10a 3 b 2 10a 2 b 3 5a 1 b 4 1b 5 1 Principe des diffrentes solutions Toutes les solutions dveloppes dans cette tude de cas auront sensiblement le mme squelette de programme Fonction principale du programme cette fonction aura pour but de faire saisir le nombre de lignes voulu pour le triangle et de lafficher Fonction quotlignequot cette fonction aura pour but dafficher une ligne du triangle et sera appele autant de fois quil le faut par la fonction principale Fonction quotcombquot cette fonction calculera la combinaison voulue Elle sera appele autant de fois quil le faut par la fonction quotlignequot puisquune ligne du triangle de Pascal est une liste de combinaisons Fonctions diverses relatives aux diffrentes solutions permettant daider au calcul de la combinaison
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 45123 2 Solution Utilisation de la factorielle pour calculer les combinaisons Dfinitions des alias sur des types existants plus pratique pour programmer typedef unsigned short ushort Entier court non sign typedef unsigned long ulong Entier long non sign Prototypes des fonctions utilises double factushort Factorielle ulong combushort ushort Combinaison void ligneushort Ligne du triangle Fonction principale int mainvoid Dclaration des variables ushort i Indice de boucle ushort limite Limite du triangle demande Saisie de la limite du triangle printfquotEntrez la limite du triangle voulue quot scanfquothuquot amplimite Boucle jusquau niveau demand for i0 i lt limite i Affichage de la ligne quotiquot lignei Fin du programme return 0 Affichage dune ligne quotligquot void ligne ushort lig N de ligne afficher Dclaration des variables ushort col Indice de colonne Boucle jusquau niveau demand for col0 col lt lig col Affichage de la combinaison Ccol lig printfquotlu quot combcol lig Fin de ligne printfquotnquot
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 46123 Calcul de la combinaison Cx y ulong comb ushort col Colonne ushort lig Ligne Dclaration des variables Pas de variable Si on est en premire ou dernire colonne facultatif mais optimise la fonction if col 0 col lig return 1 Valeur du triangle connue Si on est en seconde ou avant-dernire colonne facultatif mais optimise la fonction if col 1 col lig - 1 return lig Valeur du triangle connue Renvoi du calcul return factlig factcol factlig - col Calcul de la factorielle double fact ushort nb Nombre lever en factorielle Dclaration des variables Pas de variable Si quotnbquot vaut quot0quot ou quot1quot la factorielle vaut quot1quot si quotnbquot vaut quot2quot la factorielle vaut quot2quot if nb lt 2 Renvoi de la factorielle directe return nb 0 nb 1 Renvoi de quotnbquot multipli par la valeur de la factorielle pour quotnb - 1quot return nb factnb - 1 Cette solution a linconvnient dappeler 3 fois la fonction quotfactquot pour chaque combinaison et cette dernire va gnrer de trs grands nombres quil faudra stocker do la raison du type quotdoublequot de cette fonction avant que ceux-ci ne se divisent mutuellements dans la combinatoire Ce programme est donc limit par la valeur maximale que peut donner un nombre au format quotdoublequot Le triangle devient dailleurs faux partir de la 24 ligne
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 47123 3 Solution Mthode par addition des valeurs de la ligne prcdente Dfinitions des alias sur des types existants plus pratique pour programmer typedef unsigned short ushort Entier court non sign typedef unsigned long ulong Entier long non sign Prototypes des fonctions utilises ulong combushort ushort Combinaison void ligneushort Ligne du triangle Fonction principale int mainvoid Dclaration des variables ushort i Indice de boucle ushort limite Limite du triangle demande Saisie de la limite du triangle printfquotEntrez la limite du triangle voulue quot scanfquothuquot amplimite Boucle jusquau niveau demand for i0 i lt limite i Affichage de la ligne quotiquot lignei Fin du programme return 0 Affichage dune ligne quotligquot void ligne ushort lig N de ligne afficher Dclaration des variables ushort col Indice de colonne Boucle jusquau niveau demand for col0 col lt lig col Affichage de la combinaison Clig col printfquotlu quot combcol lig Fin de ligne printfquotnquot
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 48123 Calcul de la combinaison Cx y par addition ulong comb ushort col Colonne ushort lig Ligne Dclaration des variables Pas de variable Si on est en premire ou dernire colonne fin de rcursivit if col 0 col lig return 1 Valeur du triangle connue Si on est en seconde ou avant-dernire colonne facultatif mais optimise la fonction if col 1 col lig - 1 return lig Valeur du triangle connue Renvoi de laddition des deux nombres du dessus return combcol - 1 lig - 1 combcol lig - 1 Cette solution semble plus intressante car on limine dabord la factorielle gnratrice de grands nombres De plus en premire lecture on voit quil ny a plus que 2 appels rcursifs au lieu des 3 de la solution prcdente Cependant si on regarde mieux on saperoit quon est dans un cas de double rcursivit o chaque appel rcursif en enchane 2 autres ce qui amne rapidement saturation du systme Effectivement cette solution convient un peu mieux que la prcdente car elle ne gnre pas de grands nombres et elle fonctionne pour un triangle de plus de 25 lignes mais le temps de traitement saccrot exponentiellement en fonction de la ligne affiche
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 49123 4 Solution Conservation des combinaisons dj calcules Dfinitions des alias sur des types existants plus pratique pour programmer typedef unsigned short ushort Entier court non sign typedef unsigned long ulong Entier long non sign Prototypes des fonctions utilises void combushort ushort ulong501501 Combinaison void ligneushort ulong501501 Ligne du triangle Fonction principale int mainvoid Dclaration des variables ushort i Indice de boucle ushort limite Limite du triangle demande ulong tabcomb501501 Tableau des combinaisons calcules Saisie et contrle de la limite du triangle while 1 printfquotEntrez la limite du triangle voulue max 500 quot scanfquothuquot amplimite if limite lt 500 break printfquothu trop grand Recommenceznquot limite Boucle jusquau niveau demand for i0 i lt limite i Affichage de la ligne quotiquot et mmorisation dans le tableau des combinaisons lignei tabcomb Fin du programme return 0 Affichage dune ligne quotligquot et mmorisation de cette ligne dans le tableau des combinaisons void ligne ushort lig N de ligne afficher ulong tabcomb501501 Tableau des combinaisons Dclaration des variables ushort col Indice de colonne Boucle jusquau niveau demand for col0 col lt lig col Mmorisation de la combinaison dans le tableau combcol lig tabcomb Affichage de la combinaison Ccol lig printfquotlu quot tabcombligcol Fin de ligne printfquotnquot
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 50123 Mmorisation de la combinaison Cx y dans le tableau void comb ushort col Colonne ushort lig Ligne ulong tabcomb501501 Tableau des combinaisons Dclaration des variables Pas de variable Si on est en premire ou dernire colonne pas assez dantcdents if col 0 col lig tabcombligcol1 Valeur du triangle connue return Plus la peine de continuer Si on est en seconde ou avant-dernire colonne facultatif mais optimise la fonction tabcombligcollig Valeur du triangle connue return Plus la peine de continuer Ici on est certain de ne pas tre dans les valeurs extrmes du triangle Mmorisation de laddition des deux nombres du dessus tabcombligcoltabcomblig 1col 1 tabcomblig 1col Cette solution vite la rcursivit mais implique la gestion dun tableau de valeurs calcules Elle implique aussi de connatre lavance le nombre de lignes du triangle donc oblige programmer un contrle sur la saisie et un gaspillage de 50 de la mmoire car on est oblig de dclarer un tableau carr alors que les valeurs calcules nen occupent que sa moiti Cependant la rapidit dexcution est exponentiellement plus avantageuse que toutes les solutions prcdentes et permet un triangle de 500 lignes tout en tant facilement modifiable pour calculer des triangles plus gros Et enfin lutilisation de fonctions dallocation dynamique de mmoire permettra dliminer le gaspillage de mmoire en nallouant que ce qui est ncessaire au stockage mais ncessitera une programmation plus pousse cf chapitre sur la gestion de la mmoire
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 51123 5 Solution Calcul de la combinaison par simplification de la fraction Dfinitions des alias sur des types existants plus pratique pour programmer typedef unsigned short ushort Entier court non sign typedef unsigned long ulong Entier long non sign Prototypes des fonctions utilises ulong combushort ushort Combinaison void ligneushort Ligne du triangle Fonction principale int mainvoid Dclaration des variables ushort i Indice de boucle ushort limite Limite du triangle demande Saisie et contrle de la limite du triangle printfquotEntrez la limite du triangle voulue quot scanfquothuquot amplimite Boucle jusquau niveau demand for i0 i lt limite i Affichage de la ligne quotiquot lignei Fin du programme return 0 Affichage dune ligne quotligquot void ligne ushort lig N de ligne afficher Dclaration des variables ushort col Indice de colonne Boucle jusquau niveau demand for col0 col lt lig col Affichage de la combinaison Clig col printfquotlu quot combcol lig Fin de ligne printfquotnquot
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 52123 Calcul de la combinaison Cx y par simplification de la fraction ulong comb ushort col Colonne ushort lig Ligne Dclaration des variables ushort i Indice de boucle ushort j Indice de boucle ushort pivot Pivot de dpart de la multiplication ulong res Rsultat de la combinaison Si on est en premire ou dernire colonne facultatif mais optimise la fonction if col 0 col lig return 1 Valeur du triangle connue Si on est en seconde ou avant-dernire colonne facultatif mais optimise la fonction if col 1 col lig - 1 return lig Valeur du triangle connue Recherche du pivot point partir duquel on commencera multiplier pivotlig col gt col lig col col Calcul de la combinaison par multiplication et division simultane res1 for ipivot 1 j1 i lt lig i j resres i j Renvoi du rsultat return res Cette solution peut-tre considre comme la meilleure Elle bnficie du fait que le calcul de C3 8 tout comme le calcul de C5 8 sont identiques et se font en faisant 6 x 7 x 8 1 x 2 x 3 les nombres quot3quot et quot8 3quot ou quot5quot et quot8 5quot sont des nombres pivots de ce calcul De plus grace lvolution parallle de deux indices on peut multiplier et diviser simultanment ce qui vite au rsultat de la combinaison de grossir dmesurment et inutilement Et mathmatiquement la division sera toujours parfaite puisque le second indice commence quot1quot 6 Conclusion Diffrentes solutions mme programmes avec rigueur ne produisent pas forcment un travail rellement efficace car elles sont limites dune part par les contraintes du langage et dautre part par les limites du systme sur lequel sera implant le programme Il vaut mieux rflchir dabord au problme et loptimisation ventuelle de sa solution avant de commencer coder
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 53123 IX LA VISIBILITE DES VARIABLES - LES CLASSES DALLOCATION DES VARIABLES 1 Visibilit des variables La visibilit dune variable concerne lendroit du source o la variable est accessible lisible ou modifiable a Variable locale Une variable locale est une variable qui a t dclare dans un bloc dinstructions Rappel Chaque bloc dinstructions encadr par des accolades peut se composer de variables dclares avant toute instruction et dinstructions La variable locale est locale pour le bloc et tous ses sous-blocs ventuels Elle ne sera donc accessible lisible ou modifiable que depuis le bloc o elle a t dclare et tous ses sous-blocs ventuels Puisque la variable nest vue que du bloc rien nempche deux blocs distincts davoir une variable de mme nom Si des blocs imbriqus ont chacun une variable du mme nom le sous-bloc ne verra plus que sa variable et ne verra plus la variable dclare dans le bloc suprieur Une variable locale qui nest pas initialise par le programmeur est cre par dfaut avec un contenu imprvisible Exemple int mainvoid Bloc numro 1 int var Cration variable quotvarquot du bloc quot1quot var10 Affectation variable quotvarquot du bloc quot1quot Bloc numro 11 var50 Affectation variable quotvarquot du bloc quot1quot printfquotvardnquot var Affichera quot50quot Fin de bloc numro 11 printfquotvardnquot var Affichera encore quot50quot Bloc numro 12 int var Cration variable quotvarquot du bloc quot12quot var100 Affectation variable quotvarquot du bloc quot12quot printfquotvardnquot var Affichera quot100quot Fin de bloc numro 12 printfquotvardnquot var Affichera toujours quot50quot quotbloc quot12quot termin
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 54123 b Variable globale Une variable globale est une variable qui a t dclare en dehors de tout bloc dinstructions Elle sera alors visible depuis sa dclaration jusqu la fin du fichier source mais sera masque par toute variable locale du mme nom Par ailleurs une variable globale sera connue de tout le programme On pourra donc y accder dans une fonction mme situe dans un autre source condition de la dclarer en quotexternquot dans ce dernier cf chapitre sur les classes dallocation Cependant les programmeurs naiment pas utiliser des variables globales car en cas dincohrence du contenu de la variable dans un programme mal crit il est difficile de reprer lendroit o a pu se produire lerreur dcriture Rien nempche de dclarer dans un bloc quelconque une variable locale de mme nom quune variable globale A partir de ce moment et jusqu la fin du bloc la variable globale sera masque par la variable locale et le langage naura plus accs qu cette dernire Une variable globale qui nest pas initialise par le programmeur est cre par dfaut avec son contenu mis zro Exemple Prototypes de trois fonctions neutres void fonction1void void fonction2void void fonction3void int mainvoid int var Cration variable locale quotvarquot var10 printfquotvardnquot var Affichera quot10quot fonction1 Appel de quotfonction1quot int var50 Variable globale mais pas connue du quotmainquot Fonction quotfonction1quot void fonction1void printfquotvardnquot var Affichera quot50quot la variable globale var100 Modification de la variable globale fonction2 Appel de quotfonction2quot Fonction quotfonction2quot void fonction2void int var Cration variable locale quotvarquot var200 printfquotvardnquot var Affichera quot200quot la variable locale fonction3 Appel de quotfonction3quot Fonction quotfonction3quot void fonction3void printfquotvardnquot var Affichera quot100quot la variable globale
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 55123 2 Classes dallocation des variables La classe dallocation dune variable concerne la faon dont sera stock la variable dans la mmoire ce qui influe sur sa dure de vie temps dexcution du programme durant lequel on est certain de conserver le contenu de la variable intacte a Classe automatique mot-clef quotautoquot La variable est cre et supprime de la mmoire automatiquement par le programme quand il nen a plus besoin Cest le cas entre autres des paramtres des fonctions Toute variable dfinie sans classe dallocation est place en classe automatique par dfaut Toutes les variables vues jusqu prsent dans les exemples taient en classe automatique auto int n0 Le mot clef quotautoquot nest pas obligatoire b Classe registre mot-clef quotregisterquot La variable est stocke dans un registre mmoire trs rapide si cest possible registre disponible taille de la variable suffisamment petite pour y tenir etc Dans le cas contraire le compilateur ne signale rien mais considre la variable comme automatique On peut optimiser les boucles dun programme en plaant les indices de boucle dans des registres mais aujourdhui les compilateurs sont trs performants et optimisent les variables dun programme mieux quun programmeur ne sait le faire Il vaut donc mieux ne pas interfrer avec le compilateur en nessayant pas de placer des variables dans des registres la place de ceux-ci Par ailleurs il ne faut pas esprer pouvoir placer un double 8 octets un tableau ou une chane de caractres tableau de caractres dans un registre register int n0 Si la mise en registre nest pas possible quotnquot sera quotautoquot c Classe statique mot-clef quotstaticquot La variable est stocke dans une zone mmoire et y restera jusqu la fin dexcution du programme Cela garanti donc dans le cas de fonction appele plusieurs fois que la variable nest pas perdue entre chaque appel permet de programmer un compteur dappels par exemple Par ailleurs dans le cas dun programme crit avec plusieurs sources la variable nest connue que du source dans lequel elle est dfinie Ceci permet ainsi davoir plusieurs variables globales ou plusieurs fonctions portant un mme nom mais nayant pas un mme but chaque variable globale ou chaque fonction but diffrent tant plac dans un source diffrent Enfin cela permet davoir une variable dont la valeur initiale est garantie car elle est initialise par dfaut 0 De plus si elle est initialise lors de la dclaration cette initialisation ne se fait quune seule fois mme si la fonction o est dclare cette variable est appele plusieurs fois static int n100 Linitialisation quot100quot ne se fera quune seule fois Exemple Fonction quelconque void fonctionvoid Dclaration des variables static int n0 Variable statique valeur conserve initialise une fois Programmation n Valeur incrmente chaque appel de quotfonctionquot
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 56123 d Classe externe mot-clef quotexternquot Cette classe permet de dclarer une variable sans lui rserver de place en mmoire Cela est en gnral utilis dans le cas dun programme tenant sur plusieurs fichiers sources o la mme variable forcment globale est utilise dans les diffrents fichiers sources En effet pour passer du quotcquot au quotoquot le compilateur effectue une premire analyse du source et toute variable utilise dans une fonction doit tre dclare avant son utilisation Le programmeur est donc oblig de dclarer sa mme variable dans chaque fichier source Mais si pour chaque fichier quotoquot gnr le compilateur rserve un emplacement mmoire pour la variable dclare lditeur de lien ne comprendra pas que toutes ces variables dclares ne concernent quune seule entit mmoire pour le programme et produira alors une erreur de compilation Cest pourquoi la variable ne doit tre dfinie rserve en mmoire que dans un seul source en gnral celui qui contient la fonction quotmainquot et seulement dclare avec le mot quotexternquot dans les autres sources Il ny a dans ce dernier cas aucune rservation mmoire lors de la dclaration Cest ici quon fait la diffrence entre quotdclarationquot et quotdfinitionquot Enfin il nest pas possible de dclarer une variable en quotexternquot et linitialiser en mme temps car il ny a pas de mmoire associe la variable extern int var Interdit dcrire quotextern int var100quot Exemple de travail sur la mme variable avec plusieurs sources Source 1 contenant la fonction quotmainquot Dfinition de quotvarquot int var100 Dclaration de fonction quotfctXquot void fctXvoid Programme principal int mainvoid Appel de quotfctXquot fctX Source 2 contenant la fonction quotfctXquot Dclaration de quotvarquot extern int var Dfinition de fonction quotfctXquot void fctXvoid Utilisation de quotvarquot printfquotvardnquot var Il est aussi possible de dclarer une variable en quotexternquot dans le mme fichier source que celui ou elle est dfinie lorsquon veut dans un soucis de rigueur de programmation dclarer dans chaque fonction toutes les variables quelle utilise y compris les variables globales Il est donc ncessaire pour ces dernires de les dclarer dans la fonction en quotexternquot int var Variable globale connue de toutes les fonctions Fonction quelconque void fonctionvoid Dclaration des variables extern int var Ce programmeur rigoureux indique ainsi quil a lintention dutiliser la variable globale quotvarquot Un autre programmeur qui arrive dans le projet voit facilement que la fonction utilisera quotvarquot Si quotvarquot est modifie par erreur il sera facile de rpertorier toutes les fonctions lutilisant
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 57123 3 Rsum visibilitdure de vie En sachant que quotvisibilitquot signifie quoto on peut voir la variablequot et quotdure de viequot signifie quotcombien de temps la variable garde-t-elle sa valeur on peut tablir le tableau rsum suivant auto register static extern Visibilit Le bloc dans lequel elle est dfinie Le bloc dans lequel elle est dfinie Le bloc dans lequel elle est dclare Variable locale Dure de vie Le temps du programme Visibilit Le source dans lequel elle est dfinie Le source dans lequel elle est dfinie Le source dans lequel elle est dclare Variable globale Dure de vie Le temps du programme 4 Les exceptions quotconstquot et quotvolatilequot Il est possible de demander au compilateur de protger la valeur initialise dune variable contre toute modification ultrieure affectation incrment etc en mettant le mot quotconstquot devant la dclaration de la variable Le mot quotvolatilequot nexiste que pour tre loppos de quotconstquot en indiquant que la variable est modifiable toute variable est modifiable par dfaut Il peut paratre bizarre de vouloir une variable non-modifiable En gnral on sen sert pour protger les tableaux passs en paramtres dune fonction et on va indiquer ainsi que la fonction na pas le droit de modifier le contenu du tableau quelle reoit Exemple void fonc const int tab Le contenu de quottabquot est invariable const float pi314159267 Le nombre quotpiquot est invariable tabx Interdit quel que soit quotxquot pi Interdit aussi
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 58123 X LES POINTEURS Au contraire des bruits qui courent propos du langage C les pointeurs ne prsentent aucune difficult apprhender pour peu quils soient vus sans prcipitation ni inquitude subjective 1 Gnralits Il a t vu que toute variable en langage C ne contient que du nombre valeur numrique code ascii etc Cependant chaque variable est situe un emplacement mmoire numrot appel aussi quotadresse Le langage C offre au programmeur le moyen de rcuprer cette adresse et de la stocker dans une autre variable A partir de cette seconde variable il est naturellement possible de connatre sa valeur comme toute variable habituelle du langage C mais comme cette valeur correspond ladresse dune premire variable il est aussi possible de connatre la valeur de cette dernire Cette seconde variable qui contient ladresse de la premire est appele quotpointeurquot Dans tout ce chapitre et afin de distinguer les valeurs quotadressequot des valeurs quotclassiquesquot toutes ces valeurs ne sont la base que des nombres les adresses commenceront toujours par quot0xquot ce qui correspond la notation numrique en hexadcimal
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 59123 2 Premier essai de pointeur a Premier pointeur Le pointeur simple Dclarons une variable appele quotvarquot et contenant la valeur quot31416quot float var31416 Il se trouve que cette variable quotvarquot a t stocke en mmoire un emplacement appel quotadressequot Nous pouvons mettre lhypothse que quotvarquot est stocke en mmoire ladresse quot0x10quot Voici un schma de la mmoire ce moment l Adresse Nom Contenu 0x10 var 31416 Si on demande au langage quotaffiche varquot il nous donnera naturellement quot31416quot Cependant le langage C offre au programmeur un oprateur permettant de rcuprer non plus la valeur dune variable mais ladresse dune variable Loprateur qui permet davoir quotladresse dequot est loprateur unaire quotampquot dont on a dj parl lors de quotscanfquot Si on demande au langage quotaffiche adresse de varquot il donnera quot0x10quot printfquotLa valeur de var est fnquot var Affichera quot31416quot printfquotLadresse de var est 0xxnquot ampvar Affichera quot0x10quot Dclarons maintenant une seconde variable appele quotptquot et contenant la valeur quot0x10quot int pt0x10 Cette seconde variable quotptquot a t stocke un second emplacement mmoire seconde adresse de valeur quot0x20quot par exemple Voici un schma de la mmoire ce moment l Adresse Nom Contenu 0x10 var 31416 0x20 pt 0x10 Si on demande au langage quotaffiche ptquot il nous donnera naturellement son contenu quot0x10quot Si on demande au langage quotaffiche adresse de ptquot il donnera quot0x20quot printfquotLa valeur de pt est 0xxnquot pt Affichera quot0x10quot printfquotLadresse de pt est 0xxnquot amppt Affichera quot0x20quot Cependant ici il est possible de demander quotaffiche ce quil y a ladresse 0x10quot Et en tout tat de cause on cherche obtenir la valeur quot31416quot Il se trouve que la valeur quot0x10quot est stocke dans quotptquot et que loprateur qui permet davoir quotce quil y a ladresse dequot est loprateur unaire quotquot qui se dit aussi quotvaleur pointe parquot printfquotLa valeur de pt est fnquot pt On cherche avoir quot31416quot
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 60123 Le soucis du langage C est que la valeur quot31416quot est stocke dans un float qui utilise 4 octets en mmoire Lorsquon demande au langage le contenu de quotvarquot le compilateur connat le type de quotvarquot qui est quotfloatquot et sait quil faut lire alors 4 zones mmoires contigus pour avoir la valeur demande petite parenthse quotptquot est une variable quotintquot donc stocke elle aussi sur 4 octets mmoires Voici un schma exact de la mmoire ce moment l Adresse Nom Contenu 0x10 0x11 0x12 0x13 var 31416 0x20 0x21 0x22 0x23 pt 0x10 Par contre quand on demande le contenu de quotptquot contenu de ce quil y a ladresse reprsente par quotptquot le compilateur ne sait pas combien de zones mmoires il faut lire ladresse quot0x10quot il peut y avoir un quotcharquot un quotdoublequot ou un autre type cette adresse Bien entendu le compilateur sait faire le lien entre quotvarquot et son type quotfloatgt4 octetsquot mais ne sait pas faire ce lien dont on a besoin quot ladresse 0x10 il y a un floatquot Pour que le compilateur puisse faire ce dernier lien il faut lui indiquer que quotce qui est point par pt ou plus simplement quotptquot est un quotfloatquot attention quotptquot de lit quottoile ptquot int pt0x10 Cette instruction nest pas correcte float pt0x10 Voici ce quil faut crire Peut se lire indiffremment de deux manires diffrentes -quottoile pt est de type floatquot quotpt est de type quotfloat toilequot ou quotpointeur sur floatquot printfquotLa valeur de pt est fnquot pt On aura maintenant quot31416quot Dans la seconde et correcte dclaration il est automatiquement dclar deux entits utilisables par le langage quotptquot est de type quotfloatquot donc le langage saura quil faut rcuprer 4 octets mmoire si on lui demande la valeur de quotptquot quotptquot est de type quotintquot contenant ladresse dun quotfloatquot gt quotptquot est de type quotfloat toilequot noubliez jamais de prononcer le mot quottoilequot quand vous parlez de votre pointeur Puisque quotampvarquot donne aussi quot0x10quot on peut utiliser cette dernire galit float ptampvar Dclaration relle du pointeur quotptquot Attention la valeur quotampvarquot sera affecte quotptquot et non quottoile ptquot quotptquot est un quotpointeur sur un floatquot var 31416 0x10 pt 0x10 0x20
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 61123 b Second pointeur Le pointeur sur un pointeur ou double pointeur En continuant les essais dclarons une troisime variable appele quotdptquot et contenant la valeur quot0x20quot int dpt0x20 Cette troisime variable quotdptquot a t stocke un troisime emplacement mmoire troisime adresse de valeur quot0x30quot par exemple Voici un schma exact de la mmoire ce moment l Adresse Nom Contenu 0x10 0x11 0x12 0x13 var 31416 0x20 0x21 0x22 0x23 pt 0x10 0x30 0x31 0x32 0x33 dpt 0x20 Si on demande au langage quotaffiche dptquot il nous donnera comme pour toute autre variable le contenu de quotdptquot soit quot0x20quot Si on demande au langage quotaffiche adresse de dptquot il donnera quot0x30quot printfquotLa valeur de dpt est 0xxnquot dpt Affichera quot0x20quot printfquotLadresse de dpt est 0xxnquot ampdpt Affichera quot0x30quot Mais cest encore le mme problme si on demande quotaffiche dptquot affiche quotce qui est point par dptquot le compilateur ne sait pas combien de zones mmoires il faut lire ladresse quot0x20quot Pour que le compilateur sen sorte on peut lui indiquer que quotdptquot est un quotintquot puisqu ladresse quot0x20quot il y a un quotintquot et essayer lcriture suivante int dpt0x20 Cette instruction nest pas correcte int dpt0x20 Essayons celle-l printfquotLa valeur de dpt est 0xxnquot dpt On aura probablement quot0x10quot Si on demande maintenant quotaffiche dptquot on aura probablement quot0x10quot et on peut se dire quon a russi Mais si on demande quotaffiche dptquot affiche quotce qui est point par ce qui est point par dptquot le compilateur ne connaissant pas le type de quotdptquot est de nouveau bloqu Pourtant ce lien entre quotdptquot et quot31416quot existe virtuellement il ne reste plus qu lindiquer au compilateur Pour que ce dernier sen sorte il faut indiquer que quotdptquot est un quotfloatquot int dpt0x20 Cette instruction nest pas correcte int dpt0x20 Celle-l non plus float dpt0x20 Voici ce quil faut crire printfquotLa valeur de dpt est 0xxnquot dpt On a toujours quot0x10quot printfquotLa valeur de dpt est fnquot dpt Et ici on a quot31416quot
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 62123 Dans la troisime et correcte dclaration il est dclar alors trois entits utilisables par le langage quotdptquot est de type quotfloatquot donc le langage saura quil faut rcuprer 4 octets mmoire si on lui demande le contenu de quotdptquot quotdptquot est de type quotintquot contenant ladresse dun quotfloatquot gt quotdptquot est de type quotfloat toilequot toujours ne pas oublier le mot quottoilequot Le langage saura donc accder au contenu de quotdptquot quotdptquot est de type quotintquot contenant ladresse de ladresse dun quotfloatquot gt quotdptquot est de type quotfloat toile toilequot en prononcant autant de fois le mot quottoilequot quil le faut Puisque quotampptquot donne quot0x20quot on peut encore utiliser cette dernire criture float dptamppt Dclaration relle du pointeur quotdptquot Toujours pareil la valeur quotampptquot sera affecte quotdptquot et non quotdptquot quotdptquot est un quotpointeur sur un pointeur sur un floatquot Remarque Ne confondez pas quotampptquot adresse de quotptquot quot0x20quot quotptquot valeur de quotptquot quot0x10quot et quotptquot valeur de la case situe ladresse quot0x10quot quot31416quot var 31416 0x10 pt 0x10 0x20 dpt 0x20 0x30
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 63123 Rcapitulatif Voici un rcapitulatif du premier programme manipulant des pointeurs int mainvoid float var31416 Dclaration de la variable quotvarquot float ptampvar Dclaration du pointeur quotptquot float dptamppt Dclaration du pointeur quotdptquot float pi Dclaration dune variable quotpiquot printfquotLa valeur de var est fnquot var Affichera quot31416quot printfquotLadresse de var est 0xxnquot ampvar Affichera quot0x10quot printfquotLa valeur de pt est 0xxnquot pt Affichera quot0x10quot printfquotLadresse de pt est 0xxnquot amppt Affichera quot0x20quot printfquotLa valeur de pt est fnquot pt Affichera quot31416quot printfquotLa valeur de dpt est 0xxnquot dpt Affichera quot0x20quot printfquotLadresse de dpt est 0xxnquot ampdpt Affichera quot0x30quot printfquotLa valeur de dpt est 0xxnquot dpt Affichera quot0x10quot printfquotLa valeur de dpt est fnquot dpt Affichera quot31416quot Je peux manipuler nimporte quelle des trois premires variables pivar Je peux utiliser quotvarquot pipt Je peux utiliser quotptquot pidpt Je peux utiliser quotptquot Les parenthses sont obligatoires sinon le compilateur traduit par quotpi pi ptquot Remarques Un pointeur contenant toujours une adresse implique quun pointeur est toujours une variable au format entier quel que soit lobjet quil y a au bout Si quotptquot vaut quot0x10quot ne confondez pas quotptquot gt contenu de la case nomme quotptquot quot0x10quot et quotptquot gt contenu de la case dont ladresse est quot0x10quot Si on demande quotampvarquot le compilateur ira chercher quotce qui est point par ladresse ampvarquot autrement dit quotvarquot Les oprateurs quotampquot et quotquot sannulent mutuellement
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 64123 3 Pointeurs et tableaux Dclarons un tableau de 3 nombres virgule flottante float tab331416 27183 14142 Voici un schma simplifi de la mmoire ce moment l Adresse Nom Contenu 0x1000 tab0 31416 0x1001 tab1 27183 0x1002 tab2 14142 Remarque En fait les adresses ne sont pas rellement celles-l car pour chaque lment il lui est rserv 4 octets en mmoire donc les adresses relles sont dcales de 4 et non de 1 Mais il est prfrable pour linstant de les symboliser ainsi pour bien montrer que les lments se suivent en mmoire Il se trouve que lorsque le compilateur cre un tableau il cre en plus une variable supplmentaire dont lidentificateur est le nom du tableau sans crochet et le contenu est ladresse du premier lment quotamptab0quot Adresse Nom Contenu 0x10 tab 0x1000 quottabquot contient une adresse et au bout de cette adresse quottabquot il y a quot31416quot un nombre de type quotfloatquot gt quottabquot est donc un quotpointeur sur un floatquot gt quottabquot est donc un quotfloat toilequot Le nom dun tableau est toujours un pointeur sur son premier lment tab amptab0
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 65123 4 Opration sur les pointeurs Si on demande au langage quotaffiche tabquot il nous donnera comme pour toute variable dj vue le contenu de quottabquot soit quot0x1000quot Si on demande au langage quotaffiche ce qui est point par tabquot affiche quottabquot il donnera quot31416quot qui correspond aussi quottab0quot Si on demande au langage quotaffiche tab 1quot il nous donnera naturellement le contenu de quottabquot ajout de quot1quot cest dire quot0x1001quot Si on demande au langage quotaffiche ce qui est point par tab 1quot affiche quottab 1quot il donnera quot27183quot qui correspond aussi quottab1quot Il en rsulte la rgle suivante tabn tab n Enfin si on demande ladresse de tab2 amptab2 on aura quot0x1002quot qui peut aussi tre obtenu par quottab 2quot Il en rsulte la seconde rgle suivante amptabn tab n Remarque Puisque les oprateurs quotampquot et quotquot sannulent lun lautre on peut passer de la premire rgle la seconde en rajoutant loprateur quotampquot de chaque cot de lgalit et on peut passer de la seconde la premire en rajoutant loprateur quotquot de chaque cot de lgalit Ces rgles tant normalises elles restent valable mme si on considre les adresses relles de la mmoire dcales de 4 dans le cas du quotfloatquot et non de 1 Adresse Nom Contenu 0x10 tab 0x1000 0x1000 tab0 31416 0x1004 tab1 27183 0x1008 tab2 14142 Ainsi lorsquon rajoute quotnquot un pointeur sur un type particulier le langage rtablit le vrai calcul et multiplie quotnquot par la taille du type Donc si on demande au langage quottab 2quot il nous donnera quot0x1008quot et non quot0x1002quot quottab nquot est traduit par quottab n sizeoflttype de tabgtquot Ceci permet en utilisant un second pointeur daccder aux lments dun tableau plus rapidement quen utilisant les crochets quotquot car dans ce dernier cas le compilateur insre dans le code assembleur des instructions de calcul pour accder lindice quotnquot partir du dbut du tableau alors quavec un pointeur le point daccs lindice quotnquot est dj cr et prt lemploi Exemple daccs aux valeurs dun tableau int mainvoid Dclaration des variables float tab331416f 27183f 14142f Tableau de trois flottants float pt Pointeur sur un flottant int i Indice de boucle Balayage du tableau en utilisant un indice classique for i0 i lt 3 i printfquottabufn i tabi Laccs tabi implique un calcul Balayage du tableau en utilisant un pointeur plus rapide for i0 pttab i lt 3 i pt quotiquot sert seulement pour quitter la boucle printfquottabufn i pt Laccs pt ne demande aucun calcul Fin du programme return 0
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 66123 5 O la logique dmontre limpossible Prenons la premire des rgles dmontres prcdemment quottabn tab nquot et dveloppons l jusqu lextrme tabn tab n premire des rgles tab n n tab commutativit de laddition tab n n tab par dduction n tab ntab par simple application de la premire rgle Il en rsulte quon est autoris crire quottabnquot ou quotntabquot en langage C lorsquon dsire atteindre un des lments dun tableau De la mme faon si on applique la premire rgle un tableau deux dimensions on obtient le raisonnement suivant tabxy tab xy par application simple de la premire rgle sur quottabxquot tab xy tab x y par seconde application de la premire rgle tab x y x tab y par commutativit entre quottabquot et quotxquot x tab y y x tab par commutativit entre quotx tab et quotyquot y x tab y xtab par application inverse de la premire rgle sur quotx tabquot y xtab yxtab par seconde application inverse de la premire rgle On peut ainsi crire quottabxyzquot ou bien quotzyxtabquot dans le cas de tableaux plusieurs dimensions 6 Danger du pointeur Le vrai et seul danger dun pointeur est daller lire ou modifier la zone pointe sans la connatre En effet dfinir un pointeur cest la base une variable sans linitialiser revient le remplir dune valeur imprvisible Ensuite aller voir ou modifier ladresse correspondant cette valeur nest pas du tout une bonne ide Exemple float pt Que contient quotptquot pt31416 O va aller la valeur quot31416quot Voici un schma de la mmoire Adresse Nom Contenu 0x1000 pt xxx xxx pt 31416 At-on le droit dcrire ladresse quotxxxquot Cette adresse nest-elle pas par hasard ladresse dune autre variable En gnral ce genre de manipulation conduit 2 cas le programme plante immdiatement On sait au moins quil y a un problme et on peut le chercher Avec un peu dhabitude on le trouve gnralement assez rapidement le programme fonctionne sans problme apparent car il se trouve que ladresse quotxxxquot est libre et accessible Cest le cas le plus grave car le problme existe mais ne se montre pas pendant 1 10 100 essais Puis un jour le programmeur rajoute une variable innocente mais qui utilise ladresse quotxxxquot et le programme plante immdiatement Mais lerreur est depuis longtemps enfouie dans la masse des lignes de codes Pour viter ce genre derreur il ne faut jamais utiliser quotptquot si on na pas auparavant rempli quotptquot avec une adresse cohrente connue
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 67123 7 Tableaux de pointeurs Un pointeur ntant quun nombre rien ne lempche dtre stock avec dautres nombres de sa catgorie dans un tableau On nomme un tel tableau un quottableau de pointeursquot Lutilit dun tel tableau est courante ds quon parle de chanes Une chane de caractre tant un tableau de caractres cest dj un pointeur Et si on veut manipuler et stocker plusieurs chanes dans un tableau il devient obligatoire dutiliser un quottableau de pointeursquot Cela permet en plus de gagner de la place surtout quand on travaille sur des chanes de longueurs ingales Exemple de tableau deux dimensions Tableau des jours de la semaine char semaine79 Tableau de 7 lignes sur 9 colonnes l u n d i 0 6 colonnes utilises sur 9 m a r d i 0 6 colonnes utilises sur 9 m e r c r e d i 0 9 colonnes utilises sur 9 j e u d i 0 6 colonnes utilises sur 9 v e n d r e d i 0 9 colonnes utilises sur 9 s a m e d i 0 7 colonne sutilises sur 9 d i m a n c h e 0 9 colonnes utilises sur 9 Reprsentation de la mmoire Adresse Nom Contenu 0x10 semaine 0x1000 0x1000 semaine00 l 0x1001 semaine01 u 0x1002 semaine02 n 0x1003 semaine03 d 0x1004 semaine04 i 0x1005 semaine05 0 0x1006 semaine06 non utilis mais rserv perdu 0x1007 semaine07 non utilis mais rserv perdu 0x1008 semaine08 non utilis mais rserv perdu 0x1009 semaine10 m 0x1010 semaine11 a 0x1011 semaine12 r 0x1012 semaine13 d 0x1013 semaine14 i 0x1014 semaine15 0 0x1015 semaine16 non utilis mais rserv perdu 0x1016 semaine17 non utilis mais rserv perdu 0x1017 semaine18 non utilis mais rserv perdu 0x1018 semaine20 m etc etc etc Dans cet exemple on perd 11 octets sur 64 cest dire 17 de la mmoire rserve Cela peut paratre insignifiant au regard des puissances actuelles de nos machines mais transpose lchelle dun vaste projet 17 de mmoire perdue ou gagne peuvent faire la diffrence entre un programme mdiocre et un programme de qualit
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 68123 Exemple de tableau de pointeurs Tableau des jours de la semaine char semaine7 Tableau de 7 pointeurs sur un caractre quotlundiquot Pointeur quotmardiquot Pointeur quotmercrediquot Pointeur quotjeudiquot Pointeur quotvendrediquot Pointeur quotsamediquot Pointeur quotdimanchequot Pointeur Reprsentation de la mmoire Adresse Nom Contenu 0x10 semaine 0x1000 0x1000 semaine0 0x2000 0x1001 semaine1 0x3000 0x1002 semaine2 0x4000 0x1003 semaine3 0x5000 0x1004 semaine4 0x6000 0x1005 semaine5 0x7000 0x1006 semaine6 0x8000 0x1007 utilis par dautres variables utilis par dautres variables 0x2000 semaine00 l 0x2001 semaine01 u 0x2002 semaine0 2 n 0x2003 semaine03 d 0x2004 semaine04 i 0x2005 semaine05 0 utilis par dautres variables 0x3000 semaine10 m 0x3001 semaine11 a 0x3002 semaine 1 2 r etc etc etc Dans cet exemple on ne perd aucune partie de la mmoire Et la manipulation de telles structures ne pose pas de soucis quand on y est habitu Remarque Mme dans le cas de tableau de pointeurs on peut encore remplacer loprateur quotquot par des crochets De plus cette technique de tableau contenant ladresse dautres tableaux peut tre gnralise pour reprsenter des tableaux plusieurs dimensions Malheureusement de tels ensembles deviennent vite difficile schmatiser donc il convient de programmer le langage C avec rigueur afin de ne pas gnrer dincohrences
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 69123 8 Fonctions paramtres et pointeurs a Modification dune variable passe une fonction Il a t vu lors de lapprentissage des fonctions en C que celles-ci ne pouvaient pas modifier la variable quelle reoit en paramtre car la fonction nen reoit quune copie Cependant il est possible de passer une fonction ladresse dune variable La fonction copiera cette adresse dans une zone temporaire mais saura quel emplacement mmoire se trouve la variable dorigine et pourra donc la modifier Exemple de passage dadresse une fonction int mainvoid float var271828 Variable modifier Appel de la fonction modifampvar La fonction quotmodifquot reoit ladresse de quotvarquot printfquotvarfnquot var Reprsentation de la mmoire Adresse Nom Contenu 0x1000 var 271828 La fonction va recevoir la valeur quot0x1000quot Cette valeur tant un nombre entier on peut se dire quelle reoit un quotintquot quon appellera par exemple quotptquot Cependant comme pour le premier pointeur du chapitre la fonction va devoir aller toucher ce qui est point par quotptquot donc va devoir aller toucher quotptquot Or le langage ne saura pas ce quil y a cet endroit si on ne le lui a pas dit Et lendroit reprsent par quotptquot il y a un quotfloatquot Exemple de la fonction quotmodifquot void modif float pt Pointeur sur un nombre quotfloatquot Modification de la valeur pt31416 Modification de ce qui est quotpoint par ptquot Reprsentation de la mmoire Adresse Nom Contenu 0x1000 var 271828 0x5000 pt 0x1000 Puisque la fonction reoit la valeur quot0x1000quot et quelle connat le type de ce quil y a cet endroit elle peut le modifier Cest pour cela que la fonction quotscanfquot doit imprativement recevoir ladresse de la variable saisir Et cest aussi pour cela quon ne passe pas ladresse dune chane la fonction quotscanfquot parce quune chane est dj un tableau et que nommer une chane consiste nommer ladresse de son premier lment Remarque Si quotvarquot est de type quotfloatquot alors quotampvarquot est de type quotfloat toilequot On peut arriver aussi cette remarque en utilisant lastuce suivante quotvarquot est de type quotfloatquot donc quotampvarquot est de type quotfloatquot donc quotampvarquot est de type quotfloat quot si on te ltoile dun cot de lquation on la replace de lautre cot
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 70123 b Doit-on mettre quotampquot ou quotquot Arriv ce niveau le dbutant en C se heurte assez rapidement un dilemne La fonction doit recevoir un quotfloat toilequot et le programme possde dj une variable quotptquot dclare comme quotfloat toilequot quotfloat ptquot Le but tant que la fonction reoive la valeur de quotptquot Souvent le dbutant se dit quotelle reoit un float toile je lui passe alors quottoile ptquot comme dans lexemple suivant void modif float param Paramtre reu par la fonction Modification de la valeur param271828 Modification de ce qui est quotpoint par paramquot int mainvoid Dclaration des variables float pi31416 Variable quotpiquot float ptamppi Variable quotptquot contenant ladresse de quotpiquot Programmation modifpt Mauvais modifamppt Trs mauvais modifpt Correct modifamppi Correct Examinons nouveau la mmoire Adresse Nom Contenu 0x1000 pi 31416 0x2000 pt 0x1000 0x5000 param On ne connat pas le contenu de quotparamquot Mais notre dsir est quil reoive la valeur quot0x1000quot afin que la fonction quotmodifquot puisse aller modifier la valeur quot31416quot si on passe la fonction quotptquot on lui passe quot31416quot ce qui nest pas le but Dailleurs quotptquot est de type quotfloatquot alors que la fonction attend un quotfloat toilequot si on lui passe quotampptquot on lui passe quot0x2000quot ce qui nest toujours pas bon De plus quotptquot tant de type quotfloat toilequot quotampptquot est de type quotfloat toile toilequot et ne correspond pas non plus au type attendu quotfloat toilequot si on lui passe quotptquot on lui passe quot0x1000quot ce qui est correct Et quotptquot est de type quotfloat toilequot il correspond au type attendu par la fonction si on lui passe quotampvarquot on lui passe aussi quot0x1000quot ce qui est toujours correct Et quotampvarquot est aussi du type attendu par la fonction quotfloat toilequot c Fonction renvoyant un pointeur Un pointeur tant une valeur comme une autre la fonction peut renvoyer cette valeur Il suffit alors de dclarer la fonction du type de la valeur quelle renvoie Et ainsi on peut avoir des fonctions de type quotchar toilequot quotint toilequot ou quotdouble toilequot selon le cas Exemples de dclarations diverses char f1void quotf1quot renvoie un pointeur sur un caractrequot int f2void quotf2quot renvoie un pointeur sur un entier double f3void quotf3quot renvoie un pointeur sur un rel double prcision
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 71123 9 Pointeur sur rien Pointeur sur tout Ces types de pointeurs vus jusqu prsent viennent senrichir dun type nouveau le pointeur universel quotvoid toilequot Il sagit dun pointeur pouvant pointer sur nimporte quoi non prvu lavance Puisque le type quotvoidquot tait libre et quun pointeur sur quotvidequot navait aucune signification le type quotvoid toilequot est devenu synonyme de quotpointeur sur toutquot Evidemment pour utiliser un quotpointeur sur toutquot il faut le transformer quotcasterquot en quotpointeur sur le type dsirquot avant dy appliquer loprateur quotpoint parquot Exemple main Dclaration des variables float pi31416 Variable quotpiquot void pt Pointeur universel quotptquot Puisque quotptquot est universel je peux y mettre nimporte quoi ptamppi Jy mets donc ladresse de quotpiquot Modification de ce qui est point par quotptquot mais obligation de le quotcasterquot floatpt271828 quotptquot est quotcastquot en quotpointeur sur floatquot
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 72123 10 Exercices Ecrire une fonction qui compte et renvoie le nombres de caractres de la chane quelle reoit en argument une chaine est un tableau de caractres avec un caractre supplmentaire valant zro pour indiquer o se termine la chaine Prototype fonction quotChaineLenquot recevant une chane compter unsigned long ChaineLenchar Fonction principale du programme int mainvoid Dclaration des variables char chaine100 Chane saisie au clavier Saisie de la chane compter printfquotEntrez la chane quot scanfquotsquot chaine Affichage printfquotLa taille de la chane s est lunquot chaine ChaineLenchaine Fin du programme return 0 Fonction quotChaineLenquot unsigned long ChaineLen char ch Pointeur sur la chane reue Dclaration des variables unsigned long cpt Compteur de chane La fonction va incrmenter le pointeur reu jusqu ce que le caractre point soit gal 0 Heureusement que les octets dun tableau sont contigs en mmoire Heureusement que lun de ces octets vaut quot0quot pour permettre de trouver la fin cpt0 Tant que le point nest pas gal quot0quot while ch 0 Il est plus courant dutiliser 0 au lieu de 0 Incrment du compteur cpt Dcalage du pointeur ch On aurait pu crire toute cette boucle en une ligne quotfor cpt0 ch 0 cpt chquot On a perdu quotchquot le dbut de chane mais ce nest pas grave la fonction est finie Ici quotcptquot contient la longueur de la chane return cpt
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 73123 Ecrire une fonction qui compare deux chanes Elle doit renvoyer un nombre lt 0 si chane1 lt chane2 un nombre gt 0 si chane1 gt chane2 0 si les deux chanes sont gales tous ses octets gaux un un La valeur absolue du nombre renvoy doit correspondre la position du caractre qui diffre Prototype fonction quotChaineComparquot recevant deux chanes comparer long ChaineComparchar char Fonction principale du programme int mainvoid Dclaration des variables char chaine1100 Chane1 saisie au clavier char chaine2100 Chane2 saisie au clavier long res Rsultat comparaison Saisie de la chane1 printfquotEntrez la chane1 quot scanfquotsquot chaine1 Saisie de la chane2 printfquotEntrez la chane2 quot scanfquotsquot chaine2 Comparaison resChaineComparchaine1 chaine2 Affichage if res 0 printfquots identique snquot chaine1 chaine2 else if res gt 0 printfquots plus grand que s partir de lunquot chaine1 chaine2 res else printfquots plus petit que s partir de lunquot chaine1 chaine2 -res Fin du programme return 0 Fonction quotChaineComparquot long ChaineCompar char ch1 Pointeur sur la chane 1 comparer char ch2 Pointeur sur la chane 2 comparer Dclaration des variables unsigned long i Indice de boucle On considre quelles sont gales par dfaut et on cherchera une diffrence i0 do i quotiquot prend la position du caractre test if ch1 lt ch2 Si caractre ch1 lt caractre ch2 return -i Sortie de fonction avec position ngative
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 74123 if ch1 gt ch2 Si caractre ch1 gt caractre ch2 return i Sortie de fonction avec position positive while ch1 0 ampamp ch2 0 Tant que fin chane non atteinte quotchquot renvoie valeur quotchquot puis incrmente quotchquot Les deux chanes sont gales Sortie de fonction return 0 Recrire la fonction quotmainquot de lexercice prcdent mais en utilisant un tableau de deux chanes Fonction principale du programme int mainvoid Dclaration des variables char chaine2100 Tableau de deux chanes saisies au clavier unsigned short i Indice de boucle long res Rsultat comparaison Boucle de saisie for i0 i lt 2 i Saisie de la chane printfquotEntrez la chane hu quot i 1 scanfquotsquot chainei Comparaison resChaneComparchaine0 chaine1 Affichage if res 0 printfquots identique snquot chaine0 chaine1 else if res gt 0 printfquots plus grand que s partir de ulnquot chaine0 chaine1 res else printfquots plus petit que s partir de ulnquot chaine0 chaine1 -res Fin du programme return 0
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 75123 Ecrire une fonction qui renvoie le nom de base dun chemin Unix Le nom de base est tout ce qui suit le dernier quotquot slash Cas particulier Le nom de base de quotquot est quotquot Prototype fonction quotBaseNamequot recevant un nom Unix char BaseNamechar Fonction principale du programme int mainvoid Dclaration des variables char nom100 Nom saisi au clavier Saisie du nom printfquotEntrez le nom quot scanfquotsquot nom Affichage printfquotLe nom de base de s est snquot nom BaseNamenom Fin du programme return 0 Fonction quotBaseNamequot char BaseName char ch Pointeur sur le nom traiter Dclaration des variables char pt Second pointeur sur chane Cas particulier Le nom de base de quotquot est quotquot if ch0 ampamp ch1 0 return ch On ne sait pas combien de quotquot dans la chaine donc on commence par chercher le 0 final for ptch pt 0 pt ici quotptquot est positionn sur le 0 final dernier octet de la chane Recherche dun quotquot en faisant reculer quotptquot au maximum jusquau dbut de chane while pt gt ch ampamp pt Il faut tester quotptquot avant de tester quotptquot pt-- Ici soit quotptquot est sur le dernier quotquot soit quotptquot est juste avant le dbut de la chane Dans tous les cas il faut renvoyer ladresse qui suit quotptquot return pt 1 La variable renvoye quotpt 1quot tant de type quotchar toilequot la fonction est de type quotchar toilequot De plus mme si quotptquot arrive avant le dbut de quotchquot et passe donc dans une zone interdite comme on teste quotptquot avant de tester quottoile ptquot la boucle sarrtera avant que le programme ne plante
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 76123 11 Pointeur sur fonction a Gnralits Une fonction a aussi une adresse Il sagit de ladresse mmoire du dbut de son code dinstructions Puisque cette fonction a une adresse rien nempche de rcuprer cette adresse dans une variable Il suffit juste de savoir comment sappelle cette adresse et comment dfinir la variable Ladresse de la fonction est stocke dans une variable qui porte le nom de la fonction unsigned long carreshort nb return nb nb Examinons la mmoire Adresse Nom Contenu carre 0x1000 0x1000 carre Code de la fonction quotcarrequot Pour savoir comment dfinir la variable quotptquot devant recevoir ladresse quot0x1000quot il faut raisonner comme on la fait jusqu prsent quotptquot est un pointeur donc on aura forcment au moins une quottoilequot dans son nom De plus le langage a besoin de savoir ce quil y a quotptquot Donc il faut dfinir quotptquot pt est une fonction Cette fonction renvoie un quotunsigned longquot et reoit un quotshortquot Il en rsulte la syntaxe suivante unsigned long ptshort Attention Lemploi des parenthses autour de quottoile ptquot est obligatoire cause des priorits des oprateurs Si vous criviez quotunsigned long ptshortquot vous dclareriez une fonction nomme quotptquot recevant un quotshortquot et renvoyant un quotunsigned long toilequot pointeur sur un long non sign Alors que votre but est de dclarer un quotpointeur sur une fonction dont on ne connat pas le nomquot recevant un quotshortquot et renvoyant un quotunsigned longquot b A quoi a sert Il sagit en effet dutilisation avances du langage dont on peut se servir On lutilise dans le cadre de fonctions quotgnriquesquot ou quotuniversellesquot cest dire des fonctions qui font un traitement quelconque tri par exemple sur des lments non connus lors de la programmation du traitement Il faut bien se rappeler quon est dans un environnement de programmation coopratif Certains programmeurs crent des algorithmes que dautres utiliseront Comme les premiers ne savent pas sur quels objets sappliqueront leurs algorithmes ils se contentent de programmer le traitement gnral qui travaillera sur des objets quotgnriquesquot grace des pointeurs universels void Et les seconds ont ainsi leur disposition un algorithme utilisable pour leurs objets personnels Ils nont plus alors qu crer la fonction de traitement de leur objet puisquils connaissent leurs objets et passer un pointeur sur cette fonction lalgorithme gnral Ce dernier lorsquil sera excut pourra ainsi traiter chaque objet quil aura manipuler puisquil aura sa disposition ladresse de la fonction manipulatrice
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 77123 c Exemple Un exemple des plus connus des programmeurs du C est la fonction quotqsortquot qui utilise lalgorithme de tri rapide par pivots quick sort Cette fonction peut trier un tableau contenant nimporte quel type dlment Le programmeur qui dsire lutiliser doit juste passer la fonction le tableau ou ladresse du premier lment la fonction sait ainsi quoi trier le nombre dlments du tableau la fonction sait ainsi combien il faut trier la taille dun lment en octets la fonction peut donc permuter deux lments si besoin octet par octet un pointeur sur une fonction que doit crire lutilisateur de quotqsortquot Ce dernier connat les objets quil veut trier donc il sait les comparer Cette fonction a donc pour mission de comparer deux lments et doit imprativement recevoir un pointeur sur chacun des deux lments comparer renvoyer un quotintquot de valeur 1 0 ou 1 selon que llment 1 est plus petit gal ou plus grand que llment 2 Lexemple suivant va trier un tableau de 10 flottants Prototype fonction quotcomparquot recevant deux pointeurs sur deux flottants static int Compar float float Fonction principale du programme int mainvoid Dclaration des variables float tab10 Tableau de 10 flottants trier float pt Pointeur sur le tableau unsigned short i Indice de boucle Saisie des flottants for i0 pttab i lt 10 i pt printfquotEntrez le nombre hu quot i 1 scanfquotfquot pt Pas quotampptquot puisque quotptquot quotamptabiquot Tri du tableau Un seul appel suffit qsorttab 10 sizeoffloat Compar La fonction utilisera le pointeur sur quotComparquot pour comparer les lments du tableau Affichage du tableau tri for i0 pttab i lt 10 i pt printfquotLe nombre hu est fn quot i pt Fin du programme return 0 Fonction quotComparquot crire par le programmeur static int Compar float elem1 Elment 1 comparer float elem2 Elment 2 comparer Comparaison et renvoi if elem1 lt elem2 return -1 if elem1 gt elem2 return 1 return 0 Il suffit dinverser chaque test dingalit pour inverser le tri du tableau
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 78123 d Exercice Se mettre dans la peau dun programmeur n 1 et cr ire une fonction quotgnriquequot qui balaye un tableau dentiers Elle na pas besoin de savoir quoi faire de lentier balay car elle recevra en dernier paramtre un pointeur sur la fonction qui traite cet entier Fonction gnrique de balayage unsigned short Balaye int tab Pointeur sur le tableau balayer unsigned short nb Nombre dlments du tableau void pttrtunsigned short int Pointeur sur la fonction de traitement Dclaration des variables unsigned short i Indice de boucle Boucle sur le tableau for i0 i lt nb i Traitement de llment A programmer par celui qui utilisera cette fonction pttrti tabi Renvoi dune valeur qui peut tre utile facultatif return nb Se mettre dans la peau dun programmeur n 2 et uti liser la fonction crite prcdemment Prototype fonction quotTraitementquot recevant un entier court non sign et un entier static void Traitement unsigned short int Fonction principale int mainvoid Dclaration des variables unsigned short val Valeur quelconque static int tab1 2 3 4 5 6 7 8 9 10 Tableau traiter Balayage du tableau valBalayetab 10 Traitement printfquotMa fonction a balay hu lments de tabnquot val return 0 Fonction de traitement static void Traitement unsigned short ind Indice lment traiter int elem Elment traiter Affichage de llment printfquotElment hu dnquot ind 1 elem
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 79123 XI LES TYPES DERIVES Il sagit des types composs de types simples ou dautres types drivs 1 Les structures a Gnralits Une structure est une collection de donnes regroupes dans une mme entit logique Elles permettent de crer des types complexes partir de diffrents types dj connus et de les regrouper sous un mme nom Exemple Une date est compose dun jour dun mois et dune anne Il est donc plus judicieux si on veut grer plusieurs dates de crer une structure quotsdatequot et de grer plusieurs variables de cette structure unique Il est impossible de manipuler affecter comparer une structure dans son intgralit Les seules oprations permises sur les structures sont donc laccs ses membres les variables qui la composent si ces variables sont de type simple la rcupration de son adresse Par contre les membres dune structure sont utilisables comme nimporte quelle variable et sont donc manipulables comme tels condition que ces membres eux-mmes ne soient ni quottableauquot ni quotstructurequot Lorsquune structure est cre tous les membres de la structure ont des zones contigus en mmoire b Dfinition dune structure La dclaration dune structure se fait sous la forme suivante struct ltnom structgt type1 ltnom lment1gt ltnom lment2gt type2 ltnom lment3gt etc var1 var2 Le nom de la structure nest pas obligatoire Il permet simplement de nommer la structure afin de pouvoir rutiliser son format Dans ce cas la chane quotstruct ltnom structgtquot devient un type part entier quon peut utiliser avec un nom de variable pour crer une variable de ce type Les variables associes ne sont pas non-plus obligatoires On peut en effet crer une structure avec un nom dune part et dfinir ensuite des variables de cette structure dautre part Exemple struct sdate Cration dune structure pour grer la datequot unsigned char jj Jour de la date unsigned char mm Mois de la date unsigned short aa Anne de la date naissance Variable quotnaissancequot de type quotstruct sdatequot struct sdate jour Variable quotjourquot de type quotstruct sdatequot
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 80123 Linitialisation dune structure se fait comme pour un tableau Dailleurs comme pour ce dernier linitialisation globale ne peut se faire que lors de la dfinition de la variable De plus il est assez courant dassocier un nom de structure avec linstruction quottypedefquot Cela vite davoir crire le mot quotstructquot devant chaque variable que lon veut dclarer Exemple typedef struct Cration dune structure pour grer la datequot unsigned char jj Jour de la date unsigned char mm Mois de la date unsigned short aa Anne de la date char jour Chane correspondant au jour tdate Le type quottdatequot correspond cette structure Dfinition et initialisation dune variable tdate today Noubliez pas laccolade ouvrante quotquot 12 Cette valeur ira dans le champ quotjjquot 10 Cette valeur ira dans le champ quotmmquot 2006 Cette valeur ira dans le champ quotaaquot quotjeudiquot Ladresse de cette chane ira dans le champ quotjourquot Noubliez pas laccolade fermante quotquot Il est bien entendu possible dinclure des structures dans dautres structures Lcriture de tels ensembles peut se faire en une ou plusieurs tapes Dans ce dernier cas il faut alors dfinir la structure la plus quotintrieurequot avant de dfinir la structure la plus quotextrieurequot Exemple typedef struct long x y Abscisse et ordonne du point tpoint Type permettant de grer un point typedef struct tpoint bg Coin bas-gauche du carr long cote Cote du carr tcarre Type permettant de grer un carr tcarre trigo Cration variable quottrigoquot de type quottcarrequot 0 0 Coordonnes du coin bas-gauche 10 Ceci est son cot Variable quottrigoquot cre et initialise Il est plus judicieux de dclarer les structures de travail en dehors de tout bloc afin quelles soient connues de tout le programme Par contre le choix de la visibilit et de la dure de vie des variables structures reste la discrtion du programmeur
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 81123 c Laccs aux membres dune structure Laccs aux membres dune structure se fait avec loprateur quotquot un quotpointquot si on utilise une variable structure et par loprateur quot-gtquot un quotmoinsquot suivi dun quotsuprieurquot si on utilise un pointeur sur cette structure et ceci quel que soit le membre vis variable simple ou pointeur Bien entendu on peut aussi demander ladresse dun membre dune variable structure et ladresse dun membre dun pointeur sur cette variable Pour bien voir toutes les possibilits on va utiliser une structure permettant de grer un livre titre et taille Ce type comporte une variable simple la taille et un tableau qui est aussi un pointeur le titre typedef struct unsigned long size Taille du livre variable simple char titre20 Titre du livre pointeur tlivre type permettant de grer un livre tlivre bouquin Variable quotbouquinquot de type quottlivrequot tlivre ptampbouquin Pointeur quotptquot sur la variable quotbouquinquot En utilisant la variable quotbouquinquot Elment choisi Membre Accs au membre Accs ladresse du membre Taille du livre size Emploi de loprateur quotquot tout simplement bouquinsize Il suffit de rajouter un quotampquot devant laccs au membre ampbouquinsize quotx 1imequot lettre du titre titrex Emploi nouveau de loprateur quotquot tout simplement bouquintitrex Mais noublions pas les rgles dquivalence quottabx tab xquot ce qui donne aussi bouquintitre x Comme pour une variable simple ampbouquintitrex Mais noublions pas les rgles dquivalence quotamptabx tab xquot ce qui donne aussi bouquintitre x La chane correspondant au titre dans sa globalit titre Ce membre est utilis alors comme tout autre membre bouquintitre Comme pour une variable simple bien que cela soit peu courant car cela revient demander ladresse dune adresse ampbouquintitre En utilisant la variable quotptquot Elment choisi Membre Accs au membre Accs ladresse du membre Taille du livre size Il sagit du membre quotsizequot du point quotptquot ce qui donne ptsize Les parenthses quotptquot sont obligatoires cause de la priorit de loprateur quotquot Cette criture assez lourde est avantageusement remplace par loprateur quot-gtquot pt-gtsize Il suffit de rajouter un quotampquot devant laccs au membre amppt-gtsize quotx 1imequot lettre du titre titrex Comme pour quotsizequot sans oublier les rgles dquivalence pt-gttitrex pt-gttitre x Comme pour une variable simple sans oublier les rgles dquivalence amppt-gttitrex pt-gttitre x La chane correspondant au titre dans sa globalit titre Ce membre est utilis alors comme tout autre membre pt-gttitre Comme pour une variable simple bien que cela soit peu courant car cela revient demander ladresse dune adresse amppt-gttitre
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 82123 2 Les unions a Gnralits Lunion permet de dclarer des objets polymorphes objets qui peuvent changer de forme mais qui nont un moment donn quune forme et une seule Lunion permet de faire partager un mme emplacement mmoire par des variables de types diffrents Elle permet dconomiser des emplacements mmoire dinterprter de faons diffrentes un mme motif binaire Comme pour une structure il est impossible de manipuler affecter comparer une union dans son intgralit Les seules oprations permises sur les unions sont donc laccs ses membres la rcupration de son adresse Par contre les membres dune union sont utiliss comme nimporte quelle autre variable et sont donc manipulables comme tels condition que ces membres ne soient ni quottableauquot ni quotstructurequot ni quotunionquot Mais videmment comme tous les membres sont sur le mme emplacement mmoire on ne peut en utiliser quun seul la fois toute affectation dun membre crase tous les membres de lunion Lors de la dclaration de la variable lunion de donnes ne rserve en mmoire que la place ncessaire au stockage de la plus grande des entits quelle contient Mis part ces dtails on utilise une union exactement comme une structure b Dfinition dune union La dclaration dune union se fait sous la forme suivante union ltnom uniongt type1 ltnom lment1gt ltnom lment2gt type2 ltnom lment3gt etc var1 var2 c Laccs aux membres Laccs aux membres se fait comme pour les structures avec loprateur quotquot ou quot-gtquot selon quil sagisse dune variable ou dun pointeur sur une union Exemple union long nb Nombre format long char elem4 Chaque octet du nombre analyse Variable quotanalysequot permettant danalyser un quotlongquot Remplissage du nombre printfquotEntrez un nombre quot scanfquotldquot ampanalysenb Affichage de ses octets for i0 i lt 4 i printfquotLoctet hu vaut dnquot i 1 analyseelemi
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 83123 3 Les numrations Une numration est une liste de mots choisis par le programmeur qui seront alors associs des valeurs entires contantes enum ltnom enumgt mot1 valeur mot2 valeur var1 var2 La liste des mots spare par des virgules est choisie par le programmeur Si ce dernier ny associe pas de valeur celles-ci seront automatiquement cres par le compilateur partir de quot0quot et croissantes de quot1quot en quot1quot Il est bien sr possible de nassocier des valeurs particulires qu quelques mots et laisser le compilateur remplir les mots rests libres Cependant les valeurs associes aux mots ne sont pas modifiables dans le code des programmes Enfin deux mots distincts peuvent tre associs une mme valeur Les variables de type numr restent cependant des variables entires et sont manipulables comme tel Jusqu une certaine poque on ne pouvait utiliser les mots numrs quavec des variables du type numr correspondant Aujourdhui la norme accepte lutilisation dun mot numr dans toute variable de type entier Exemple Exemples dnumrations enum esemaine lundi1 mardi mercredi jeudi vendredi samedi11 dimanche enum eniveau bas500 moyen1000 haut1500 min500 max1500 Fonction principale int mainvoid Dclaration des variables enum esemaine jour Saisie et valuation du jour printfquotEntrez un nombre quot scanfquotdquot ampjour if jour samedi jour dimanche printfquotd correspond au week-endnquot jour else printfquotd correspond la semainenquot jour Fin du programme return 0 Lemploi de tels objets reste assez faible car il est possible dobtenir le mme rsultat en utilisant le pr processeur
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 84123 XII LE PRE PROCESSEUR Le pr processeur est la premire phase de la compilation Son rle est de transformer un source quotcquot du langage C en source quotiquot directement interprtable par le compilateur Mais le programmeur a sa disposition des directives pr processeur permettant de configurer et rgler la traduction du quotcquot en quotiquot 1 La directive quotdefinequot a Utilisation La directive quotdefinequot permet de crer des pseudo constantes et des pseudo fonctions Ce sont des chanes associes des valeurs ou des instructions et directement remplaces par celles-ci lors de la transformation du source quotcquot en quotiquot Ces chanes sont appeles quotmacro dfinitionquot et sont par convention crites en majuscules Exemple quotcquot define TAILLE 100 define CARREn n n int mainvoid int tabTAILLE int i for i0 i lt TAILLE i tabiCARREi Code gnr dans le quotiquot int mainvoid int tab100 int i for i0 i lt 100 i tabii i Il est possible dutiliser des macro dfinitions dans dautres macro dfinitions Exemple quotcquot define LIG 12 define COL 10 define SURFACE LIG COL define CARREn n n define CUBEx nCARREn int mainvoid int tabSURFACE int i for i0 i lt SURFACE i tabiCUBEi Code gnr dans le quotiquot int mainvoid int tab12 10 int i for i0 i lt 12 10 i tabii i i Lavantage des macro dfinitions est que si une des constantes doit changer pour volution le programmeur naura qu modifier la macro dfinition qui y est attribue et recompiler son programme Il naura ainsi quune seule modification apporter un seul endroit du source et cette modification sera rpercute dans tout le code lors de la recompilation La directive quotundefquot permet de supprimer les pseudo constantes ou pseudo fonctions cres quelques lignes plus haut Si la macro dfinition nexiste pas linstruction est simplement ignore du pr processeur
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 85123 b Les dangers - Les prcautions prendre Le principal danger de la directive quotdefinequot est lutilisation des pseudo fonctions dans des calculs et le rsultat de leurs traductions face aux priorits des oprateurs Exemple 1 define CARREn n n iCARRE2 3 Vous aimeriez avoir quoti25quot Traduction 1 i2 3 2 3 mais vous navez que quoti11quot La solution pour viter ce problme est dencadrer chaque pseudo paramtre par des parenthses quotquot Solution 1 define CARREn n n iCARRE2 3 Vous aimeriez avoir quoti25quot Rsultat 1 i2 3 2 3 et vous avez bien quoti25quot Les priorits sont aussi appliques sur la pseudo fonction et pas uniquement dans les paramtres Exemple 2 define SOMMEx y x y i2 SOMME1 2 Vous aimeriez avoir quoti6quot Traduction 2 i2 1 2 mais vous navez que quoti4quot La solution pour viter ce problme est dencadrer la pseudo fonction dans sa globalit par des parenthses quotquot sans oublier les parenthses sur les pseudo paramtres Solution 2 define SOMMEx y x y i2 SOMME1 2 Vous aimeriez avoir quoti6quot Rsultat 2 i2 1 2 et vous avez bien quoti6quot Le troisime danger se nomme quoteffet de bordquot et vient des oprateurs quotquot et quot--quot qui agissent directement sur la variable qui les utilise sans quil y ait besoin dexpliciter laffectation Exemple 3 define CARREn n n i5 jCARREi Vous aimeriez quoti6quot et quotj25quot Traduction 3 i5 ji i mais vous avez quoti7quot et quotj30quot Il ny a malheureusement aucune solution pour liminer ce danger Il ne reste donc qu lviter en ne mettant pas doprateur quotquot ou quot--quot dans les arguments passs aux pseudo fonctions car vous ne savez pas forcment le traitement quils vont subir Ceci implique que vous sachiez que vous tes en train dutiliser une pseudo fonction cest pourquoi les pseudo fonction et par extension toutes les macro dfinitions sont conventionnellement crites en majuscules Et afin davoir une certaine esthtique dans les macro dfinitions il est aussi dusage dcrire les pseudo constantes en majuscules et dy mettre des parenthses
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 86123 c Les macro dfinitions internes Le pr processeur possde 4 macro dfinitions internes utilisables par le programmeur sil le dsire LINE Constante dcimale non-signe dsignant le numro de la ligne sur laquelle elle se trouve FILE Chane dsignant le nom du fichier sur lequel le pr processeur est en train de travailler DATE Chane de la forme quotMmm jj aaaaquot contenant la date de transformation du quotcquot en quotiquot TIME Chane de la forme quothh mm ssquot contenant lheure de transformation du quotcquot en quotiquot Exemple int mainvoid printfquotCe programme a t compil le s s On est la ligne u du fichier snquot DATE TIME LINE FILE d Cration et suppression de macro dfinitions lors de la compilation Loption quot-Dmacrovaleurquot de la commande quotccquot permet de crer une macro dfinition lors de la compilation sans quelle soit forcment dfinie dans le fichier source Exemple de source int mainvoid int tabTAILLE La macro dfinition quotTAILLEquot nexiste pas Exemple de la commande de compilation associe cc DTAILLE50 progc o prog Loption quot-Umacroquot de la commande quotccquot permet de supprimer une macro dfinition lors de la compilation mme si elle est dfinie dans le fichier source
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 87123 2 La compilation conditionnelle Le pr processeur offre la possibilit dtablir une condition qui si elle nest pas respecte aura pour rsultat de ne pas traduire les lignes de code soumises la condition Ces dernires ne seront donc pas traites par le compilateur La directive quotifquot tabli la condition de compilation La directive facultative quotelifquot permet dtablir une nouvelle condition si la prcdente nest pas vrifie et la directive elle aussi facultative quotelsequot tabli un branchement traiter si aucune des conditions demandes nest vrifie La directive obligatoire quotendifquot termine le bloc de compilation conditionnelle Les conditions peuvent sappliquer sur la valeur des macro dfinitions et sur la valeur dinitialisation des variables Exemple define DEBUG 1 Flag de dbugging int mainvoid Dclaration des variables int debug1 Variable de dbugging Programmation if DEBUG 1 Si la macro vaut quot1quot printfquotEntre dans le quotmainquotnquot Affichage message de dbugging elif debug 1 Si la variable a t initialise 1 printfquotEntre dans le quotmainquotnquot Affichage message de dbugging else DEBUG 1 ampamp debug 1 Si rien na t vrifi printfquotOn naffiche riennquot On fait autre chose endif DEBUG 1 Fin de la compilation conditionnelle suite du code La directive quotifdefquot ou quotifndefquot permet de contrler lexistence ou la non-existence dune macro dfinition sans prsumer de sa valeur Ces deux directives peuvent galement tre suivies de la directive facultative quotelsequot mais se terminent obligatoirement par la directive quotendifquot Exemple define DEBUG 1 Flag de dbugging int mainvoid Dclaration des variables Variables diverses Programmation ifdef DEBUG Si la macro est dfinie printfquotEntre dans le quotmainquotnquot Affichage message de dbugging else DEBUG Si la macro nest pas dfinie printfquotOn naffiche riennquot On fait autre chose ou on ne fait rien endif DEBUG Fin de la compilation conditionnelle suite du code
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 88123 3 Linclusion des fichiers a Utilisation La directive quotincludequot insre lendroit o elle se trouve un fichier qui sera trait comme sil faisait partie du source Cette directive peut scrire de deux faons diffrentes include ltfichiergt avec les signes quotltquot et quotgtquot le pr processeur va chercher le fichier demand dans le rpertoire quotusrincludequot et il est possible de lui rajouter dautres rpertoires de recherche avec loption quot-I repquot de la commande quotccquot include quotfichierquot avec les guillemets quot on est oblig dindiquer le nom exact relatif ou absolu du fichier dans la machine En gnral ces fichiers tant inclus en dbut de source on les appelle des quotheadersquot fichiers den-tte et sont par convention nomms quotxxxhquot Ils contiennent en gnral des macro dfinitions des prototypes et des nouveaux types et leur but est de faciliter la maintenance dun projet o tous les sources incluant le mme fichier seront facilement modifiables si les conditions changent il suffira de modifier le fichier inclus et de recompiler tous les sources Remarque Il est possible si on dsire crire une fonction pour les autres programmeurs dcrire le code de cette fonction dans un fichier quotcquot et inclure ce fichier dans les autres programmes Mais cette mthode est contraire lthique du C car elle ne garanti plus la robustesse du code lauteur de la fonction nest pas certain que celle-ci nest pas modifie dans son utilisation Il vaut mieux pour cela crire le code de la fonction dans un source en faire un module objet quotoquot ou une librairie quotaquot crire ensuite le prototype de la fonction dans un en-tte quothquot et offrir aux autres programmeurs len-tte et le module objet ou la librairie qui va avec Ainsi personne ne pourra modifier le code de la fonction Exemple de dbut de programme quotprogcquot include ltfichier1hgt Sera pris dans quotusrincludequot include quotfichier2hquot Sera pris dans le rpertoire courant quotquot include quotincludefichier3hquot Sera pris dans quotincludequot include quothomeprogincludefichier4hquot Sera pris dans quothomeprogincludequot suite du code Exemple de compilation du programme quotprogcquot cc Ihomelocalinclude Iinclude progc o prog Le fichier quotfichier1hquot sera aussi cherch dans quothomelocalincludequot et dans quotincludequot Le fichier le plus utilis couremment est quotstdiohquot standards entres-sorties car il donne le prototype des fonctions dentres-sorties comme quotprintfquot ou quotscanfquot De plus il dfinit certaines macro dfinitions comme le pointeur quotNULLquot qui vaut quotvoid0quot cest dire quotzro transform en pointeur universelquot
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 89123 b Les dangers - Les prcautions prendre Le principal danger de linclusion de fichiers est dinclure un fichier quotxquot et un fichier quotyquot sans savoir que quotxquot inclut lui aussi quotyquot quotxquot a aussi le droit davoir des directives quotincludequot Ce danger se nomme quotidempotencequot Cela peut provoquer de simples avertissements lors de la compilation si la mme macro dfinition est vue deux fois par le compilateur mais aussi des erreurs de compilation si le mme prototype de fonction est vu deux fois Pour se prvenir de ce danger il est ncessaire dutiliser la compilation conditionnelle en utilisant une macro dfinition en sentinelle En gnral la macro dfinition porte le nom du fichier dans lequel elle se trouve Exemple dun fichier quotfichier1hquot ifndef FICHIER1H Test sur la non-existence de cette macro dfinition define FICHIER1H Cration de la macro dfinition dfinition de tous les prototypes et macro contenues dans le fichier 1 include ltfichier2hgt Inclusion fichier2 endif FICHIER1H Fin du test concernant cette macro dfinition Exemple dun fichier quotfichier2hquot ifndef FICHIER2H Test sur la non-existence de cette macro dfinition define FICHIER2H Cration de la macro dfinition dfinition de tous les prototypes et macro contenues dans le fichier 2 endif FICHIER2H Fin du test concernant cette macro dfinition Exemple de dbut de programme quotprogcquot include ltfichier1hgt Demande dinclusion de quotfichier1hquot include ltfichier2hgt Demande dinclusion de quotfichier2hquot Le programmeur ne sait pas que quotfichier1hquot inclut dj quotfichier2hquot suite du code Rsultat de la traduction par le pr processeur Premire ligne du programme quotinclude ltfichier1hgt ifndef FICHIER1H Non-existence de cette macro dfinition gt vrai define FICHIER1H Cration de la macro dfinition dfinition de tous les prototypes et macro contenues dans le fichier 1 Inclusion de quotfichier2quot ifndef FICHIER2H Non-existence de cette macro dfinition gt vrai define FICHIER2H Cration de la macro dfinition dfinition de tous les prototypes et macro contenues dans le fichier 2 endif FICHIER2H endif FICHIER1H Seconde ligne du programme quotinclude ltfichier2hgt ifndef FICHIER2H Non-existence de cette macro dfinition gt faux define FICHIER2H Ce code ne sera pas retrait pas de redfinition des prototypes et macro dj dfinies et donc dj connues endif FICHIER2H suite du code
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 90123 4 La gestion des chanes Loprateur quotquot remplace la chane qui le suit par une chane entre guillemets jusquau premier espace rencontr Cela permet de traiter comme chane des lments tels que des nombres Exemple define CHAINEx x int mainvoid printfquotLa longueur du nombre 12 est dnquot strlen12 Loprateur quotquot forme une chane de caractres partir de plusieurs termes concatnation Le mot obtenu peut tre ensuite utilis comme identificateur Exemple define INDICEx varx int mainvoid int var1 var2 var3 int i for i1 i lt 3 i vari0 quotvariquot sera remplac par var1 var2 var3 5 Les autres directives La directive quoterror messagequot demande au compilateur darrter la compilation en affichant le message comme sil y avait une erreur dans le programme source Cest utilis surtout avec la compilation conditionnelle si la non-vrification de la condition rend inutile de poursuivre la compilation Exemple ifndef UNIX Si quotUNIXquot nest pas dfini ifndef LINUX Si quotLINUXquot nest pas dfini error Ce source ne fonctionne que sur Unix ou Linux endif LINUX Fin du test sur quotLINUXquot endif UNIX Fin du test sur quotUNIX suite du code La directive quotpragmaquot permet de donner des ordres spcifiques au pr processeur Son utilisation est dpendante du pr processeur utilis et on doit se rfrer la documentation spcifique de chaque compilateur pour connatre les directives possibles
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 91123 XIII LES PARAMETRES DE quotMAINquot 1 Explication main est une fonction comme une autre Elle reoit donc des paramtres et renvoie une valeur int main int argc char argv char envp Explication des paramtres int argc vient de quotargument countquot Nombre darguments passs au programme y compris le nom du programme lui-mme Il sensuit que cette variable ne peut jamais tre zro Rappel Les arguments passs un programme sont des lments sur le quel il doit travailler ex cp fic1 fic2 gt quotcpquot est le programme quotfic1quot est son 1er argument quotfic2 est son second argument char argvvient de quotargument valuequot Pointeur vers un tableau de pointeurs chacun de ceux-ci pointant vers un tableau de caractres au format chane tableau contenant plusieurs caractres dont le dernier de valeur zro Chaque chane contiendra le nom de largument pass au programme De plus quotargv0quot contiendra le nom du programme lui-mme qui est considr comme le premier des arguments Enfin le tableau quotargvquot contiendra un pointeur supplmentaire de valeur nulle On remarquera que cette valeur nulle se trouve dans la variable quotargvargcquot Cette valeur nulle peut donc servir de condition darrt dans une boucle la place de quotargcquot char envpvient de quotenvironment programquot De mme format que quotargvquot cette variable pointe vers un tableau de chanes de caractres Chaque chane contiendra la valeur de chaque variable denvironnement qui a t exporte par un des processus ascendants dans le monde UNIX et donc accessible au programme Cette chane est de la forme quotvariablevaleurquot De mme que pour quotargvquot un dernier pointeur de ce tableau a pour valeur quotzroquot Il est heureux que ce soit le cas car sinon le programmeur naurait aucun moyen de sarrter dans le cas dun balayage des variables denvironnement Valeur renvoye int un entier utilisable par le processus appelant le programme rcupr par la variable quot quoten shell Unix
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 92123 2 Schma Exemple dappel dun programme quotprogquot avec 3 arguments prog toto titi tata Image de la mmoire ce moment l Adresse Nom Contenu 0x1000 argc 4 nb arguments nom du programme 0x1 etc variables quelconques 0x2000 argv 0x5000 0x2 etc variables quelconques 0x5000 argv0 0x6000 0x5004 argv1 0x7000 0x5008 argv2 0x9000 0x500C argv3 0xA000 0x5010 argv4 0 fin des arguments 0x5 etc variables quelconques 0x6000 argv00 p 0x6001 argv01 r 0x6002 argv02 o 0x6003 argv03 g 0x6004 argv04 0 0x6 etc variables quelconques 0x7000 argv10 t 0x7001 argv11 o 0x7002 argv12 t 0x7003 argv13 o 0x7004 argv14 0 0x7 etc variables quelconques 0x9000 argv20 t 0x9001 argv21 i 0x9002 argv22 t 0x9003 argv23 i 0x9004 argv24 0 0x9 etc variables quelconques 0xA000 argv30 t 0xA001 argv31 a 0xA002 argv32 t 0xA003 argv33 a 0xA004 argv34 0 0xA etc variables quelconques
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 93123 3 Exemple Exemple permettant de traiter les arguments Fonction principale du programme int main int argc Nombre darguments passs au programme char argv Liste des arguments passs au programme char envp Environnement de travail du programme Dclaration des variables int i Indice de boucle sur quotargvquot ou quotenvpquot char pt Pointeur de boucle sur quotargvquot ou quotenvpquot Affichage du nom du programme et du nombre darguments reus printfquotLe programme s a reu u argumentsnquot argv0 argc Si ce programme a reu des arguments en dehors de son nom if argc gt 1 On va afficher les arguments printfquotLes arguments pass au programme sont quot Une boucle sur le nombre darguments for i1 i lt argc i printfquottArgument uu ltsgtnquot i 1 argc argvi La mme boucle sur quotargvquot mais en utilisant un pointeur boucle plus rapide for i1 ptargv i lt argc i pt printfquottArgument uu ltsgtnquot i argc pt else Il ny a aucun argument et on le dit printfquotEn dehors de son nom ltsgt ce programme na aucun argumentnquot argv0 On va afficher lenvironnement du programme printfquotLenvironnement que peut rcuprer le programme est quot Une boucle sur envpi jusqu trouver quot0quot for i0 envpi NULL envp printfquottVariable u ltsgtnquot i 1 envpi La mme boucle sur quotenvpquot mais en utilisant un pointeur boucle plus rapide for ptenvp i0 pt NULL pt i printfquottVariable u ltsgtnquot i 1 pt Fin du programme return 0
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 94123 XIV LA BIBLIOTHEQUE STANDARD Ce chapitre va faire un rapide descriptif des fonctions les plus usites offertes aux programmeurs et disponibles dans de la librairie standard quotusrliblibcaquot automatiquement lie par le compilateur Unix quotccquot ou quotgccquot 1 Gestion de la mmoire a Fonctions de rservation et de libration de zones mmoires Les fonctions malloc calloc et realloc permettent respectivement dallouer une zone mmoire de faon dynamique quand la taille allouer nest pas connue du programmeur allouer la zone mmoire en initialisant tous ses octets zro et rallouer une zone mmoire avec une taille diffrente le plus souvent suprieure de lallocation prcdente Ces fonctions servent lorsquon veut crer des tableaux dont on ne connat pas la taille lavance Cette allocation rserve une zone en mmoire principale du programme Donc mme si lallocation se fait lintrieur dune fonction la zone alloue sera disponible dans tout le reste du programme pour peu que celui-ci connaisse ladresse de la zone alloue cette adresse peut par exemple tre renvoye par la fonction qui ralise lallocation include ltsystypeshgt Cration de nouveaux types include ltstdlibhgt Utilisation des librairies standard void malloc sizet Gsize void calloc sizet nb sizet Esize void realloc void ptr sizet Gsize Explication des paramtres sizet Gsize La taille globale en octets de la mmoire demande sizet nb Le nombre dlments demands sizet Esize La taille en octets dun lment de la zone void ptr Pointeur sur la zone rallouer Valeur renvoye void Pointeur sur la zone alloue si la mmoire est disponible NULL si une erreur sest produite ou sil ny a pas assez de mmoire disponible La fonction free libre une zone mmoire alloue par quotmallocquot quotcallocquot ou quotreallocquot Il est impratif de librer toutes les zones alloues quand elles deviennent inutiles surtout pour un programme tournant sous Windows car dans le cas contraire la zone alloue nest plus jamais libre mme quand le programme sarrte et il est alors ncessaire de redmarrer lordinateur si on veut rcuprer la mmoire perdue par lallocation include ltstdlibhgt Utilisation des librairies standard void free void ptr Explication des paramtres void ptr pointeur sur la zone librer
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 95123 b Fonctions de manipulation de zones mmoires La fonction memcmp permet de comparer deux zones mmoires La comparaison se fera octet par octet jusqu ce quil y ait une diffrence ou jusqu ce que le nombre doctets comparer soit atteint include ltmemoryhgt Manipulations mmoires int memcmp void mem1 char mem2 sizet n Explication des paramtres void mem et void mem2 pointeur sur les zones comparer sizet n Le nombre doctets sur lesquels se fera la comparaison Valeur renvoye int Ces fonctions renvoient trois types de valeur Une valeur infrieure zro si quotmem1quot est plus petit que quotmem2quot Une valeur gale zro si quotmem1quot est gal quotmem2quot Une valeur suprieure zro si quotmem1quot est plus grand que quotmem2quot Les fonctions memset et memcpy permettent respectivement dinitialiser chaque octet dune zone mmoire avec une valeur spcifique et de copier une zone mmoire dans une autre include ltmemoryhgt Manipulations mmoires void memset void ptr int val sizet n void memcpy void dest void src sizet n Explication des paramtres void ptr Pointeur sur la zone mmoire remplir int val Valeur mettre dans chaque octet de la zone mmoire void dest Pointeur sur la zone mmoire de destination void src Pointeur sur la zone mmoire source sizet n Nombre doctets traiter Valeur renvoye void Ces fonctions renvoient un pointeur sur la zone mmoire modifie ptr ou dest La fonctions memchr permet de rechercher une valeur code sur un octet caractre dans une zone mmoire include ltmemoryhgt Manipulations mmoires void memchr void ptr int val sizet n Explication des paramtres void ptr Pointeur sur la zone mmoire examiner int val Valeur chercher sizet n Nombre doctets traiter Valeur renvoye char pointeur sur la zone o se trouve le caractre cherch sil est prsent NULL si le caractre cherch ne sy trouve pas
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 96123 c Exemple Faire un programme qui permette denregistrer dans un tableau autant de nombres que lutilisateur voudra Tant que lutilisateur saisi un nombre le programme le stocke et gre son tableau de stockage pour pouvoir toujours avoir suffisemment de place include ltstdiohgt IO bufferises define SZALLOC 10 Taille allocation mmoire Dclaration des structures utiles typedef struct float elem Tableau de stockage des nombres float ptr Ptr de balayage unsigned long nb Nb lments du tableau unsigned long size Taille alloue au tableau unsigned long ind Indice de balayage ttableau Type global du tableau Fonction principale du programme int mainvoid Dclaration des variables float saisie Nombre saisi ttableau tabNB Tableau de stockage dynamique Initialisation tabNBnb0 tabNBsizeSZALLOC if tabNBelemfloatmalloctabNBsize sizeoffloat NULL Lallocation a chou On quitte le programme printfquotErreur allocation lunquot tabNBsize sizeoffloat exit1 Boucle de saisie while1 printfquotEntrez le nombre stocker 0 pour quitter quot scanfquotf ampsaisie if saisie 00 break Sortie de la saisie On vrifie si lindice du tableau a atteint sa taille alloue if tabNBnb tabNBsize On agrandit la taille alloue de quotnquot lments tabNBsizeSZALLOC On ralloue le tableau et on vrifie lallocation if tabNBelemfloatrealloctabNBelem tabNBsize sizeoffloat NULL La rallocation a chou On quitte le programme printfquotErreur rallocation lunquot tabNBsize sizeoffloat exit1 On stoce le nombre saisi dans sa place qui est disponible tabNBelemtabNBnbsaisie On prpare lindice pour la saisie suivante
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 97123 tabNBnb Rcapitulatif du contenu de quottabNBquot ce point du programme elem contient ladresse du dbut du tableau nb contient son nombre dlments size contient sa taille alloue ind et ptr ne sont pas encore utiliss On affiche les nombres saisis for tabNBind0 tabNBptrtabNBelem tabNBind lt tabNBnb tabNBind tabNBptr printfquotLe nombre lu vaut fnquot tabNBind 1 tabNBptr On na plus besoin du tableau Le programme est fini if tabNBelem NULL freetabNBelem Fin du programme return 0
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 98123 2 Gestion des caractres Ces fonctions ont pour but de manipuler les caractres a Fonctions de vrification de la catgorie du caractre Liste des fonctions de vrification en vrac include ltctypehgt Gestion des caractres int isalnum char c Vrai si quotcquot est alphanumrique lettre ou chiffre int isalpha char c Vrai si quotcquot est alphabtique sans accent int isascii char c Vrai si quotcquot est au standard ASCII entre 0 et 127 int isblank char c Vrai si quotcquot est blanc espace ou tabulation int iscntrl char c Vrai si quotcquot est caractre de contrle entre 1 et 26 int isdigit char c Vrai si quotcquot est un chiffre dcimal int isgraph char c Vrai si quotcquot est imprimable non quotblancquot int islower char c Vrai si quotcquot est une minuscule sans accent int isprint char c Vrai si quotcquot est imprimable quotblancquot compris int ispunct char c Vrai si quotcquot est caractre de ponctuation int isspace char c Vrai si quotcquot est caractre despacement int isupper char c Vrai si quotcquot est une majuscule int isxdigit char c Vrai si quotcquot est un chiffre hexadcimal b Fonctions de modification de la catgorie de caractre Liste des fonctions de modification en vrac include ltctypehgt Gestion des caractres int toascii char c Transforme quotcquot en ASCII standard entre 0 et 127 int toupper char c Transforme quotcquot en majuscule accent conserv int tolower char c Transforme quotcquot en minuscule Remarque Malgr le type int de ces fonctions elles renvoient bien un caractre cest dire un nombre compris entre 0 et 128 c Dangers Dans beaucoup de vieux systmes ces fonctions dcrites comme telles ne sont en fait que des macro dfinitions preuve que les conventions ne sont pas toujours respectes mme par ceux qui les ont instaures utilisant plusieurs fois le caractre pass en paramtre ce qui peut donc gnrer des erreurs difficilement dcelables si on les utilise avec les oprateurs quotquot ou quot--quot effets de bord
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 99123 3 Gestion des chanes de caractres Toutes ces fonctions obissent aux rgles suivantes Chaque tableau de caractres qui est pass la fonction doit contenir la valeur 0 permettant de reprer la fin du tableau Chaque tableau de caractres crit par la fonction contiendra la valeur 0 stock par cette dernire sauf dans les cas particulier des fonctions quotstrncpyquot et quotstrndupquot Chaque pointeur ventuellement renvoy par la fonction pointera sur un tableau de caractres contenant aussi la valeur 0 positionne par la fonction Ces rgles sont la base des techniques de manipulation de chanes de caractres en langage C noubliez pas quune chane de caractres nest quun tableau de caractres dlimit par la valeur 0 La fonction strlen permet de compter la longueur dune chane de caractres La fonction cherche et calcule la position du 0 dans le tableau de caractres reu en argument et renvoie cette position do lutilit que le programmeur soit certain que ce 0 soit bien prsent dans le tableau envoy la fonction Il est important de faire la distinction entre loprateur sizeof qui renvoie la taille globale dune zone mmoire et la fonction strlen qui indique combien on trouve de caractres situs avant le 0 terminant la chane Sur un quotchar chaine100quot loprateur sizeof renverra 100 alors que la fonction strlen renverra le nombre de caractres situs avant le caractre spcial 0 include ltstringhgt Gestion des chanes de caractres int strlen char ch Explication des paramtres char ch La chane dont on dsire connatre la longueur Valeur renvoye int La longueur de la chane Les fonctions strcmp et strncmp permettent de comparer deux chanes de caractres La comparaison se fera octet par octet jusqu ce quil y ait une diffrence et la fonction strncmp ne fera la comparaison que sur les quotnquot premiers octets include ltstringhgt Gestion des chanes de caractres int strcmp char ch1 char ch2 int strncmp char ch1 char ch2 sizet n Explication des paramtres char ch1 et char ch2 Les deux chanes comparer sizet n le nombre de caractres sur lesquels se fera la comparaison Valeur renvoye int Ces fonctions renvoient trois types de valeur Une valeur infrieure zro si quotch1quot est plus petit que quotch2quot Une valeur gale zro si quotch1quot est gal quotch2quot Une valeur suprieure zro si quotch1quot est plus grand que quotch2quot
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 100123 Les fonctions strcpy strncpy strcat et strncat permettent respectivement de copier une chane dans une autre copier seulement les quotnquot premiers caractres dune chane dans une autre concatner une chane la suite dune autre et de concatner seulement les quotnquot premiers caractres dune chane la suite dune autre Les fonctions strdup et strndup permettent tout comme comme le font strcpy et strncpy de copier une chane dans une autre ou de copier seulement les quotnquot premiers caractres dune chane dans une autre cependant elles assurent en plus lallocation mmoire suffisante pour recevoir la chane dorigine ce que ne font pas les fonctions strcpy et strncpy Il sagit en fait dun mixage des fonctions malloc et strcpy Bien entendu il est ncessaire en fin dutilisation des zones mmoires cres de les librer par un appel la fonction free Attention Les fonctions strncpy et strndup ne mettront le 0 final dans la chane de destination que si elles ont copi toute la chane source Inversement si la chane source fait plus des quotnquot caractres demands pour la copie les fonctions ne rajouteront pas le 0 dans la chane de destination include ltstringhgt Gestion des chanes de caractres char strcpy char dest char src char strncpy char dest char src sizet n char strcat char dest char src char strncat char dest char src sizet n char strdup char src char strndup char src sizet n Explication des paramtres char dest La chane de destination qui doit avoir la place de recevoir ce que la fonction lui mettra plus le caractre 0 char src La chane source qui doit contenir le caractre 0 sizet n le nombre de caractres pris de la chane source Valeur renvoye char Ces fonctions renvoient un pointeur sur la chane de destination Les fonctions strchr strrchr et strstr permettent respectivement de recherche un caractre dans une chane en partant du dbut ou en partant de la fin de la chane et de rechercher une sous-chane contenue dans une chane include ltstringhgt Gestion des chanes de caractres char strchr char ch int carac char strrchr char ch int carac char strstr char ch char sousch Explication des paramtres char ch La chane de recherche qui doit contenir le caractre 0 int carac Le caractre rechercher converti en entier mais cela na pas dimportance puisque lentier a un codage plus grand que le caractre char sousch La sous-chane rechercher qui doit contenir le caractre 0 Valeur renvoye char Ces fonctions renvoient un pointeur sur le caractre trouv ou un pointeur sur le dbut de la sous-chane trouve
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 101123 Les fonctions strcspn et strcspnr renvoient le nombre de caractres dune chane qui contient respectivement que des caractres dune sous-chane ou aucun des caractres dune sous-chane include ltstringhgt Gestion des chanes de caractres sizet strspn char ch char accept sizet strcspn char ch char reject Explication des paramtres char ch La chane de recherche qui doit contenir le caractre 0 char accept La sous-chane des caractres accepts qui doit contenir le caractre 0 char reject La sous-chane des caractres rejets qui doit contenir le caractre 0 Valeur renvoye sizet Ces fonctions renvoient le nombre de caractres dbutant la chane et correspondants la demande La fonction strpbrk recherche la premire occurrence dun des caractres de la sous-chane dans une chane include ltstringhgt Gestion des chanes de caractres char strpbrk char ch char sousch Explication des paramtres char ch La chane de recherche qui doit contenir le caractre 0 char sousch La sous-chane des caractres cherchs qui doit contenir le caractre 0 Valeur renvoye char La fonction renvoie un pointeur sur le premier caractre de la sous-chane trouv dans la chane La fonction fnmatch permet de vrifier si une chane correspond un motif pouvant contenir des mta caractres shell include ltfnmatchhgt Gestion des motifs ressemblants int fnmatch char motif char ch int flag Explication des paramtres char motif Le motif de recherche qui doit contenir le caractre 0 char ch La chane vrifier qui doit contenir le caractre 0 int flag Flag modifiant le comportement de la fonction Celui-ci peut tre compos au moyen dun quotou bit bitquot dune ou plusieurs des trois constantes suivantes FNMPATHNAME les caractres slashes quotquot ne sont pas mis en comparaison avec le motif utilis si on cherche mettre en correspondance des noms de fichiers FNMPERIOD Le caractre point quotquot sil se trouve en dbut de la chane ne sera pas mis en comparaison avec le motif utilis aussi pour les noms de fichiers FNMQUOTE Les quotes ou doubles-guillemets quotquotquot ne seront pas mis en comparaison avec le motif permet dutiliser des mta caractres en tant que caractres simples
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 102123 Les fonctions atoi atol et atof convertissent une chane de caractres reprsentant un nombre ex quot128quot en nombre correspondant Chaque fonction renverra respectivement un nombre de type quotintquot un nombre de type quotlongquot ou un nombre de type quotdoublequot Lors de la conversion chaque fonction sarrte ds quelle rencontre un caractre quelle ne sait pas traduire en nombre include ltstdlibhgt Fonctions de la librairie standard int atoi char ch long atol char ch double atof char ch Explication des paramtres char ch La chane contenant le nombre convertir qui doit contenir le caractre 0 Valeur renvoye int long ou double Le nombre correspondant la chane dans la prcision de la fonction utilise Les fonctions strtol strtoul et strtod convertissent une chane de caractres reprsentant un nombre dans une base quelconque ex quot0x128quot en nombre correspondant dans la base dsire Chaque fonction renverra respectivement un nombre de type quotlongquot un nombre de type quotunsigned longquot ou un nombre de type quotdoublequot Lors de la conversion chaque fonction sarrte ds quelle rencontre un caractre quelle ne sait pas traduire et il est possible de lui faire remplir une zone avec les erreurs quelle a pu rencontrer include ltstdlibhgt Fonctions de la librairie standard long strtol char ch char err int base unsigned long strtoul char ch char err int base double strtod char ch char err Explication des paramtres char ch La chane contenant le nombre convertir qui doit contenir le caractre 0 char err La zone destine recevoir les erreurs rencontres Il est possible de ne pas utiliser ce paramtre en y mettant la constante quotNULLquot int base base de conversion Celle-ci peut-tre comprise entre 2 et 32 Passer la valeur quot0quot demande la fonction de convertir en base quot10quot par dfaut Valeur renvoye int long ou double Le nombre correspondant la chane dans la base demande Les fonctions sscanf et sprintf ont pour but daller respectivement extraire des valeurs et les stocker dans des variables partir dune chane ou dune variable dj existante et crire des chanes formates dans une variable cr pour loccasion include ltstdiohgt IO bufferises int sscanf char pt int sprintf char pt Explication des paramtres char pt chane de caractres destine fournir des valeurs sscanf ou rcuprer ce qui est crit sprintf format de saisie ou daffichage correspondant aux fonctions quotscanfquot et quotprintfquot Valeur renvoye int Le nombre doctets lus ou crits dans la chane 0 si rien na t fait format de saisie non trouv ou si une erreur sest produite
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 103123 4 Gestion des fichiers mode buffer a Fonctions douverture et de fermeture de fichiers La fonction fopen demande au systme douvrir un fichier normal afin dy accder lire ou crire Cette fonction utilise en paramtre un nom de fichier et renvoie un pointeur sur un type quotFILEquot dont la structure est dfinie dans le fichier quotusrincludestdiohquot Ce pointeur sera ensuite lunique rfrence concernant le fichier quil faudra utiliser Toutes les oprations de lectures et dcritures seront buffrises cest dire gardes en mmoire pour optimiser les accs disque include ltstdiohgt IO bufferises FILE fopen char nom char mode Explication des paramtres char nom chane de caractres contenant le nom du fichier ouvrir char mode chane de caractres contenant le mode douverture demand Cette chane peut tre quotrquot le fichier est ouvert en lecture seule quotwquot le fichier est vid puis ouvert en criture quotaquot le fichier est ouvert pour criture en fin de fichier quotrquot le fichier est ouvert en lecture avec possibilit dcriture quotwquot le fichier est vid puis ouvert en criture avec possibilit de lecture quotaquot le fichier est ouvert pour criture en fin de fichier mais possibilit de lecture Remarque Dans le monde Windows ces modes douverture ne sappliquent que pour des fichiers ascii ou quotfichiers textequot Dans le cas dune ouverture dun fichier quotbinairequot chaque chane du mode doit inclure la lettre quotbquot Ce distingo nexiste pas dans le monde Unix Valeur renvoye FILE pointeur du fichier ouvert Ce pointeur servira de rfrence ultrieure chaque fois quil faudra accder au fichier Macro dfinition quotNULLquot si le fichier na pas pu tre ouvert pour une raison quelconque La fonction fclose ferme un fichier ouvert pralablement par fopen Si des donnes sont encore en attente dcriture sur disque le tampon est vid et les donnes sont crites physiquement sur le fichier disque include ltstdiohgt IO bufferises int fclose FILE pt Explication des paramtres FILE pt pointeur du fichier renvoy par la fonction fopen Valeur renvoye int 0 si toute lopration se passe correctement Macro dfinition quotEOFquot dans le cas contraire Remarque Chaque programme en excution possde intrinsquement trois pointeurs sur un type FILE ouverts et ferms automatiquement par le systme au dmarrage et la terminaison du programme ne ncessitant donc pas dappel quotfopenquot ou quotfclosequot et associs aux priphriques de travail stdin tampon associ au clavier stdout tampon associ aux affichages des messages normaux du programme stderr tampon associ aux affichages des messages derreur du programme
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 104123 b Fonctions de lecture et dcriture Les fonctions fgetc getc fputc et putc ont pour but daller respectivement lire et crire un octet dans un fichier pralablement ouvert avec la fonction fopen Les fonctions getc et putc diffrent de leurs homologues par le fait que ce sont des macro dfinitions Elles sexcutent donc plus rapidement que leurs homologuent mais peuvent gnrer des effets de bord si elles sont mal utilises include ltstdiohgt IO bufferises int fgetc FILE pt int getc FILE pt int fputc int carac FILE pt int putc int carac FILE pt Explication des paramtres int carac caractre crire transform par la fonction en quotunsigned charquot FILE pt pointeur du fichier renvoy par la fonction fopen Valeur renvoye int Caractre lu ou crit par la fonction converti en quotintquot Macro dfinition quotEOFquotsil ny a plus rien lire ou si une erreur sest produite Les fonctions getchar et putchar ont pour but daller respectivement lire et crire un octet dans le tampon clavier ou cran include ltstdiohgt IO bufferises int getchar void int putchar int carac Explication des paramtres int carac caractre crire transform par la fonction en quotunsigned charquot Remarque Ces fonctions sont des macro dfinitions correspondantes fgetcstdin et fputccarac stdout La fonction ungetc replace un caractre dans un tampon ce qui rend ce caractre de nouveau disponible pour une relecture ultrieure include ltstdiohgt IO bufferises int ungetc int carac FILE pt Explication des paramtres int carac caractre replacer dans le tampon transform par la fonction en quotunsigned charquot FILE pt pointeur du fichier renvoy par la fonction fopen
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 105123 Les fonctions fgets et fputs ont pour but daller respectivement lire et crire une chane de caractres dans un fichier pralablement ouvert avec la fonction fopen include ltstdiohgt IO bufferises char fgets char ch int taille FILE pt int fputs char ch FILE pt Explication des paramtres char ch zone permettant de stocker la chane lue ou contenant la chane crire La fonction quotfgetsquot rajoutera elle-mme le caractre 0 en fin de chane stocke et la fonction quotfputsquot sattend recevoir une chane donc un tableau de caractres ayant une des valeurs 0 int taille taille maximale de la zone en octets La lecture sarrtera quottaille 1quot pour pgarder une place pour le caractre 0 ou si elle rencontre un caractre n FILE pt pointeur du fichier renvoy par la fonction fopen Valeur renvoye par fputs int Nombre de caractres crits Macro dfinition quotEOFquotsi une erreur sest produite Valeur renvoye par fgets char Pointeur vers la zone de stockage correspond la variable quotchanequot Constante quotNULLquot si une erreur sest produite Les fonctions gets et puts ont pour but daller respectivement lire et crire une chane de caractres dans dans le tampon clavier ou cran include ltstdiohgt IO bufferises char gets char ch int fputs char ch Explication des paramtres char ch zone permettant de stocker la chane lue ou contenant la chane crire La fonction quotgetsquot rajoutera elle-mme un caractre n fin de ligne et le caractre 0 en fin de chane stocke et la fonction quotputsquot sattend recevoir une chane donc un tableau de caractres ayant une des valeurs 0 Valeur renvoye par puts int Nombre de caractres crits Macro dfinition quotEOFquotsi une erreur sest produite Valeur renvoye par gets char Pointeur vers la zone de stockage correspond la variable quotchanequot Constante quotNULLquot si une erreur sest produite Remarque La fonction quotgetsquot est trs dangereuse utiliser du fait quelle ne limite pas la taille de la chane saisie alors que la zone de stockage a une taille forcment limite
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 106123 Les fonctions fread et fwrite ont pour but daller respectivement lire et crire des octets dans un fichier pralablement ouvert avec la fonction fopen include ltsystypeshgt Cration de nouveaux types include ltstdiohgt IO bufferises sizet fread void buffer sizet taille sizet nb FILE pt sizet fwrite void buffer sizet taille sizet nb FILE pt Explication des paramtres void buffer pointeur vers une zone mmoire dans laquelle seront rangs ou pris les caractres lus ou crits du fichier sizet taille taille en octets dun lment lire ou crire sizet nb nombre dlments lire ou crire FILE pt pointeur du fichier renvoy par la fonction fopen Valeur renvoye sizet dfini dans quotsystypeshgtquot Le nombre dlments rellement lus ou crits dans le fichier sil y en a Ce nombre peut tre infrieur nb par exemple si on demande de lire plus que ce quil ny a mais jamais suprieur 0 sil ny a plus rien lire ou si une erreur sest produite Les fonctions fscanf et fprintf ont pour but daller respectivement saisir des variables partir dun fichier et crire des chanes formates dans un fichier pralablement ouvert avec la fonction fopen include ltstdiohgt IO bufferises int fscanf FILE pt int fprintf FILE pt Explication des paramtres FILE pt pointeur du fichier renvoy par la fonction fopen format de saisie ou daffichage correspondant aux fonctions quotscanfquot et quotprintfquot Valeur renvoye int Le nombre doctets lus ou crits dans le fichier cela peut tre quot0quot si rien na t fait -1 si une erreur sest produite
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 107123 Les fonctions getline et getdelim ont pour but daller rcuprer des lignes de taille indfinies partir dun fichier pralablement ouvert avec la fonction fopen une ligne tant une squence de caractres termine par le caractre n La fonction getdelim permet de spcifier un caractre particulier supplmentaire pour dlimiter la fin de ligne Remarque La taille de la ligne rcuprer tant inconnue lavance le programmeur ne peut pas prvoir la mmoire pour stocker la ligne rcupre Ce sont donc les fonctions elles-mmes qui allouent malloc etou realloc suffisemment de mmoire pour stocker la ligne rcupre Charge au programmeur qui utilise ces fonctions de librer la zone de stockage free une fois quelle est devenue inutile include ltsystypeshgt Cration de nouveaux types include ltstdiohgt IO bufferises sizet getline char buffer sizet taille FILE pt sizet getdelim char buffer sizet taille int delim FILE pt Explication des paramtres char buffer pointeur sur un pointeur vers une zone mmoire dans laquelle seront rangs les caractres lus du fichier La double indirection se justifie ici car la fonction doit pouvoir modifier ladresse pointeur de la zone alloue Si buffer est nul la fonction allouera la zone mmoire Si buffer nest pas nul il doit correspondre une zone dj alloue et la fonction aura possibilit dagrandir cette zone avec une rallocation si ncessaire sizet taille pointeur sur une variable contenant la taille de la zone alloue Si la fonction modifie la taille de cette zone elle stockera dans la variable pointe la nouvelle taille int delim Caractre permettant de dlimiter une ligne FILE pt pointeur du fichier renvoy par la fonction fopen Valeur renvoye sizet dfini dans quotsystypeshgtquot Le nombre doctets rellement lus du fichier sil y en a 0 sil ny a plus rien lire ou si une erreur sest produite c Autres fonctions La fonction fflush permet de finaliser les critures encore en attentes dans les tampons mmoires associs aux sorties fichiers en cours dcriture cran etc Les tampons dcritures sont alors physiquement recopis sur les fichiers associs include ltstdiohgt IO bufferises int fflush FILE pt Explication des paramtres FILE pt pointeur du fichier renvoy par la fonction fopen Il est possible dutiliser la macro dfinition quotNULLquot pour demander la fonction de vider tous les tampons associs des fichiers ouverts Il est aussi possible de finaliser les critures en attentes sur stdout tampon associ aux messages normaux venant du programme ou stderr tampon associ aux messages derreur Valeur renvoye int 0 si elle russi intgralement Macro dfinition quotEOFquotsi une erreur sest produite Remarque La fonction fflush na t cre que pour les critures en attentes et ne doit pas tre appele avec le buffer clavier stdin car son comportement devient alors indtermin Cependant certains systmes Sun par exemple acceptent cet appel qui a alors pour effet de vider le clavier des donnes quil contient
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 108123 Les fonctions fpurge et fpurge permettent de vider sans les traiter les tampons mmoires associs aux entres-sorties A la diffrence de quotfflushquot qui finalise les donnes en attente dcriture avant de les effacer les fonctions fpurge et fpurge suppriment simplement les donnes encore prsentes dans les tampons associs aux entres-sorties La fonction fpurge diffre de la fonction fpurge en ne renvoyant rien include ltstdiohgt IO bufferises int fpurge FILE pt void fpurgeFILE pt Explication des paramtres FILE pt pointeur du fichier renvoy par la fonction fopen Il est possible dutiliser la macro dfinition quotNULLquot pour demander la fonction de purger tous les tampons associs des fichiers ouverts Il est aussi possible de purger les critures en attentes sur stdout tampon associ aux messages normaux venant du programme stderr tampon associ aux messages derreur ou stdin tampon associ aux donnes entrantes Valeur renvoye int pour fpurge 0 si elle russi intgralement Macro dfinition quotEOFquotsi une erreur sest produite Remarque Les fonctions fpurge et fpurge nont t crites que trs rcemment et ne se trouvent donc pas sur tous les systmes De plus la ncessit de faire appel ces fonctions est souvent de une mauvaise conception du programme Nanmoins elles peuvent tre remplaces si le besoin sen fait sentir par la macro dfinition suivante define FPURGEflux flux-gtIOreadptrNULL flux-gtIOreadendNULL flux-gtIOreadbaseNULL flux-gtIOwriteptrNULL flux-gtIOwriteendNULL flux-gtIOwritebaseNULL suite de lentte int mainvoid suite du code FPURGEstdin FPURGEstdout FPURGEstderr suite du code
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 109123 Les fonctions fseek et ftell permettent respectivement de changer et de renvoyer la position du pointeur interne de lecture et dcriture dun fichier pralablement ouvert avec la fonction fopen include ltstdiohgt IO bufferises int fseek FILE pt long offset int whence int ftell FILE pt Explication des paramtres FILE pt pointeur du fichier renvoy par la fonction fopen long offset position de placement dans le fichier int whence origine devant tre utilise pour le calcul du positionnement Cette origine doit tre prise parmi lune des trois constantes suivantes SEEKSET la position demande sera calcule partir du dbut du fichier SEEKCUR la position demande sera calcule partir de la position courante SEEKEND la position demande sera calcule partir de la fin du fichier Valeur renvoye int La nouvelle position pour fseek ou la position actuelle pour ftell mesure en octets depuis le dbut du fichier -1 si une erreur sest produite Les fonctions feof ferror et clearerr permettent respectivement de vrifier lindicateur de fin de fichier lindicateur derreur sur un fichier et rinitialiser ces deux indicateurs pour un fichier pralablement ouvert avec la fonction fopen include ltstdiohgt IO bufferises int feof FILE pt int ferror FILE pt void clearerr FILE pt Explication des paramtres FILE pt pointeur du fichier renvoy par la fonction fopen Valeur renvoye int Ces fonctions ne peuvent pas chouer et renvoient une valeur non-nulle si lindicateur vrifi est actif La fonction fileno renvoie un descripteur en mode quotbas niveauquot cf cours sur la programmation en C systme sous Unix dun fichier pralablement ouvert avec la fonction fopen include ltstdiohgt IO bufferises int fileno FILE pt Explication des paramtres FILE pt pointeur du fichier renvoy par la fonction fopen Valeur renvoye int Cette fonction ne peut pas chouer et renvoie un descripteur utilisable par les fonctions daccs quotbas niveauquot sur le fichier
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 110123 Les fonctions truncate et ftruncate permettent de couper un fichier une taille donne La fonction truncate travaille sur un fichier non ouvert alors que la fonction ftruncate travaille sur un fichier ouvert en mode quotbas niveauquot cf cours sur la programmation en C systme sous Unix include ltsystypeshgt Cration de nouveaux types include ltstdlibhgt Utilisation des librairies standard int truncate char nom offt size int ftruncate int fd offt size Explication des paramtres char nom chane de caractres contenant le nom du fichier couper int fd Descripteur du fichier ouvert en mode quotbas niveauquot offt size Taille en octets laquelle on veut couper le fichier Valeur renvoye int La nouvelle taille en octets du fichier -1 si une erreur sest produite d Exercice Faire un programme qui copie un fichier sous un autre nom clone de la commande Unix quotcpquot Les noms des fichiers seront passs au programme sous forme dargument Le programme ne vrifiera pas lcrasement ventuel include ltsystypeshgt Cration de nouveaux types include ltstdiohgt IO bufferises define SZBUFFER 1024 Taille zone de stockage lt 32768 Dclaration des fonctions utiles void usagechar Dcrit comment utiliser le programme sizet copiechar char Effectue la copie Fonction principale du programme int main int argc Nombre darguments passs au programme char argv Liste des arguments passs au programme Dclaration des variables long NbOctet Nb Octets copis Vrification assez dargument il faut 2 noms pour pouvoir copier if argc lt 2 On indique que ce nest pas bon printfquotPas assez dargument pour snquot argv0 On indique comment se servir du programme usageargv0 On quitte le programme avec une valeur diffrente de quot0quot erreur return 1 Ici il y a assez dargument On appelle la fonction de copie et on vrifie if NbOctetcopieargv1 argv2 lt 0 Ici la copie sest mal passe printfquotCopie s dans s chouenquot argv1 argv2 return 2
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 111123 La copie sest bien passe - On affiche le nombre doctets copis printfquots copi dans s u octetsnquot argv1 argv2 NbOctet Fin du programme return 0 Fonction de copie sizet copie char NomSrc Nom fichier source char NomDest Nom fichier destination Dclaration des variables FILE fpSrc Ptr fichier source FILE fpDest Ptr fichier destination char bufferSZBUFFER Zone de stockage sizet nbbuffer Nb octets traits en un bloc sizet nbtotal Nb octets crits au total Ouverture fichier source if fpSrcfopenNomSrc quotrquot NULL Le fichier na pas t ouvert printfquotErreur ouverture snquot NomSrc La fonction ne peut pas continuer return -1 Ouverture fichier destination if fpDestfopenNomDest quotwquot NULL Le fichier na pas t ouvert printfquotErreur ouverture snquot NomDest Fermeture fichier source qui est toujours ouvert fclosefpSrc La fonction ne peut pas continuer return -2 Boucle de copie bloc par bloc nbtotal0 while nbbufferfreadbuffer 1 SZBUFFER fpSrc 0 On vrifie quil ny a pas eu erreur de lecture if nbbuffer lt 0 La lecture a choue printfquotErreur lecture aprs octet ldnquot nbtotal Fermeture fichiers toujours ouverts fclosefpSrc fclosefpDest La fonction ne peut pas continuer return -3 On a lu un bloc de quotnbbufferquot octets On va crire le mme
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 112123 nbtotalnbbuffer On vrifie quil ny a pas eu erreur dcriture if fwritebuffer 1 nbbuffer fpDest lt 0 Lcriture a choue printfquotErreur criture avant bloc ldnquot nbtotal Fermeture fichiers toujours ouverts fclosefpSrc fclosefpDest La fonction ne peut pas continuer return -4 Tout sest bien pass Fermeture fichiers et fin de fonction fclosefpSrc fclosefpDest return nbtotal Fonction daffichage de lusage du programme void usage char NomPGM Nom programme afficher Dclaration des variables Pas de variable Affichage de lusage faire printfquotusage s source destnquot NomPGM Cet exercice montre bien la dmarche importante du programmeur qui doit sefforcer de toujours vrifier un maximum de cas possible cf chapitre sur la gestion des exceptions De plus sa modularit sparation des diffrents grands traitements lui permet dtre volutif Enfin utiliser une macro dfinition pour paramtrer la zone de stockage rend ce programme portable sur des ordinateurs plus ou moins puissants
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 113123 5 Gestion des exceptions Une exception est une impossibilit au systme deffectuer une fonction demande par lutilisateur ouvrir un fichier auquel on na pas accs crire alors que le fichier est ouvert en lecture etc Dune faon assez standard chaque fois quune fonction de la librairie standard ne peut pas effectuer le travail pour lequel elle a t prvue elle renvoie gnralement NULL si elle doit renvoyer un pointeur -1 si elle doit renvoyer une valeur numrique Cependant il peut tre intressant pour le programmeur de connatre la raison exacte de lchec en sachant quil peut y avoir plusieurs raisons dchec pour une fonction Or la valeur renvoye par la fonction indique juste lchec mais nindique pas la raison de lchec a La variable quotextern int errnoquot La variable quoterrnoquot de type int est une variable gnrale de travail du langage C Elle a t cre dans et pour la librairie standard quotusrliblibcaquot et est de ce fait disponible pour tout programme ou pour toute fonction qui sera compil avec cette dernire Ce nombre entier est rempli automatiquement par toute fonction standard qui subi un chec dans une tentative interne de travail Elle rempli ainsi la variable avec une valeur numrique standardise indiquant la cause de son chec Le programmeur ayant dtect lchec de sa fonction appele par un test de la valeur renvoye et ayant lui-aussi accs cette variable peux afficher sa valeur Enfin il ne lui reste qu consulter la table des exceptions dans sa documentation systme pour connatre la raison exacte de lchec Pour avoir accs cette variable il doit soit la dclarer en quotexternquot puisquelle est dj dfinie dj existante inclure le fichier quotusrincludeerrnohquot qui est un fichier den-tte dclarant entre autres cette variable extern int errno Ou bien quotinclude lterrnohgtquot main dbut du code fpfopenquotfichierquot quotwquot On tente douvrir le fichier pour y crire if fp NULL Si la fonction a choue fichier non ouvert Affichage dun message quelconque incluant la variable quoterrnoquot printfquotErreur ouverture fichier Raison dnquot errno Sortie du programme en gnral il est inutile daller plus loin exit1 suite du code Remarque La valeur de quoterrnoquot na de signification quaprs un appel une fonction ayant chou Elle nest jamais quotremise zroquot quand une fonction nchoue pas cela ne sert rien mais rien ninterdit de la mettre manuellement quotzroquot si un hypothtique besoin sen faisait sentir
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 114123 b La variable quotextern const char const syserrlistquot Le soucis de lutilisation immdiate de la variable quoterrnoquot est son cot impersonnel En effet il est fortement rbarbatif dexploiter un code numrique pour connatre la raison de lchec dune fonction mme en allant chercher le libell correspondant dans une obscure documentation systme par ailleurs peut-tre indisponible ou daccs difficile Cest pourquoi il a t associ la variable numrique quoterrnoquot un tableau de chanes de caractres quotsyserrlistquot contenant tous les messages des checs possibles de toutes les fonctions des librairies associes au programme Bien entendu ce tableau tant associ la variable quoterrnoquot il lui est fortement li Ainsi le message correspondant lexception quotnquot sera stock dans lindice quotnquot du tableau Cependant la dclaration du tableau ne se trouve dans aucun des fichiers den-ttes du systme Unix Cest dire que le programmeur qui veut sen servir doit imprativement dclarer cette variable qui est rappelons-le un tableau invariant de chanes de caractres invariantes de longueurs non-fixes donc un tableau constant de pointeurs constants Cette omission a t rpare dans le systme quotLinuxquot o la variable quotsyserrlistquot a t dclare dans le fichier den-tte quotusrincludestdiohquot extern int errno Ou bien quotinclude lterrnohgtquot extern const char const syserrlist Ou bien quotinclude ltstdiohgtquot sous quotLinuxquot int mainvoid dbut du code fpfopenquotfichierquot quotwquot On tente douvrir le fichier pour y crire if fp NULL Si la fonction a choue fichier non ouvert Affichage dun message quelconque propre au programmeur printfquotErreur ouverture fichiernquot Affichage du message systme printfquotsnquot syserrlisterrno Sortie du programme en gnral il est inutile daller plus loin exit1 suite du code c La variable quotextern int sysnerrquot La variable numrique quotsysnerrquot de type int contient le nombre de messages derreurs disponibles dans le tableau quotsyserrlistquot Elle correspond de ce fait la valeur maximale que peut prendre la variable quoterrnoquot Lutilit de cette variable est trs faible Elle permet simplement davoir une limite de boucle pour celui qui souhaite afficher tous les messages derreurs disponibles dans son systme ou bien davoir un contrle supplmentaire en vrifiant que quoterrnoquot est bien dans les limites imposes avant daller chercher le message quotsyserrlisterrnoquot Comme pour la variable quotsyserrlistquot la variable quotsysnerrquot nest dclare nulle part en dehors du fichier quotusrincludestdiohquot du systme quotLinuxquot
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 115123 d La fonction quotstrerrorquot La fonction strerror renvoie ladresse du message derreur correspondant quoterrnoquot Cette fonction correspond donc exactement au tableau quotsyserrlistquot mais elle lui est prfrable pour des raisons dvolutivit et de maintenance include ltstringhgt Gestion des chanes de caractres char strerrorunsigned int errnum Explication des paramtres unsigned int errnum Le numro de lerreur dont on veut le libell Valeur renvoye int Un pointeur sur le libell correspondant lerreur quoterrnumquot include lterrnohgt int mainvoid dbut du code fpfopenquotfichierquot quotwquot On tente douvrir le fichier pour y crire if fp NULL Si la fonction a choue fichier non ouvert Affichage dun message quelconque propre au programmeur printfquotErreur ouverture fichiernquot Affichage du message systme printfquotsnquot strerrorerrno Sortie du programme en gnral il est inutile daller plus loin exit1 suite du code
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 116123 e Fonction quotperrorquot La fonction perror affiche sur la sortie des erreurs un texte choisi par le programmeur immdiatement suivi du message derreur correspondant errno Ce nest quun affichage habill de syserrlist include lterrnohgt void perror const char txt Explication des paramtres const char txt Chane contenant un message qui sera affich en plus du message provenant de syserrlist Exemple include lterrnohgt int mainvoid dbut du code fpfopenquotfichierquot quotwquot On tente douvrir le fichier pour y crire if fp NULL Si la fonction a choue fichier non ouvert Affichage dun message quelconque suivi automatiquement du message systme perrorquotErreur ouverture fichierquot Sortie du programme en gnral il est inutile daller plus loin exit1 suite du code
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 117123 6 Fonctions mathmatiques Pour utiliser ces fonctions il est ncessaire lors de la cration de lexcutable de lancer le compilateur en lui demandant dinclure la librairie mathmatique quotusrliblibmaquot Exemple cc progc usrliblibma o prog cc progc lm o prog Liste des fonctions mathmatiques en vrac include ltmathhgt Mathmatiques en virgule flotante double exp double x Exponentielle double log double x Logarithme base 2 double log10 double x Logarithme base 10 double pow double x double y quotxquot puissance quotyquot double sqrt double x Racine carre double sin double x Sinus x doit tre en radians double cos double x Cosinus x doit tre en radians double tan double x Tangente x doit tre en radians double asin double x Arc sinus rsultat en radians double acos double x Arc cosinus rsultat en radians double atan double x Arc tangente rsultat en radians Les fonctions dcrites prcdemment peuvent chouer dans certains cas racine carre dun nombre ngatif ou bien lvation dun nombre ngatif une puissance non-entire ce qui peut donner un nombre complexe logarithme dun nombre ngatif ou bien tangente de 2 qui nexiste pas etc A ce moment l les fonctions renvoient une valeur spcifique quotNANquot Not a Number et positionnent en gnral errno avec lerreur quotEDOMquot La fonction isnan permet de vrifier si la valeur renvoye par une fonction mathmatique correspond quotNANquot include ltmathhgt Mathmatiques en virgule flotante int isnan double x Vrifie si quotxquot est quotnot a numberquot Exemple include ltmathhgt Mathmatiques en virgule flotante int mainvoid double tangente double angle angleatantangente if isnanangle printfquotErreur atanlfnquot tangente suite du code
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 118123 XV ANNEXES 1 Priorits des oprateurs par ordre dcroissant Priorit Oprateurs Signification Associativit 15 -gt Expression Indice Membre dune structure pointe Membre dune structure de gauche droite 14 -- - type amp sizeof Non logique Complment un Incrmentation Dcrmentation Signe oprateur unaire Casting Elment point Adresse de Taille de de droite gauche 13 Multiplication Division Modulo de gauche droite 12 - Addition Soustraction de gauche droite 11 ltlt gtgt Dcalage gauche Dcalage droite de gauche droite 10 lt gt lt gt Infrieur Suprieur Infrieur ou gal Suprieur ou gal de gauche droite 9 Egal Diffrent de de gauche droite 8 amp ET bit bit de gauche droite 7 OU exclusif bit bit de gauche droite 6 OU bit bit de gauche droite 5 ampamp ET logique de gauche droite 4 OU logique de gauche droite 3 Expression conditionnelle ternaire de droite gauche 2 - ltlt gtgtamp Affectation Affectations diverses de droite gauche 1 Oprateur squentiel de gauche droite
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 119123 2 Options de quotprintfquot et quotscanfquot Printf scanf c Affichage au format quotcharquot Saisie dun quotcharquot d Affichage au format quotintquot Saisie dun quotintquot hd Affichage au format quotshortquot Saisie dun quotshort intquot ld Affichage au format quotlongquot Saisie dun quotlongquot lld Affichage au format quotlong longquot Saisie dun quotlong longquot u Affichage au format quotunsigned intquot Saisie dun quotunsigned intquot hu Affichage au format quotunsigned shortquot Saisie dun quotunsigned shortquot lu Affichage au format quotunsigned longquot Saisie dun quotunsigned longquot llu Affichage au format quotunsigned long longquot Saisie dun quotunsigned long longquot o Affichage au format quotintquot en octal Saisie dun quotintquot en octal ho Affichage au format quotshortquot en octal Saisie dun quotshortquot en octal lo Affichage au format quotlongquot en octal Saisie dun quotlongquot en octal llo Affichage au format quotlong longquot en octal Saisie dun quotlong longquot en octal x Affichage au format quotintquot en hexadcimal Saisie dun quotintquot en hexadcimal hx Affichage au format quotshortquot en hexadcimal Saisie dun quotshortquot en hexadcimal lx Affichage au format quotlongquot en hexadcimal Saisie dun quotlongquot en hexadcimal llx Affichage au format quotlong longquot en hexadcimal Saisie dun quotlong longquot en hexadcimal f Affichage au format quotfloatquot en notation quotclassiquequot Saisie dun quotfloatquot en notation quotclassiquequot lf Affichage au format quotdoublequot en notation quotclassiquequot Saisie dun quotdoublequot en notation quotclassiquequot Lf Affichage au format quotlong doublequot en notation quotclassiquequot Saisie dun quotlong doublequot en notation quotclassiquequot e Affichage au format quotfloatquot en notation quotscientifiquequot Saisie dun quotfloatquot en notation quotscientifiquequot le Affichage au format quotdoublequot en notation quotscientifiquequot Saisie dun quotdoublequot en notation quotscientifiquequot Le Affichage au format quotlong doublequot en notation quotscientifiquequot Saisie dun quotlong doublequot en notation quotscientifiquequot g Affichage au format quotfloatquot en notation classique ou scientifique quotprintfquot choisira laffichage prenant le moins de place lg Affichage au format quotdoublequot en notation classique ou scientifique quotprintfquot choisira laffichage prenant le moins de place Lg Affichage au format quotlong doublequot en notation classique ou scientifique quotprintfquot choisira laffichage prenant le moins de place s Affichage dune chane de caractres Saisie dune chane de caractres r Affichage au format quotchiffres romainsquot minuscules option non normalise R Affichage au format quotchiffres romains majusculesquot option non normalise
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 120123 3 Les problmes les plus frquents a Mes affichages ne se font pas au bon moment Voici un exemple de code qui est correct mais qui prsente le lger dfaut de ne rien affichar avant quon ait saisi la valeur demande include ltstdiohgt IO bufferises main int i printfquotEntrez une valeur quot scanfdquot ampi printfquotLa valeur que vous avez entr est dnquot i Le problme vient de la fonction quotprintfquot Cette fonction est quotbuffrisequot cest dire quelle stocke les donnes afficher dans une mmoire buffer afin de rduire les requtes dentres-sorties qui sont relativement trs longues Les donnes ne sont alors rellement affiches sorties que dans les cas suivants La fonction rencontre un caractre n dans les donnes afficher Le buffer est plein Le programme se termine Le buffer est vid sur demande explicite du programmeur Si le programmeur dsire matriser dans son droulement du programme le moment o seront affiches ses donnes il doit provoquer un des cas ci-dessus Le plus facile est donc de demander le vidage du buffer en employant la fonction quotfflushquot et en lui indiquant quil faut vider le buffer de sortie standard quotstdoutquot Voici le code rectifi include ltstdiohgt IO bufferises main int i printfquotEntrez une valeur quot fflushstdout scanfquotdquot ampi printfquotLa valeur que vous avez entr est dnquot i Le problme se prsente aussi parfois dans lcriture dun fichier avec lemploi de la fonction quotfprintfquot Le fichier ne sera rellement crit sur disque que dans les cas ci-dessus ou bien lors de sa fermeture par la fonction quotfclosequot
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 121123 b Mes saisies se font une fois sur deux Voici un exemple de code qui a lair correct mais qui prsente le dfaut de ne pas laisser loprateur saisir sa demande de quitter la boucle include ltstdiohgt IO bufferises int mainvoid int age char c do printfquotAge quot fflushstdout scanfquotdquot ampage printfquotFin on quot fflushstdout scanfquotcquot ampc printfquotageltdgt finltcgtnquot age c while c o Le problme vient de la saisie du numrique Lorsque loprateur entre son nombre il valide sa saisie par lappui de la touche quotEntrequot Or cette touche envoie elle-aussi un caractre dans le tampon associ au clavier Lorsque la fonction quotscanfquot extrait le nombre du tampon associ au clavier elle sarrte au premier caractre qui nest plus numrique donc sarrte ce fameux caractre quotEntrequot qui reste dans le tampon Lors de la saisie suivante la fonction quotscanfquot ayant dj un caractre traiter ne demande donc rien loprateur Pour que le buffer arrive vide lentre de quotscanfquot il convient aprs la saisie du numrique dextraire ce caractre inutile par lappel dune fonction approprie quotgetcharquot par exemple Lappel la fonction quotfpurgequot est envisageable mais bien inutile du fait de la cause de cette erreur trs simple rectifier Voici le code rectifi include ltstdiohgt IO bufferises int mainvoid int age char c do printfquotAge quot fflushstdout scanfquotdquot ampage getchar printfquotFin on quot fflushstdout scanfquotcquot ampc printfquotageltdgt finltcgtnquot age c while fin o
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 122123 c Mes boucles ne sarrtent pas Dans lemploi des boucles il faut se mfier de la zone des valeurs possibles des variables quon utilise car une variable qui atteint sa valeur limite maximale et qui est incrmente de quot1quot repasse sa valeur minimale sans que le programme ou le compilateur indique une erreur quelconque Il en va de mme pour une variable qui atteint sa valeur limite minimale et qui est dcrmente de quot1quot Elle repasse alors sa valeur limite maximale Voici diffrents exemples de boucles infinies char i for i0 i lt 200 i printfquotidnquot i Boucle infinie car un quotcharquot signed varie de 128 127 et sera toujours infrieur 200 unsigned short i for i10 i gt 0 i-- printfquotidnquot i Boucle infinie car un quotunsignedquot est toujours positif ou nul long i10 do printfquotidnquot i i-- while i gt 1 gt 0 Cette boucle rellement bizarre montre bien quen C on peut crire vraiment nimporte-quoi pourvu que ce soit syntaxiquement correct La condition de fin sera value de gauche droite On aura donc i gt 1 vrai ou faux gt renvoie un nombre quotxquot diffrent de 0 ou x0 x gt 0 sera toujours vrai gt Boucle infinie d Les fonctions de la librairie mathmatique renvoient des valeurs incohrentes Noubliez pas dinclure les dclarations des fonctions mathmatiques quotinclude ltmathhgtquot au dbut de chaque fichier source devant utiliser une fonction de la librairie mathmatique En effet lorsque le compilateur arrive sur une fonction non connue non dclare il la dclare automatiquement par dfaut en fonction de type quotintquot norme ANSI Ensuite lors de lappel au code excutif de la fonction situ dans la librairie mathmatique le rsultat du calcul est transform dans le type de la fonction int et il perd toute sa cohrence Linclusion de quotmathhquot permet de dclarer au compilateur toutes les fonctions qui seront utilises
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 123123 INDEX A affichage 19 argc 91 argv 91 C casting 20 cc 10 classe dallocation auto 55 classe dallocation const 57 classe dallocation extern 56 classe dallocation register 55 classe dallocation static 55 classe dallocation volatile 57 commentaires 12 compilateur 9 84 constante ascii 15 constante base 10 15 constante base 16 15 constante base 8 15 constante code ascii 15 constante prdfinie 15 constante virgule flottante 15 conversion de type explicite casting 20 conversion de type implicite 20 D documentation 10 E envp 91 F fonction appel 37 fonction dfinition 36 fonction paramtres 38 fonction prototype 37 fonction retour 38 fonction fpurge 108 fonction acos 117 fonction asin 117 fonction atan 117 fonction atof 102 fonction atoi 102 fonction atol 102 fonction calloc 94 fonction clearerr 109 fonction cos 117 fonction exp 117 fonction fclose 103 fonction feof 109 fonction ferror 109 fonction fflush 107 fonction fgetc 104 fonction fgets 105 fonction fileno 109 fonction fnmatch 101 fonction fopen 103 fonction fprintf 106 fonction fpurge 108 fonction fputc 104 fonction fputs 105 fonction fread 106 fonction free 94 fonction fscanf 106 fonction fseek 109 fonction ftell 109 fonction ftruncate 110 fonction fwrite 106 fonction getc 104 fonction getchar 104 fonction getdelim107 fonction getline107 fonction gets 105 fonction isalnum98 fonction isalpha98 fonction isascii 98 fonction isblank 98 fonction iscntrl98 fonction isdigit 98 fonction isgraph 98 fonction islower 98 fonction isnan117 fonction isprint98 fonction ispunct98 fonction isspace 98 fonction isupper 98 fonction isxdigit 98 fonction log 117 fonction log10 117 fonction main 91 fonction malloc94 fonction memchr 95 fonction memcmp 95 fonction memcpy95 fonction memset 95 fonction perror116 fonction pow117 fonction putc 104 fonction putchar 104 fonction puts 105 fonction realloc94 fonction sin117 fonction sprintf 102 fonction sqrt 117 fonction sscanf102 fonction strcat 100 fonction strchr 100 fonction strcmp 99 fonction strcpy100 fonction strdup 100 fonction strerror115 fonction strlen 99 fonction strncat 100 fonction strncmp 99 fonction strncpy100 fonction strndup 100 fonction strpbrk 101 fonction strrchr 100 fonction strrcspn 101 fonction strspn 101 fonction strstr 100 fonction strtod 102 fonction strtol 102 fonction strtoul 102 fonction tan 117 fonction toascii 98 fonction tolower98 fonction toupper 98 fonction truncate 110 fonction ungetc 104 fonctions36 I identificateur11 instruction break29 instruction continue 29 instruction de contrle 25 instruction de contrle do while27 instruction de contrle exit 32 instruction de contrle for 28 instruction de contrle goto 30 instruction de contrle if else25 instruction de contrle switchcase 31 instruction de contrle while 26
LES LANGAGES Apprentissage du langage quotCquot Version 20 Edition octobre 2006 Frdric Lang frederic-langfrfm 124124 instructions composes 16 instructions simples 16 M main 38 mots rservs 11 O oprateur moins unaire 18 oprateur moins 17 oprateur -- post dcrmentation 18 oprateur -- pr dcrmentation 18 oprateur not 18 oprateur diffrence 17 oprateur modulo 17 oprateur amp adresse de 59 oprateur amp et bit bit 17 oprateur ampamp et logique 17 oprateur multipli 17 oprateur valeur pointe par 59 oprateur concatnation 18 oprateur divis 17 oprateur ou exclusif bit bit 17 oprateur ou bit bit 17 oprateur ou logique 17 oprateur not bit bit 18 oprateur plus unaire 18 oprateur plus 17 oprateur post incrmentation 18 oprateur pr-incrmentation 18 oprateur ltlt dcalage gauche 17 oprateur affectation 17 oprateur galit 17 oprateur gt lt gt lt ingalits 17 oprateur gtgt dcalage droite 17 oprateur opration avec affectation 17 oprateur sizeof 18 oprateur ternaire 18 P pr processeur 84 pr processeur define 84 pr processeur elif 87 pr processeur else 87 pr processeur endif 87 pr processeur error 90 pr processeur if 87 pr processeur ifdef 87 pr processeur ifndef 87 pr processeur include 88 pr processeur pragma 90 pr processeur undef 84 pr processeur DATE 86 pr processeur FILE 86 pr processeur LINE 86 pr processeur TIME 86 pr processeur effet de bord85 pr processeur idempotence 89 pr processeur oprateur 90 pr processeur oprateur 90 pr processeur option -D 86 pr processeur option -U 86 printf19 R rcursivit41 rcursivit conclusion42 rcursivit croise 42 rcursivit double 41 rcursivit simple 41 return38 S saisie 19 scanf 19 sentinelle 23 sparateurs 12 T type boolen14 type chane de caractres23 type char14 type char toile70 type double14 type double toile 70 type enum 83 type float14 type float toile 70 type int14 type int toile 70 type long double14 type long toile 70 type long int14 type long long int 14 type short toile70 type short int14 type struct79 type tableau21 type union82 type void36 type void toile 71 typedef24 V variable visibilit53 54 variable extern const char const syserrlist114 variable extern int errno 113 variable extern int sysnerr 114 variable globale 54 variable locale 53 variables13
تحميل

PDF

1771 مشاهدة.

Omar Ajouaou

Omar Ajouaou

Langage C - Apprentissage
أرسلت .



كلمات مفتاحية :
cour langage
cour langage wetud docs ...