Documente Academic
Documente Profesional
Documente Cultură
1. GENERALITES
1.1 Introduction - Historique Le langage C est un langage de programmation conu pour de multiples utilisations. Son dveloppement est parallle au systme UNIX. Le noyau du systme UNIX est crit en langage C. Dsormais, il est utilis sur tous les systmes d'exploitation et donc sur toutes les machines. Les principes fondamentaux du langage C sont issus du langage BCPL cr vers 1970 pour le premier systme UNIX dans les laboratoires AT & T 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 DM Ritchie en 1972 pour donner naissance au premier ouvrage de rfrence "Le langage C" Editions MASSON. Si le noyau du langage C est assez restreint, il s'enrichit d'une librairie standard qui contient des fonctions permettant les traitements les plus divers (Entres/Sorties, Traitements des chanes de caractres, Gestion dynamique de la mmoire, etc...). L'tude du langage C passe obligatoirement par l'tude complte du noyau. Ultrieurement, vous pourrez aborder l'tude de la POO (Programmation Oriente Objet) en C++. Le langage C est un langage structur, dclaratif et faiblement typ. Cette structuration s'appuie sur quatre lments: l'application les fichiers les fonctions les donnes 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 s'efforcera d'utiliser la norme ANSI. Tous les exemples (sauf avertissement) sont donns pour un compilateur respectant la norme.
PS/LANGAGES
Page 1
Gnralits
1.2 Notions de fonctions et de blocs Les units de structuration du langage C sont: - la fonction qui correspond la notion de sous-programme en PASCAL, FORTRAN ou ADA. Il n'y a pas de distinction entre procdure (qui effectue une action) et fonction (qui calcule un rsultat en fonction de paramtres). - les fichiers comprenant des dclarations de fonctions et d'objets. Les fichiers peuvent tre compils sparment. Ils constituent des modules, brique de base dans la construction d'applications. Un programme C, c'est donc un ou plusieurs fichiers comprenant: - des dclarations de fonctions. - des dclarations d'objets, variables ou constantes. - des directives pour le prprocesseur. Contrairement PASCAL ou ADA, on ne peut dclarer de fonctions l'intrieur d'une 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 (appele main) constitue le point d'entre dans le programme. On ne peut trouver qu'un seul 'main' dans un programme. Un bloc est un ensemble d'instructions formant une entit logique indissociable borne par une accolade ouvrante '{' (dbut) et une accolade fermante '}' (fin).Le plus grand bloc est la fonction. fonction1(...); fonctionN(...); main() /* Point d'entre */ { Possibilits de variables locales Code } fonction1(...) { Possibilits de variables locales Code } fonctionN(...) { Possibilits de variables locales Code } La fonction main est reconnue par l'diteur de liens comme le point de dpart de l'excutable.
PS/LANGAGES
Page 2
Gnralits
Programme
Fichier excutable
PS/LANGAGES
Page 3
Gnralits
1.3 Le compilateur c Compilation et Edition de liens sont regroups dans une seule commande qui, suivant les options, enchane tout ou partie des phases suivantes:
Source C
$ cc fichier.c va analyser toutes les directives commenant par le signe # va liminer tout texte compris entre /* et */
cpp
Source C
ccom
Source Assembleur
as
Code Objet
fichier.o
ld
Code Excutable
a.out
PS/LANGAGES
Page 4
Gnralits
1.3.1 La compilation sous UNIX La commande de compilation sous UNIX est : cc [options] liste de fichiers Extension des fichiers Fichiers sources Fichiers compilables Modules assembleur Fichiers objets Librairies statiques Excutable
.c .i .s .o .a sans extension
Quelques options de la commande cc sur DPX20 cc fic1.c excutable a.out cc fic1.c -o prog excutable prog cc -O fic.c -o prog excutable optimis prog cc -c fic1.c module objet fic1.o cc -S fic1.c source assembleur fic1.s cc -P fic1.c source compilable fic1.i cc fic1.c fic2.c -o prog excutable prog constitu partir des 2 fichiers sources fic1.c et fic2.c cc fic1.o fic2.o -o prog excutable prog constitu partir des 2 fichiers objets fic1.o et fic2.o cc -lm fic1.c -o prog excutable prog en linkant la librairie mathmatique libm.a cc -g fic1.c excutable a.out contenant des informations de dboggage cc fic.c -qsrcmsg affiche la ligne source en erreur marque les items en erreur dans la ligne cc fic.c -qxref produit un listing objet qui inclut les cross reference dans fic.lst Remarques : la librairie standard (libc.a) est linke automatiquement. 1.3.2 La compilation sous TURBO C Sous l'environnement de dveloppement intgr (EDI), la compilation d'un fichier source s'obtient par - la commande Compile (raccourci : Alt F9) qui compile le fichier - ou par la commande Make (raccourci F9) qui produit directement l'excutable. Il est galement possible de compiler par l'utilitaire TCC (compilateur en ligne de commande partir de la ligne de commande MSDOS) en utilisant les nombreuses options disponibles (cf documentation TURBO C de BORLAND). Le TURBO C produit des fichiers objets d'extension .OBJ et des fichiers excutables d'extension .EXE.
PS/LANGAGES
Page 5
PS/LANGAGES
Page 7
2.3 Les sparateurs Les diffrents sparateurs reconnus par le compilateur peuvent avoir plusieurs significations. Type Nom Significations [] Crochets Indice d'accs dans un tableau () Parenthses 1/ Groupement d'expressions (forcer la priorit) 2/ Isolement des expressions conditionnelles 3/ Dclaration des paramtres d'une fonction 4/ Conversion explicite d'un type (casting) {} Accolades 1/ Dbut et fin de bloc d'instructions 2/ Initialisation la dclaration d'un tableau 3/ Dclaration d'une structure , Virgule Spare les lments d'une liste d'arguments ; Point virgule Terminateur d'instruction : Deux points Indique une instruction avec label . Point Permet l'accs un champ d'une structure 2.4 Les commentaires Les commentaires permettent de porter des remarques afin de faciliter la lecture d'un programme source. Chaque commentaire est dlimit par les combinaisons suivantes : /* dbut de commentaire
*/ fin de commentaire Les commentaires ne peuvent pas tre imbriqus. Les commentaires ne sont pas pris en compte par le compilateur et n'augmentent donc pas la taille des programmes excutables. Remarque: en Turbo C et dans les versions les plus rcentes, la squence // permet de mettre la ligne courante en commentaires.
PS/LANGAGES
Page 8
2.5 Principales directives de compilation 2.5.1 Gnralits Avant de raliser les oprations de compilation, le systme utilise un outil appel prprocesseur qui excute les directives de compilation places dans le programme source. Prcdes du dise (#), elles sont places, de prfrence, en tte du programme. 2.5.2 Inclusion de fichier Pour fonctionner, un programme en langage C a besoin d'un certain nombre de dclarations ou donnes stockes dans des fichiers d'en tte (.h). Il est donc ncessaire que ces fichiers soient intgrs au programme source avant la compilation. #include <fichier> ou #include "fichier" Cette directive permet d'inclure des fichiers issus d'une bibliothque lors de la compilation. Si le fichier inclure est dans le rpertoire 'include' ou 'usr/include', le nom du fichier sera encadr par <...>, sinon le chemin d'accs du fichier est mis entre guillemets. Exemples: #include <stdio.h> #include"ma_biblio/mon_fic.h" 2.5.3 Dfinition de pseudo-constante #define expression Cette directive permet de crer une pseudo-constante. Par convention, on crit le nom des pseudo-constante en lettres majuscules. 2.5.4 Dfinition de macro-instructions Le prprocesseur permet la dfinition de macro-instructions. Une macro-instruction est une dfinition comportant des paramtres nomms entre parenthses tout de suite aprs le nom de la macro. Une macro s'utilise comme une fonction. Le programme est plus rapide (conomie du temps d'appel et de retour) mais plus gros. Exemple: #define maxi(a,b) ((a>b)?(a):(b)) Remarque: il faut mettre des parenthses pour viter tout problme de prcdence des oprateurs lors de l'utilisation de la macro dans une expression. Ce problme de prcdence des oprateurs sera vu au cours du chapitre 4 sur les oprateurs de base.
PS/LANGAGES
Page 9
2.5.5 Compilations conditionnelles On peut contrler le fonctionnement du prprocesseur grce des instructions conditionnelles qui sont values au cours du pr-traitement. 2.5.5.1 Annulation de constante #undef expression Cette directive permet d'annuler l'effet d'un #define. Elle est surtout utilise pour remplacer les macro-instructions dfinies dans les fichiers d'entte. Si l'expression n'a pas t dfinie, la directive n'a aucun effet. 2.5.5.2 Contrle de dfinition #ifdef expression instructions #endif #ifndef expression instructions #endif Ces deux directives permettent de vrifier si une expression a t (ifdef) ou n'a pas t (ifndef) dfinie. Si la rponse est 'oui', les instructions qui suivent seront excutes jusqu' la rencontre du #endif. 2.5.5.3 L'inclusion conditionnelle #if <condition> instructions_1 #else instructions_2 #endif Si condition est vraie, instructions_1 sera inclue, dans le cas contraire c'est instructions_2. #if <condition_1> instructions_1 #elif <condition_2> instructions_2 #endif Si condition_1 est vraie, instructions_1 sera inclue. Dans le cas contraire, condition_2 sera value, si elle est vraie instructions_2 sera inclue.
PS/LANGAGES
Page 10
Exemple: #if flag = = 1 #include "ficl.h" #elif flag == 2 #include "fic2.h" #else #include "fic3.h" #endif
2.6 Les constantes Une constante est une donne dont on ne peut modifier la valeur. Les constantes symboliques sont dclares en utilisant la directive de compilation #define. 2.6.1 Les constantes entires Exemples: #define TINTIN #define MILOU #define DUPONT #define DUPOND
Le programmeur peut demander que les constantes entires soient codes sur un long en ajoutant la lettre L (ou l) la fin de la valeur. #define ASTERIX 2.6.2 Les constantes relles Exemples: #define PI #define PI2 14L
3.14159 0.314e+1
Les constantes relles sont associes un codage en mmoire sur un double (8 octets). 2.6.3 Les constantes caractres Exemple : #define DOLLAR
'$'
Les caractres peuvent tre reprsents par le caractre '\' suivi du code ASCII octal ou par le caractre '\x' suivi du code ASCII hexadcimal. Exemples: #define BELL #define ESCAPE #define CR #define BS
/* Code ASCII 007 en octal de la sonnerie */ /* Code ASCII 033 en octal : touche ESC */ /* Code ASCII 0d en hexadcimal : Return */ /* Code ASCII 08 en hexadcimal : BackSpace */
PS/LANGAGES
Page 11
Certains caractres particuliers sont reprsents par le caractre \ suivi d'une lettre symbolisant leur fonction. Signification Fin de ligne Tabulation horizontale Tabulation verticale Retour arrire Retour chariot Saut de page Signal sonore Barre oblique inverse Guillemet Apostrophe Caractre nul Nombre octal Nombre hexadcimal Mnmonique Code ASCII LF 0A HT 09 VT 0B BS 08 CR 0D FF 0A BEL 07 \ 5C " 22 ' 2C NUL 0 ooo hh Symbole \n \t \v \b \r \f \a \\ \" \' \0 \ooo \xhh
2.6.4 Les constantes chanes Une chane de caractres en C est encadre par des doubles quotes. Exemple: #define TITRE "Bonjour et Bienvenue" Observation: En mmoire, cette chane sera termine par '\0'. Remarque: pour insrer des caractres " ou \ dans une chane, on les fait prcder d'un \. 2.7 Les variables Comme tout langage dclaratif, le langage C exige que les variables soient dclares avant leur utilisation. Une variable est dfinie par 3 attributs: - son nom (l'identificateur de la variable) - son type - sa classe d'allocation en mmoire Ces trois informations doivent se retrouver dans la dclaration de la variable (de manire explicite ou non).
Dclaration : [classe] [unsigned] <type> <identificateur>;
/* dclaration d'une variable i de type int de classe auto */ /* (classe auto par dfaut) */ /* dclaration d'une variable nb de type int de classe static */
PS/LANGAGES
Page 12
Les variables symboliques (i ou nb) permettent de stocker des valeurs et ont un type associ. Il y a deux valeurs associes une variable symbolique. La valeur de la donne stocke en mmoire une position donne. On l'appelle rvalue (right-value ou read-value). La valeur de cette position, c'est--dire l'adresse en mmoire o est stocke la valeur. On l'appelle lvalue (left-value ou location-value). Exemple : dans l'instruction suivante i = i + 5; la variable symbolique i apparat la fois du ct droit et du ct gauche de l'oprateur =. L'instance du ct droit est lue (read) mais pas modifie, c'est une rvalue L'instance du ct gauche est crite (location), c'est une lvalue.
PS/LANGAGES
Page 13
2.8 Structure d'un programme en langage C Inclusions si ncessaire (#include) Dfinition des pseudo-constantes ("#define") Dfinitions de type Prototypes des fonctions Dclaration des variables globales main() (point d'entre du programme) { Dclaration des variables locales au main Instructions } Type et nom de la premire fonction (paramtres) { Dclaration des variables locales Instructions } .../... Type et nom de la nime fonction (paramtres) { Dclaration des variables locales Instructions }
PS/LANGAGES
Page 14
entier entier court entier long caractre ASCII qui est un entier
Il n'existe pas de type boolen. Mais, un entier gal zro est considr comme faux et diffrent de zro comme vrai. 3.1.2 Les types drivs le type pointeur pour avoir des objets contenant l'adresse d'objets d'un type donn. le type tableau pour avoir des objets composs d'objets de mme type. le type structure pour avoir des objets composs d'objets de types diffrents. le type union pour manipuler des objets de type diffrents sur une mme zone mmoire. le type fonction : objet particulier. le type numration pour dcrire un ensemble fini de valeurs entires. 3.1.3 Le type void Le type void est un type particulier dans la mesure o il n'existe aucun objet de type void. Il ne sert qu'a prciser qu'une fonction ne renvoie rien ou n'a pas de paramtre. Exemples: void imprime (int); /* la fonction imprime ne retourne aucune valeur */ void va_a_la_ligne (void); /* la fonction va_a_la_ligne ne retourne aucune valeur et n'attend aucun paramtre*/
PS/LANGAGES
Page 15
3.1.4 Les dfinitions de types par typedef On dit aussi type synonyme. Le mot rserv typedef permet de dfinir un type synonyme (en gnral une abrviation) pour un type existant. Exemple: typedef enum {FAUX,VRAI} booleen; Permet de dclarer un synonyme (un alias) pour le type enum {FAUX,VRAI}. Typedef sert beaucoup pour la documentation du programme et la rduction de la complexit de notation d'un type driv. En cela, il amliore la lisibilit des dfinitions et contribue la portabilit (Exemple : les tailles des variables de type int selon la machine). Se reporter au chaptre 9 pour plus de prcisions sur typedef. 3.2 Les types entiers Ce sont des variables de type simple dont la taille et les limites varient en fonction de la machine utilise. Dclaration : [classe] [unsigned] <type> <nom>; Observations: Une variable peut tre dclare signe (signed valeur par dfaut), ou non signe (unsigned ). Dans ce dernier cas, le bit de signe est interprt en tant que bit de valeur. Si la variable est dclare signe, le premier bit sera utilis pour reprsenter le signe. Le codage d'un nombre ngatif est ralis par la mthode du complment deux. Exemples: unsigned int ent; /* dclaration de la variable ent de type entier non sign */ char a = '\n'; /* dclaration et initialisation de la variable */ Limites d'utilisation des variables en fonction des tailles
Type int short unsigned short long unsigned long char unsigned char Dnomination Entier Entier court Entier court non sign Entier long Entier long non sign Caractre Caractre non sign Longueur UNIX 4 2 2 4 4 1 1 Longueur DOS 2 2 2 4 4 1 1 Valeurs limites
-32 768 32 767 0 65535 -2 147 483 648 2 147 483 647 0 4 294 967 295 -128 127 0 255
En cas de dpassement de capacit lors de l'excution, aucune erreur ne sera signale mais la valeur sera errone.
MLe fait que les variables de type char soient signes ou non dpend de la machine utilise mais les caractres imprimables sont toujours positifs.
PS/LANGAGES
Page 16
En cas de dpassement de capacit lors de l'initialisation, la valeur est considre comme + ou - la valeur minimale. Si cette erreur a lieu lors d'un calcul, l'excution du programme est interrompue avec affichage d'un message d'erreur. * : le type long double n'est pas disponible sur tous les systmes. 3.4 Les caractres Ils sont cods sur 8 bits ( un octet ) et dclars entre ' '. Un caractre peut tre dclar non sign, dans ce cas, la plage des valeurs ASCII sera de 0 255. 3.5 Initialisation des variables Exemples main () { int i, j = 3, k; float x = 12000, y = 1.2e4; long n = 123L, o = 132770; char p1 = 'A', p2 = '\x41', p3 = '\101', p4 = 40; int q = 10, r = 010, s = 0x10; }
/* ou = 0x41*/ /* ou = 0101*/
Toutes les dclarations de variables peuvent comporter le qualificatif const qui indique que leurs valeurs ne seront jamais modifies ou le qualificatif volatile qui demande au compilateur de ne pas optimiser le code concernant cette variable. const type <identificateur> = <valeur>; volatile type <identificateur>; exemples : const int MAX = 100; volatile int i;
PS/LANGAGES Page 17
3.6 Modle mmoire d'un programme C Cas gnral Zone o sont placs dynamiquement (en cours d'excution) les arguments passs aux fonctions et les variables automatiques. Zone de mmoire non alloue, disponible pour l'allocation dynamique. Zone o sont places ( la compilation) les variables externes et les variables internes statiques. Zone o sont places les instructions qui constituent le programme.
PILE
TAS
DONNEES
CODE
Cas du C sous UNIX Dans chaque fichier excutable EN-TETE En-tte dont l'adresse du point d'entre.
Rfrences des fichiers utiliss Code excutable. Fusions des sections Section .TEXT Zone contenant les donnes Section .DATA correspondantes static initialises. Zone contenant les donnes des modules objets Section .BSS static NON initialises. Commentaires des fichiers Section .COMMENT objets Zone contenant les chanes Table des chanes de caractres ventuellement Table des symboles
3.7 Classes d'allocation mmoire Une variable est caractrise par - sa porte (visibilit) Remarque : l'intrieur de cette porte, elle peut tre masque par une dclaration plus interne - sa dure de vie - un lieu en mmoire Le choix de la classe mmoire d'une variable est dtermin par les rponses aux trois questions suivantes: Quelle est la dure de vie de la variable ? Quelle est sa visibilit ? O sera-t-elle stocke ?
PS/LANGAGES
Page 18
Deux sortes de variables: les variables dclares en dehors de toute fonction = variables externes variable confidentielle : la porte est limite au fichier variable exportable (dans par un autre fichier) les variables locales une fonction (ou un bloc)
Quatre sortes de mmoire mmoire statique (zone de donnes) mmoire dynamique (la pile) les registres du processeur le tas (heap) les variables restent vivantes pendant toute la dure de vie du programme les variables sont empiles (dpiles) au rythme des appels des fonctions. rapidit d'accs les variables sont cres dynamiquement
3.7.1 Les variables externes On parle gnralement de variables globales ou semi-globales. Les variables globales sont dclares l'extrieur de toute fonction, sans mot cl, en tte de fichier. Elles sont prcdes du mot cl extern dans les autres fichiers en cas de compilation spare. Elles sont stockes dans la zone de donnes. Les variables globales sont initialises 0 par dfaut. Exemple de variable globale fic1.c int varglob; main() { varglob = 52; fonc(); } fic2.c extern int varglob; fonc() { varglob = 55; ... }
Les variables semi-globales (ou confidentielles) sont dclares en dehors de toute fonction. Leur visibilit est le fichier dans lequel elles sont dclares. Elles sont prcdes du mot cl static. Exemple de variable semi-globale fic1.c fic2.c /* aucune visibilit pour la static int confident; variable confident */ main() fonc2() { { confident = 52; ... fonc1(); } } fonc1() { confident = 0; ... }
PS/LANGAGES Page 19
3.7.2 Les variables locales Les variables locales ne sont pas initialises (valeur indfinie) par dfaut. Elles peuvent l'tre explicitement. Les variables locales statiques ont la dure de vie du programme. Leur visibilit est restreinte la fonction de dclaration. Le contenu de la variable perdure entre chaque appel. Elles sont dclares avec le mot cl static et sont initialises implicitement 0. Exemple: fonc3() { static int nb = 0; nb = nb + 1; printf("Nombre d'appels = %d\n",nb); }
Cette fonction affiche le nombre de fois o elle a t appele (nb n'est initialis que lors du premier appel).
Les variables locales automatiques sont des variables dont la dure de vie et la visibilit sont celles de la fonction de dclaration. Ces variables sont cres automatiquement chaque appel et disparaissent la fin de la fonction. Elles sont dclares avec le mot cl auto qui est facultatif. En effet, la classe auto est la classe par dfaut des variables. Exemples: auto int i; int k; 3.7.3 Les variables locales registres Ce sont des cas particuliers des variables locales automatiques. Elles sont localises dans les registres du processeur quand cela est possible dans un objectif d'optimisation du temps d'accs. Si l'utilisation des registres n'est pas possible, elles sont considres comme des variables locales automatiques. Elles sont dclares avec le mot cl register. La dclaration d'une telle variable reste une demande du programmeur. Il n'y a aucune assurance que cette demande soit satisfaite. Exemple: register int i; Remarques : - Seuls les entiers, les caractres et les pointeurs peuvent tre dclars en register. - On ne peut pas appliquer l'oprateur & un objet dclar de type register. 3.7.4 Tableau rcapitulatif DOMAINE GLOBAL LOCAL Initialisation 0 par le compilateur Initialisation 0 pour les statiques par dfaut par dfaut Dure de vie du programme Dure de vie de la fonction ou du bloc Stocke dans la zone de donnes Empche l'exportation vers un autre Garde sa valeur d'un appel l'autre fichier Classe implicite Place dans un registre du processeur
Page 20
CLASSE
3.7.5 Dfinition et dclaration d'une variable En langage C, c'est au programmeur de faire la distinction entre dfinition et dclaration. La dfinition entrane une allocation mmoire alors que la dclaration signifie utilisation. De faon schmatique, on applique les rgles suivantes: Quand une variable est initialise, c'est une dfinition. Quand il n'y a pas d'initialisation et que le mot extern est prsent, c'est une dclaration. 3.8 Conversions de types Contrairement d'autres langages, le langage C autorise des instructions contenant des oprandes de types varis. Lorqu'une expression contient des oprandes de types diffrents, ils sont convertis en un type commun. En gnral, les conversions d'un type 'troit' en un type 'large' s'effectuent sans pertes d'informations. Des conversions se font galement lors des affectations, la valeur de ct droit est convertie dans le type de la valeur du ct gauche qui sera le type du rsultat. Aucun changement n'est interdit par le compilateur. Il revient au programmeur de vrifier que les changements demands ont une signification. 3.8.1 Combinaisons d'oprandes Lorsque plusieurs oprandes de types varis se trouvent dans une expression, le compilateur effectue un certain nombre de conversions en respectant les rgles suivantes: CHAR systmatique INT LONG DOUBLE LONG DOUBLE FLOAT systmatique DOUBLE LONG DOUBLE Fonctionnement gnral: si une expression contient au moins deux types de variables, la variable du type le plus 'troit' est convertie en variable du type suprieur. Certaines conversions sont systmatiques: un caractre est toujours converti en entier. un rel de type float est toujours converti en rel de type double. 3.8.2 Conversions lors d'assignations Lors d'une assignation (variable = expression), la valeur de l'expression est affecte la valeur gauche (left-value). Le compilateur effectue automatiquement les conversions si ncessaire. Conversions automatiques sans perte de prcision et sans perte de signe char int le caractre est plac dans l'octet le moins significatif int long expansion du signe pas de problme int float float double pas de problme Conversions automatiques avec perte de prcision int char perte des octets les plus significatifs long int selon implmentation (pas de problme en UNIX) float int perte de la partie dcimale double float perte de prcision
PS/LANGAGES Page 21
3.8.3 Casting d'oprandes Il est toujours possible d'imposer une conversion de type en prfixant l'oprande avec un type plac entre parenthse. C'est le transtypage ou casting. Syntaxe : (type) expression La conversion est temporaire et est faite aux risques du programmeur. Exemple: main() { int i = 3 , j = 2; float x, y; x = i / j; /* x a pour valeur 1 */ y = (float) i / j; /* y a pour valeur 1.5 */ } Pendant la dure de l'valuation, i est convertie en float. Autre exemple: main() { long n = 200000L; double x; ... x = sqrt((double)n); /* la fonction sqrt rclame un paramtre de type double /* Il est donc ncessaire d'effectuer un transtypage }
*/ */
PS/LANGAGES
Page 22
Modulo
Si les deux oprandes sont de type entier, la division est une division entire. Si au moins un oprande est de type rel, la division est relle. L'oprateur Modulo ne s'applique pas aux rels.
4.2 Les oprateurs de manipulations internes Les oprateurs de manipulations internes permettent d'effectuer des oprations binaires sur les bits d'un caractre ou d'un entier. Symbole & | ^ ~ << >> Rle Et bit bit Ou bit bit Ou exclusif bit bit Complment un (inverse la valeur de chaque bit) Dcalage vers la gauche Dcalage vers la droite
Le dcalage vers la gauche propage des 0 dans la variable. Cela correspond une multiplication par 2. Le dcalage vers la droite propage la valeur du bit de poids fort dans la variable. Cela correspond une division (entire) par 2. 4.3 L'oprateur d'affectation C'est le signe =. L'affectation multiple est possible: L'valuation se fait alors de la droite vers la gauche. Exemple: a = b = c = 0; En langage C, la notion de variable n'est pas assez prcise. Il faut introduire la notion de lvalue (left-value), c'est--dire tout ce qui peut apparatre gauche d'une affectation.
PS/LANGAGES
Page 23
4.4 Combinaison d'oprateurs L'oprateur d'affectation peut tre associ chacun des oprateurs prcdents pour des abrviations d'criture. x ope = i x = x ope i Exemples: i += 20; i = i + 20; i -= 10; i = i - 10; k *= i; k = k * i; k /= i; k = k / i; 4.5 Incrmentation / Dcrmentation Les oprateurs d'incrmentation et de dcrmentation ne s'appliquent qu' un seul oprande. i = ++j; pr-incrmentation j = j + 1; puis i = j; i = j++; post-incrmentation i = j; puis j = j + 1; i = --j; pr-dcrmentation j = j - 1; puis i = j; i = j--; post-dcrmentation i = j; puis j = j - 1; En prfixe, l'incrmentation ou la dcrmentation est ralise AVANT utilisation. En suffixe, l'incrmentation ou la dcrmentation est ralise APRES utilisation. Exemples: au dbut de chaque ligne i vaut 3 et j vaut 15 quivalence rsultat i = ++j; j = j + 1; i = j; i = 16; j = 16; i = j++; i = j; j = j + 1; i = 15; j = 16 i++; i = i + 1; i=4 j = ++i + 5; i = i + 1; j = i + 5; i = 4; j = 9 j = i++ + 5; j = i + 5; i = i + 1; i = 4; j = 8 4.6 Les oprateurs relationnels
Les oprateurs relationnels apparaissent dans des expressions boolennes qui prennent une des deux valeurs VRAI ou FAUX. En C, le VRAI est diffrent de 0 et le FAUX est gal 0.
Rle Strictement suprieur Suprieur ou gal Strictement infrieur Infrieur ou gal Egal Diffrent de
MAttention l'erreur souvent rencontre = (affectation) au lieu de == (comparaison) dans une expression boolenne. Cette erreur est rarement signale par les compilateurs (quelques compilateurs avertissent au moyen d'un warning) car l'affectation est une instruction possible mme dans une expression boolenne.
PS/LANGAGES Page 24
4.7 Les oprateurs logiques Symbole Rle Le rsultat d'une somme logique est vrai si au moins un oprande est || vrai. Le rsultat d'un produit logique est vrai si tous les oprandes sont vrais. && On appelle complment d'une variable x, la variable note !x telle que : ! x = 0 !x 0 x = 'A' !x 'A' Remarques : dans le cas expr1 || expr2 : si expr1 est vraie, expr2 n'est pas value. dans le cas expr1 && expr2 : si expr1 est fausse, expr2 n'est pas value. 4.8 Oprateur ternaire ou oprateur conditionnel a = expr1 ? expr2 : expr3 ; Si expr1 est VRAI, on value expr2 sinon on value expr3 Exemple: maximum = (a > b) ? a : b ; maximum prend la valeur maximum entre a et b. 4.9 Oprateur squentiel exp1, exp2 Le but de cet oprateur , (virgule) est de garantir l'ordre d'valuation des expressions exp1 et exp2. La valeur retourne par cet oprateur est exp2. Exemple : resultat = (a=1, b=3, c=a+b); resultat contient la valeur de c aprs valuation de a=1 et b=3 soit 4. 4.10 Oprateurs d'adressage Ces oprateurs sont lis la notion de pointeurs. Symbole Rle Adresse de & Contenu de l'objet point par * 4.11 L'oprateur sizeof sizeof donne la taille en octets de l'oprande sizeof(objet) ou sizeof(type) Le rsultat est de type size_t dfini dans le fichier stddef.h (type long en gnral). Cet oprateur est indispensable pour assurer la portabilit des programmes.
PS/LANGAGES
Page 25
4.12 Autres oprateurs Ces oprateurs sont lis la notion de structure. Symbole Rle Membre de la variable . Membre de la variable point par ->
4.13 Priorits des oprateurs Les rgles de priorit et d'associativit fixent l'ordre d'valuation des diffrents oprateurs au sein d'une expression. Priorit Oprateurs Signification
15 () Expression [] Indice -> Membre d'une structure pointe . Membre d'une structure ! Non logique ~ Complment un ++ Incrmentation -Dcrmentation +Signe (oprateur unaire) (type) Casting * Elment point & Adresse de sizeof() Taille de * Multiplication / Division % Modulo + Addition Soustraction << Dcalage gauche >> Dcalage droite < Infrieur > Suprieur <= Infrieur ou gal >= Suprieur ou gal == Egal != Diffrent de & ET bit bit ^ OU exclusif bit bit | OU bit bit && ET logique || OU logique ?: Expression conditionnelle (ternaire) = Affectation +=, *=, /=, ^=, &=, <<=, >>=, Affectations diverses , Oprateur squentiel
Associativit
de gauche droite
14
de droite gauche
13
de gauche droite
12 11 10
9 8 7 6 5 4 3 2 1
de gauche droite de gauche droite de gauche droite de gauche droite de gauche droite de gauche droite de droite gauche de droite gauche de gauche droite
Dans le cas o deux oprateurs se trouvent au mme niveau de priorit, la priorit est relative au sens d'valuation.
PS/LANGAGES
Page 26
L'ordre d'valuation des oprandes est quelconque en C et n'est pas influenc par les parenthses sauf pour les oprateurs &&, ||, ?:, et ,. Exemple: L'criture a[i] = i++ est incorrecte car on ne sait pas si i est incrment avant d'accder au tableau ou aprs. L'criture correcte serait: a[i] = i; i++; /* ou l'inverse suivant ce que dsire le programmeur */ Autre exemple d'criture incorrecte i = 0; while (i < MAX) dest[i] = source[i++]; Il faut crire i = 0; while (i < MAX) { dest[i] = source[i]; i++; } Ces absences de spcification ne sont pas une faiblesse du C mais une force. Pour tirer le meilleur parti du matriel, C laisse la dcision au fabricant. Il vaut mieux ne pas crire de code qui dpende de l'ordre d'valuation pour garder une bonne portabilit. 4.14 Remarques sur les rgles de prcdence Soit les expressions suivantes: a = b = c = 2; Associativit de droite gauche a = b = ( c = 2 ); a = ( b = ( c = 2 ) ); ( a = ( b = ( c = 2 ) ) ); a | b & c * d; Associativit de gauche droite mais priorits dcroissantes : *:(13); &:(8); |:(6) a | b & ( c * d ); a | ( b & ( c * d ) ); ( a | ( b & ( c * d ) ) ); a || b || c || d; Associativit de gauche droite ( a || b ) || c || d; ( ( a || b ) || c ) || d; ( ( ( a || b ) || c ) || d );
PS/LANGAGES
Page 27
PS/LANGAGES
Page 29
Composition de la chane format: %[drapeaux][largeur][.prcision][interprtation du type]caractre de conversion La chane de caractres format contient des caractres ordinaires et des spcifications de conversion, dont chacun provoque la conversion et l'impression de l'un des arguments. Chaque spcification de conversion commence par le caractre % et se termine par un caractre de conversion. Entre les deux, on peut placer dans l'ordre des drapeaux, une largeur, une prcision, une interprtation du type. Caractres de conversion Caractre d, i o u x, X f Type de l'argument int int int int double Converti en notation dcimale signe notation octale non signe notation dcimale non signe notation hexadcimale non signe en utilisant abcdef pour x ou ABCDEF pour X notation dcimale de la forme : [-]mmm.ddd, o le nombre de d est donn par la prcision (6 par dfaut); si la prcision vaut 0, le point dcimal est supprim notation dcimale de la forme [-]m.ddd e[+/-]xx ou [-]m.ddd E[+/-]xx o le nombre de d est donn par la prcision l'impression se fait suivant le format %e ou %E si l'exposant est infrieur -4 ou suprieur ou gal la prcision; sinon suivant %f. Les zros ou le point dcimal la fin ne sont pas imprims un seul caractre, aprs conversion en unsigned char les caractres d'une chane sont imprims jusqu'au '\0' ou aprs avoir imprim le nombre de caractres indiqu par prcision crit l'argument suivant le format du type pointeur le nombre de caractres crits jusqu' prsent est crit dans l'argument. Ne convertit pas d'argument imprime un %
e, E
double
g, G
double
c s
int char *
p n %
void * int *
Drapeaux : cadre l'argument converti gauche, dans son champ d'impression. - (moins) imprime systmatiquement le signe du nombre. + (plus) espace si le premier caractre n'est pas un signe, place un espace au dbut. pour les conversions numriques, complte le dbut du champ par des 0 zros. spcifie un format de sortie diffrent. Pour o, le premier chiffre sera 0. # Pour x ou X, le prfixe correspondant 0x ou 0X si le rsultat est non nul. Pour e, E, f, g, et G, la sortie comportera un point dcimal. Pour g et G, les zros de terminaison seront conservs.
PS/LANGAGES
Page 30
Largeur
fixe la largeur minimale (signe compris), du champ d'impression, cadrage droite. Si l'argument possde moins de caractres que le nombre indiqu, il sera complt par des caractres de remplissage (0 ou espaces).
Prcision prcd d'un point, le nombre maximal de caractres afficher droite du point dcimal. Interprtation du type h short int pour d, i, o, u x l long int pour d, i, o, u, x l double pour E, e, f, g, G L long double
PS/LANGAGES
Page 31
Exemples d'utilisations de printf Programme #include <stdio.h> main() { char chaine[10]="Monsieur"; int i; printf("%d\n",-12); printf("%5d\n",-12); printf("%05d\n",-12); printf("%-5d\n",-12); printf("%u\n",-12); printf("%o\n",12); printf("%o\n",-12); printf("%x\n",12); printf("%#x\n",12); printf("%#o\n",12); printf("%0X\n",12); printf("%X\n",-12); printf("%f\n",3.142); printf("%3f\n",3.142); printf("%#f\n",3.142); printf("%3.2f\n",3.142); printf("%1.2f\n",31.427); printf("%+1.2f\n",31.427); printf("%+1.2e\n",31.427); printf("%+5.1E\n",31.427); printf("%1.3g\n",31.427); printf("%#g\n",31.427000); printf("%+5.1g\n",31.427); printf("%+5.2g\n",31.427); printf("%c\n",'a'); printf("%3c\n",'a'); printf("%-3c\n",'a'); printf("%d\n",'a'); printf("%x\n",'a'); printf("%s\n","Bonjour, M"); printf("%4s\n","Bonjour, M"); printf("%.4s\n","Bonjour, M"); printf("%-4s\n","Bonjour, M"); printf("%.20s\n","Bonjour, M"); printf("%10s\n","Bonjour, M"); printf("%-10s\n","Bonjour, M"); printf("%10.4s\n","Bonjour, M"); printf("%-10.4s\n","Bonjour, M"); printf("%s\n",chaine); printf(chaine); printf("\nBonjour %n, M",&i); printf("\nla valeur de i est : %d",i); } b reprsente le caractre espace
PS/LANGAGES Page 32
Rsultat
-12 bb-12 -0012 -12bb 4294967284 14 37777777764 c 0xc 014 C FFFFFFF4 3.142000 3.142000 3.142000 3.14 31.43 +31.43 +3.14e+01 +3.1E+01 31.4 31.4270 +3e+01 bb+31 a bba abb 97 61 Bonjour, M Bonjour, M Bonj Bonjour, M Bonjour, M Bonjour, M Bonjour, M bbbbbbBonj Bonjbbbbbb Monsieur Monsieur Bonjour , M la valeur de i est : 9 Ralisation sur DPX20
Cas d'erreurs Dans le cas o le nombre d'arguments ne correspond pas au format, C cherche toujours satisfaire le contenu du format. printf ("%s",p,q ); printf ("%d %d",p ); q ne sera pas trait. affichage de deux valeurs l'une juste l'autre indtermine.
5.3 Les entres mises en forme Les fonctions scanf convertissent les donnes en entre suivant un format int fscanf(FILE *stream, const char *format, [arguments]); fscanf lit les donnes du flot stream d'aprs les spcifications de format et affecte les valeurs converties aux arguments suivants, chacun de ceux-ci devant tre un pointeur. Elle rend la main quand toute la chane format a t parcourue et retourne EOF si une erreur est survenue sinon le nombre d'objets convertis et affects. int scanf(const char *format, [arguments]); scanf quivaut fscanf(stdin,const char * format, [arguments]); int sscanf(char *s,const char * format, [arguments]); sscanf est similaire scanf, mis part que les caractres en entre sont extraits de la chane de caractres s. La chane de caractres format contient des spcifications de conversion utilises pour diriger l'interprtation de l'entre. Elle peut contenir: Des espaces ou des caractres de tabulation qui seront ignors. Des caractres ordinaires dont chacun est suppos s'identifier au caractre suivant du flot d'entre. Des spcifications de conversion, composes d'un %, d'un caractre facultatif de suppression d'affectation (*), d'un nombre facultatif donnant la largeur maximale du champ, des caractres h, l, L indiquant la largeur de l'emplacement de rception et d'un caractre de conversion.
PS/LANGAGES
Page 33
Caractres de conversion Caractre d i o u x e, f, g c Type de l'argument int * int * int * unsigned int* int * float * char * Converti en Entier sous forme dcimale Entier pouvant tre sous forme octal si prcd de 0, ou sous forme hexadcimale si prcd de 0x ou 0X Entier sous forme octale Entier non sign sous forme dcimale Entier sous forme hexadcimale Nombre en virgule flottante Les caractres suivants en entre sont placs dans le tableau indiqu jusqu' la largeur du champ (par dfaut 1) Chane de caractres ne contenant pas d'espace. Le caractre '\0' sera ajout. Pointeur comme l'imprimerait printf("%p"). Ecrit dans l'argument le nombre de caractres lus jusqu' prsent par cet appel de scanf. S'identifie la plus longue chane de caractres en entre compose de caractres faisant partie de l'ensemble entre crochets. Un caractre '\0' est ajout. S'identifie la plus longue chane de caractres en entre compose de caractres ne faisant pas partie de l'ensemble entre crochets. Un caractre '\0' est ajout.
s p n [...]
[^...]
char *
Les caractres de conversion d, i, n , o, u et x peuvent tre prcds de h si l'argument est un pointeur sur un short ou par l si l'argument est un pointeur sur un long. Les caractres de conversion e, f, et g peuvent tre prcds de l si l'argument est un pointeur sur un double ou par L si l'argument est un pointeur sur un long double.
PS/LANGAGES
Page 34
Exemples d'utilisations de scanf Tous les appels scanf sont prcds d'un appel la fonction fflush(stdin) permettant de vider le buffer (prcaution trs utile). Programme #include <stdio.h> main() { int i,a,b,h,m,s; unsigned short sh; char c,d; char tab[20]; scanf("%d",&a); scanf("%2d",&a); scanf("%2d%2d",&a,&b); scanf("%d",&a); scanf("%d",&a); scanf("%d,%d",&a,&b); scanf("%d%d",&a,&b); scanf("%dplus%d",&a,&b); scanf("%c%c",&c,&d); scanf("%c%c",&c,&d); scanf("%cb%c",&c,&d); scanf("%2c%c",&c,&d); scanf("%*2c%d",&a); i=scanf("%d%*s%d%*s%d", &h,&m,&s); i=scanf("%[ON]",&c); i=scanf("%[ON]",&c); i=scanf("%[ON]",&c); scanf("%s",tab); scanf("%[^\n]",tab); scanf("%hu",&sh); scanf("%hu",&sh); } b reprsente le caractre espace Ralisation sur DPX20 Saisie Rsultat
1234 1234 123456 1234abc abc1234 12,34 12b34 3plus4 xby xyz xby xyz 1997 12heuresb30minutesb10sec Y O N Bonjour, Matre Bonjour, Matre 35000 70000
a = 1234 a = 12 a = 12 b = 34 a = 1234 a indtermin a = 12 b = 34 a = 12 b = 34 a=3b=4 c = 'x' d = 'b' c = 'x' d = 'y' c = 'x' d = 'y' c = 'x' d = 'z' a = 97 h = 12 m = 30 s = 10 i=3 c indtermin i = 0 c = 'O' i = 1 c = 'N' i = 1 tab = 'Bonjour,' tab = 'Bonjour, Matre' sh = 35000 sh = 4464
PS/LANGAGES
Page 35
Fonctionnement du scanf La fonction est mise en oeuvre ds que le retour chariot est frapp. Elle analyse les caractres saisis au clavier jusqu' ce qu'elle rencontre un type incompatible ou que la largeur maximale est atteinte. Elle stocke la valeur dans l'argument correspondant (c'est pour cela qu'elle doit connatre son adresse) et reprend l'analyse pour l'argument suivant. La fonction est interrompue ds qu'un caractre saisi est incompatible avec l'argument courant. En cas de saisie d'une chane de caractres, le caractre '\0' est ajout en fin de chane. La fonction traite les donnes partir du buffer. Si la fin de l'excution du scanf, le buffer n'est pas vide, les informations sont conserves et traites lors d'un autre appel d'un scanf (ou de toute autre fonction d'entre).
M D'o la ncessit de faire appel presque systmatiquement fflush(stdin) avant chaque appel une fonction d'entre utilisant le buffer.
Cas d'erreurs Dans le cas o le nombre d'arguments ne correspond pas au format, C cherche toujours satisfaire le contenu du format. Si la taille de l'argument est plus grande que le format, la valeur obtenue sera errone, dans le cas inverse, l'emplacement mmoire conscutif sera cras. Exemple: #include <stdio.h> main() { char tab1[10] = "", tab2[10] = ""; scanf("%s",tab1); } A l'excution, on saisit "abcdefghijklmnopq" tab1 contient "abcdefghij" tab2 contient "mnopq"
5.4 Les fonctions d'entres-sorties de caractres int fgetc(FILE *stream); fgetc retourne le caractre suivant du flot stream, lu comme un unsigned char (converti en int) ou bien EOF si erreur ou fin de fichier. char * fgets(char *s, int n, FILE *stream); fgets lit au plus les n-1 caractres suivants du flot stream et les place dans le tableau s. Le caractre '\0' est copi dans le tableau. int fputc(int c, FILE *stream); fputc crit le caractre c (converti en unsigned char) sur le flot stream et retourne le caractre crit ou EOF.
PS/LANGAGES
Page 36
int fputs(const char *s, FILE *stream); fputs crit la chane de caractres sur le flot stream. Elle retourne une valeur positive ou nulle ou EOF en cas d'erreur. int getc(FILE *stream); getc quivaut fgetc mis part que si c'est une macro, elle peut valuer stream plusieurs fois. int getchar(void); getchar quivaut getc(stdin). C'est une macro dfinie dans stdio.h char *gets(char *s); gets lit la ligne suivante en entre et la place dans le tableau s. Elle remplace le caractre de fin de ligne par '\0'. Cette fonction est souvent plus avantageuse pour la lecture d'une chane de caractre car elle ignore les espaces contrairement au scanf. int putc(int c, FILE *stream); putc quivaut fputc. int putchar(int c); putchar quivaut putc(c, stdout). C'est une macro dfinie dans stdio.h. int puts(const char *s); puts crit la chane de caractres s et un caractre de fin de ligne sur stdout. int ungetc(int c, FILE *stream); ungetc remet c (en unsigned char) sur le flot stream, o il sera retrouv la prochaine lecture. On ne peut remettre EOF dans le flot.
PS/LANGAGES
Page 37
5.5 Squences de contrle ansi En plus des codes ASCII, il est possible de grer l'cran et le curseur en utilisant un ensemble de codes dits "codes ANSI". Ces codes sont reconnus par les ordinateurs en chargeant un pilote spcifique (ANSI.SYS sous DOS). Les principaux codes ANSI sont les suivants: Rle Effacement ligne Effacement cran Positionnement du curseur Code ANSI x1B[K Efface partir du curseur x1B[2J x1B[l;cH Dplace le curseur la position l : numro de ligne c : numro de colonne x1B[#A x1B[#B x1B[#C x1B[#D x1B[#m Dplace de curseur de # lignes vers le haut Dplace de curseur de # lignes vers le bas Dplace le curseur de # colonnes droite Dplace le curseur de # colonnes gauche 30 Noir 31 Rouge 32 Vert 33 Jaune 34 Bleu 35 Magenta 36 Cyan 37 Blanc 40 Noir 41 Rouge 42 Vert 43 Jaune 44 Bleu 45 Magenta 46 Cyan 47 Blanc 0 Aucun 1 Gras 2 Rduit 3 Italique 4 Soulign 5 Clignotant 6 Rapide 7 Inverse 8 Cach
Dplacement du curseur - vers le haut - vers le bas - vers la droite - vers la gauche Couleurs des caractres
Couleurs de fond
x1B[#m
x1B[#m
Exemples : ou
printf("\x1B[2J") printf("\33[2J");
Remarque : Sous TURBO C, ces possibilits sont rarement utilises car la bibliothque de TC fournit des fonctions d'affichage performantes dont les prototypes sont dans conio.h.
PS/LANGAGES Page 38
Les intructions en C
6. LES INSTRUCTIONS EN C
Le corps d'un programme est compos d'instructions. 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 (dconseill) en indiquant le saut de ligne par un antislash. Elles correspondent des affectations ou des appels de fonctions. instruction; Les instructions composes sont des squences d'instructions simples encadres par des accolades. Il s'agit en fait de la notion de bloc. { instruction; instruction; ...instruction; } ou prsentation plus claire et conseille { instruction; instruction; ... instruction; } Dans tout le chapitre, lorsque l'on emploiera le terme <instruction>, on dsignera une instruction simple ou une instruction compose. Une instruction de contrle est une instruction qui permet de rompre l'excution squentielle du programme. 6.1 L'instruction if-else if (condition) <instruction1> [else <instruction2>] Remarques: - la condition est obligatoirement entre parenthses. - la clause else si elle existe se rapporte au if le plus proche. Exemples: Instructions int i = 3, j = 5; if (i <j) printf ("%d < %d ", i, j); int i = 30, j = 5; if (i <j) printf ("%d < %d ", i, j); else printf ("%d >= %d ", i, j);
PS/LANGAGES Page 39
Excution
3<5
30 >= 5
Les intructions en C
Autre exemple: int nbcoeff; float somme_notes, moyenne; ... if (nbcoeff != 0) { moyenne = somme_notes / nbcoeff; printf("La moyenne est : %5.2f\n", moyenne); } else { printf("Calcul de la moyenne impossible\n"); printf("Recommencez\n"); } 6.2 L'instruction d'aiguillage switch Le switch est une instruction de choix multiple qui effectue un aiguillage direct vers des instructions en fonction d'une valeur discrte (rsultat de l'expression). switch (expression) { case expression_constante1 : <instruction> case expression_constante2 : <instruction> ... [default : <instruction>] } Les diffrents cas possibles servent d'tiquette; lorsque le traitement d'un cas est termin, l'excution continue par le traitement du cas suivant jusqu' ce que l'on sorte explicitement du switch.. On sort gnralement du switch grce aux instructions break ou return. Expression doit tre d'un type entier (ou caractre). Expression_constante est une constante entire et doit tre unique. Si plusieurs valeurs correspondent la mme squence d'instructions, les "case" sont numrs les uns la suite des autres. Si l'instruction default est prsente, elle doit contenir obligatoirement au moins une instruction. Exemple: switch(jour) /* jour =1 lundi; jour = 2 mardi etc...*/ { case 1: case 2: case 3 : case 4 : case 5 : puts("Au travail !"); break; case 6 : puts("Au jardin et "); case 7 : puts("Repos"); break; default : puts("Jour de la semaine non valide"); }
PS/LANGAGES Page 40
Les intructions en C
6.3 La boucle while while (expression) <instruction> Tant que la condition est ralise (condition non nulle), l'instruction est excute. L'instruction value expression avant de commencer la boucle. Si expression vaut 0 au dpart, l'instruction ne sera pas excute. Exemples: n = 100; while (n > 0) { instruction1; instruction2; n--; } n = 100; while (n--) { instruction1; instruction2; }
/* Cette instruction provoque l'excution */ /* des instructions 100 fois avec n initial valant 100 */
/* Cette instruction provoque l'excution /* des instructions 100 fois avec n initial valant 99
*/ */
6.4 La boucle for for(expr1 ; expr2 ; expr3) <instruction> Cette boucle peut tre remplace (sauf cas d'utilisation de continue) par la prcdente de la faon suivante: expr1; while (expr2) { <instruction> expr3; } En gnral, expr1 et expr3 sont des affectations ou des appels de fonction et expr2 est une expression boolenne. Aucune des trois expressions n'est obligatoire, mais les points virgules devront toujours tre prsents. Lorsque expr2 est absente, elle est quivalente 1 (VRAI). Exemples : int i, tableau[10]; for(i = 0; i < 10; i++) tableau[i] = 0; for(;;); /* boucle infinie */
M Dans le cas gnral, attention ne pas mettre de ; aprs le for car le ; termine
l'instruction donc le for.
PS/LANGAGES
Page 41
Les intructions en C
6.5 La boucle do...while do <instruction> while (expression); Au contraire du while et du for qui testent leur condition d'arrt en tte de boucle, le do while la teste la fin, aprs chaque passage dans le corps de la boucle qui s'excute donc au moins une fois. Exemple : int i = 0; do { i--; printf("i = %d\n", i); } while (i > 0);
Excution Affiche i = -1
6.6 Les instructions break et continue (sauts associes aux boucles) L'instruction break L'instruction break fournit un moyen de sortir (passer l'instruction suivant la boucle). Elle ne permet cependant que de sortir de la boucle la plus interne. Exemple: int i, tableau[10]; for (i = 0; i < 10; i++) { if (tableau[i] == 0) break; tableau[i] = tableau[i] + 1; }
L'instruction continue l'instruction continue fait dbuter l'itration suivante de la boucle, en sautant la squence d'instructions comprise entre le continue et la fin de la boucle. Exemple: int i, tableau[10]; for (i = 0; i < 10; i++) { if (tableau[i] == 0) continue; tableau[i] = tableau[i] + 1; }
PS/LANGAGES
Page 42
Les intructions en C
6.7 L'instruction return return [expression]; L'instruction return permet de sortir d'une fonction. Exemples: return; return expression;
/* la fonction s'interrompt et rend la main la fonction appelante */ /* renvoie la valeur de l'expression la fonction appelante */
6.8 L'instruction goto goto label; L'instruction goto est associe un identificateur symbolique spcifiant l'endroit o doit tre effectu le branchement inconditionnel. Exemple: ... goto label; ... label: ... Son emploi doit tre vit au maximum car contraire l'esprit de programmation structure.
PS/LANGAGES
Page 43
Les fonctions
7. LES FONCTIONS
Une fonction est un sous-programme qui reoit ventuellement des arguments en entre (ces arguments sont toujours des valeurs) et qui retourne ventuellement une valeur d'un certain type vers la fonction appelante. L'criture d'une fonction se fait en plusieurs tapes: On dfinit ce dont elle a besoin en entre pour effectuer la tche qui lui incombe et ce qu'elle retourne en sortie. L'tape suivante consiste dfinir 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. Enfin, la dfinition de la fonction consiste crire le corps de la fonction (coder le traitement attendu). Cette dfinition peut tre place dans le mme fichier source que la fonction appelante ou dans un autre fichier. Il n'y a pas de possibilit d'imbrication des fonctions. 7.1 Dfinition de fonction Syntaxe d'une fonction: [type-de-retour] nom-de-fonction([dclarations d'arguments]) { bloc } Type de retour Cette donne indique le type du rsultat renvoy par la fonction. Ce type peut tre simple (int, char ...) , une adresse (pour les tableaux) ou un type structur. Si la fonction ne renvoie aucun rsultat, on utilise le type 'void'. S'il n'est pas prcis. le type d'une fonction est par dfaut de type int. Nom-de-fonction Le nom d'une fonction peut tre n'importe quel identificateur valide. Dclarations d'arguments Ce sont les donnes venant de l'extrieur qui sont ncessaires l'excution de la fonction. Ils sont placs entre parenthses. Dans tous les cas, ces dernires devront tre prsentes. La position des paramtres est primordiale. Si la fonction reoit des paramtres, ils seront dclars sous la forme: type <identificateur>, type <identificateur>... Il est bien vident que le type dclar dans la fonction appele doit tre le mme que dans la fonction appelante.
PS/LANGAGES
Page 45
Les fonctions
Chaque paramtre est spar d'un autre par une virgule. Les paramtres sont : - de la classe automatique. - locaux la fonction o ils sont dclars. - crs par recopie dans la pile. - dtruits la fin de l'excution de la fonction. Bloc de la fonction Celui ci commence par une accolade ouvrante et se termine par une accolade fermante. A l'intrieur, on trouve, dans l'ordre : 1- La dclaration des variables locales. 2- Les instructions (ou blocs d'instructions) de la fonction. 7.2 Appel d'une fonction Une fonction est appele par 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. Exemples: fonct1(); fonct2(a, 3); resultat = fonct3(i, j); fonct4(k+2, 4); 7.3 Passage de paramtres Les paramtres sont initialiss automatiquement avec les valeurs passes par l'appelant. A l'appel de la fonction avec les paramtres rels (effectifs), ceux-ci sont recopis dans les paramtres formels (de la fonction) et celle-ci travaille sur ces copies locales stockes dans la pile. A la sortie de la fonction, la zone de la pile occupe par les paramtres est libre sans sauvegarde des donnes. Les valeurs des paramtres redeviennent donc celles d'avant l'appel de la fonction. Les variables de la fonction appelante ne sont jamais modifies au retour de la fonction. Si une fonction reoit en argument la valeur d'une adresse, elle la stocke dans un pointeur. Elle peut ensuite, en utilisant le contenu de l'objet point, modifier la variable dont elle a reu l'adresse. La modification d'une variable par une fonction est ralise en passant un pointeur sur la variable. Au retour de la fonction, le pointeur lui-mme n'est pas altr.
PS/LANGAGES
Page 46
Les fonctions
7.4 Retour du rsultat Une fonction peut tre porteuse d'un rsultat aprs son excution. Ceci sera fait grce l'instruction return; Cette instruction interrompt le droulement de la fonction et excute le retour au programme appelant. Si le type de la variable figurant dans return est diffrent de celui de la fonction , la conversion est faite automatiquement. On ne peut pas trouver de return dans une fonction de type void. On peut trouver plusieurs return dans une fonction bien que ce soit contraire la notion de programme propre en programmation structure. 7.5 Prototypes des fonctions Placs en tte du programme (au minimum avant 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. - d'utiliser les fonctions dans n'importe quel ordre. Le prototype d'une fonction est la dclaration de la fonction. Il n'y a l'excution aucun contrle ni sur le nombre ni sur le type des paramtres. D'o l'intrt d'utiliser un prototype systmatique afin de dtecter la compilation les erreurs non dceles l'excution.
PS/LANGAGES
Page 47
Les fonctions
7.6 Exemples Ecrire une fonction permettant de calculer le prix TTC en fonction du prix HT et de la TVA. 1re tape: la boite noire
float tva Calcul TVA float prix_ht float prix_ttc
2me tape : le prototype float calcul_prix_ttc (float tva, float prix_ht); ou float calcul_prix_ttc (float, float); Il n'est pas ncessaire d'indiquer au niveau du prototype le nom des arguments. Notez le ; obligatoire dans la dclaration du prototype. 3me tape : la dfinition de la fonction float calcul_prix_ttc (float tva, float prix_ht) { float ttc; ttc = (prix_ht * tva / 100) + prix_ht; return (ttc); } Utilisation de cette fonction: #include <stdio.h> /* prototypes des fonctions utilises par le programme */ float calcul_prix_ttc (float, float); main() { float prix_achat, tauxtva, prixtotal; puts ("Entrez le prix d'achat : "); scanf ("%f", &prix_achat); puts ("Entrez le taux de la TVA :"); scanf ("%f", &tauxtva); prixtotal = calcul_prix_ttc(tauxtva, prix_achat); printf("Le montant total est : %5.2f", prixtotal); }
PS/LANGAGES
Page 48
Les fonctions
void fonc(char ); main() { char c = 'a'; fonc(c); putchar(c); } void fonc(char car) { putchar(car); car = 'b'; putchar(car); } L'excution de ce programme donne aba. Explication: Pile Pile
Pile
Pile
car c
a a
car c
b a
Excution de car = 'b' Fin de la fonction C'est dans la pile qu'a Dpilement et retour lieu la modification au main putchar(car)b putchar(c)a
PS/LANGAGES
Page 49
M Les indices commencent zro. M Les dbordements ne sont pas grs par le compilateur.
Le langage C dispose de pointeurs, c'est--dire de variables destines contenir des adresses d'autres objets (variables, fonctions etc...). A priori, ces deux notions de tableaux et de pointeurs paraissent loignes. Mais il se trouve qu'en C, un identificateur de tableau est une constante pointeur. Ce n'est pas une lvalue. Toute opration que l'on peut effectuer par indexation sur des tableaux peut tre ralise l'aide des pointeurs. 8.1 Les tableaux un indice Exemple : crer un tableau de 10 notes; calculer et afficher la moyenne #include <stdio.h> main() { int i, somme = 0; float moyenne; float note[10];
for (i=0 ; i<10 ; i++) { printf("Donnez la note N%d : ",i+1); scanf("%f",¬e[i]); somme += note[i]; } moyenne = somme / 10; printf("la moyenne est de %5.2f",moyenne); } Remarque : la construction suivante est correcte: #define MAX 10 ... int tab[MAX]; Par contre, elle ne serait pas correcte si on dfinissait N de la faon suivante: const int N = 10; car N n'est pas ici une expression constante. En effet, dans certaines conditions, selon l'implmentation, N pourrait tre modifi par une fonction qui recevrait un pointeur sur N.
PS/LANGAGES Page 51
8.1.1 Initialisation d'un tableau un indice La dclaration int tab[5] = {10,20,30,40,50}; place les entiers 10,20,30,40,50 dans chacun des 5 lments du tableau. Il est obligatoire de mentionner les dimensions du tableau la dclaration sauf s'il est initialis aussitt. Exemples: static char tabcart[] = {a,b,c,'\0'}; /* ou */ static char tabcart[] = "abc"; /* idem */ Si le nombre d'initialisateurs est infrieur la taille du tableau, les autres lments sont mis zro dans le cas des variables externes ou statiques, mais pour les variables automatiques, ils prennent une valeur quelconque. Il n'est pas possible d'initialiser un lment au milieu d'un tableau sans donner galement toutes les valeurs prcdentes. Exemple: static int tabent[10] = {2,3,4}; /* tableau de 10 entiers dont les 3 */ /* premiers ont pour valeur 2,3,4 */ /* les suivantes sont 0 */ Un tableau dclar static est initialis par dfaut 0 ou '\0' 8.2 Les tableaux multidimensionnels En langage C, un tableau multidimensionnel est en fait un tableau une seule dimension dont chaque lment est un tableau (uni ou multidimensionnel). Lorsque le compilateur rencontre une dclaration telle que int tab[5][9]; il rserve un tableau de 45 (5 * 9) lments. Un lment quelconque de ce tableau se note tab[3][2] ou tab[i][j] ou tab[i+2][j-1]. Les lments de ce tableau sont rangs en mmoire suivant l'ordre obtenu en faisant varier le dernier indice en premier. Exemple pour le tableau tab
tab[0][0] tab[0][1] tab[0][2] ... tab[1][0] tab[1][1] tab[1][2] ... tab[2][0] ...
Cet ordre a une incidence dans plusieurs circonstances: - lorsque l'on omet de prciser certaines dimensions du tableau - lorsque l'on dsire accder l'aide d'un pointeur aux diffrents lments d'un tableau. - lorsque l'un des indices dborde. tab[1][1] est une lvalue alors que tab[1] n'en est pas une. tab[1] est l'adresse du tableau tab[1] et est gal &tab[1][0]. 8.2.1 Initialisation d'un tableau multidimensionnel int tab[3][4] = { {1,2,3,4}, {5,6,7,8}, {9,10,11,12} }; ou plus simplement int tab[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; La premire forme consiste considrer le tableau tab comme form de 3 tableaux de 4 lments. La seconde exploite la manire dont sont rangs les lments en mmoire.
PS/LANGAGES Page 52
8.3 Les chanes de caractres Une chane de caractres est en fait un tableau particulier. Elle est donc dclare de la mme manire. char nom[10]; /* tableau de 10 caractres mais 9 caractres utiles */
Lors de l'initialisation de la chane de caractres, le systme ajoute systmatiquement un marqueur de fin de chane ('\0'). La chane doit pouvoir contenir ce caractre. Une chane dclare de longueur n contiendra n-1 caractres utiles.
MSi la chane n'est pas assez longue pour contenir le caractre ' \0 ' , ce dernier sera omis et la chane ne pourra pas tre utilise comme telle.
Exemple: main() { static char chaine[] = "bonjour"; /* ou static char chaine[8] = "bonjour"; */ printf("chane contient: %s\n",chaine); }
8.3.1 Fonctions de traitement sur les chanes de caractres Les fonctions sur les chanes, dclares dans le fichier d'en-tte string.h ont des noms qui commencent par str ou mem. Dans l'ensemble de ces fonctions, aucun contrle n'est effectu sur la longueur des zones rceptrices. En cas de manque de place, les emplacements contigus sont crass. 8.3.1.1 strcpy (string.h) char* strcpy(char *sl, const char *s2); Copie la chane s2, y compris '\0' dans s1 et retourne l'adresse de s1 ou NULL si la copie n'a pas pu se faire correctement. 8.3.1.2 strncpy (string.h) char* strncpy(char *sl, const char *s2, size_t n); Copie au plus n caractres de s2 dans s1 et retourne l'adresse de s1 ou NULL si la copie n'a pas pu se faire correctement. Complte par des '\0' si s2 comporte moins de n caractres.
PS/LANGAGES
Page 53
8.3.1.3 strcat (string.h) char* strcat(char *s1, const char *s2); Concatne la chane s2 dans s1 et retourne l'adresse de la chane rsultante (sl) ou NULL si l'opration n'a pas pu se faire correctement. Le caractre de fin de chane est copi automatiquement la fin de la nouvelle chane s1. La concatnation s'effectue partir du caractre de fin de chane de sl qui est effac. 8.3.1.4 strncat (string.h) char* strncat(char *s1, const char *s2, size_t n); Concatne au plus n caractres de la chane s2 dans s1 et retourne l'adresse de la chane rsultante (sl) ou NULL si l'opration n'a pas pu se faire correctement. Complte par des '\0' si s2 comporte moins de n caractres. 8.3.1.5 strcmp (string.h) int strcmp(const char *sl, const char *s2); Compare lexicographiquement deux chanes dans l'ordre des caractres dfinis par le code ASCII et renvoie un entier < 0 si sl < s2. = 0 si sl = s2. > 0 si sl > s2. La fonction effectue la comparaison partir du premier caractre de chaque chane et continue avec les caractres suivants jusqu ce que les caractres soient diffrents l'un de l'autre ou que l'une des chanes soit termine. 8.3.1.6 strncmp (string.h) int strncmp(const char *sl, const char *s2, size_t n); Compare au plus n caractres de s1 la chane s2 et renvoie un entier de la mme faon que strcmp. 8.3.1.7 strchr (string.h) char *strchr(const char * s1, int c); Retourne un pointeur sur la premire occurrence de c dans s1, ou NULL si c ne figure pas dans s1. c est un int converti en char. 8.3.1.8 strrchr (string.h) char *strrchr(const char * s1, int c); Retourne un pointeur sur la dernire occurrence de c dans s1, ou NULL si c ne figure pas dans s1. c est un int converti en char. 8.3.1.9 strspn (string.h) size_t strspn(const char *s1, const char *s2); Retourne le nombre de caractres du dbut de s1 constitu de caractres appartenant s2.
PS/LANGAGES
Page 54
8.3.1.10 strcspn (string.h) size_t strcspn(const char *s1, const char *s2); Retourne le nombre de caractres du dbut de s1 constitu de caractres n'appartenant pas s2. 8.3.1.11 strpbrk (string.h) char * strpbrk(const char * s1, const char *s2); Retourne un pointeur sur la premire occurrence dans s1 de n'importe quel caractre de s2, ou NULL si aucun n'y figure. 8.3.1.12 strstr (string.h) char *strstr(const char *s1, const char *s2); Retourne un pointeur sur la premire occurrence de la chane s2 dans la chane s1, ou NULL si elle n'y figure pas. 8.3.1.13 strlen (string.h) size_t strlen(const char *s1); Retourne la longueur de la chane s1, caractre nul non compris. 8.3.1.14 strerror (string.h) char *strerror(size_t n); Retourne un pointeur sur la chane correspondant l'erreur n, dfinie par l'implmentation. 8.3.1.15 strtok (string.h) char *strtok(char *s1, const char *s2); Recherche dans s1 des lexmes dlimits par des caractres appartenant s2. 8.3.1.16 memcpy (string.h) void *memcpy(void s1, const void s2, size_t n); Copie n caractres de s2 dans s1 et retourne s1. 8.3.1.17 memmove (string.h) void *memmove(char *s1, const char * s2, size_t n); Comme memcpy mais fonctionne aussi si les objets se chevauchent. 8.3.1.18 memcmp (string.h) int memcmp(const char *s1, const char *s2, size_t n); Compare les n premiers caractres de s1 s2. La valeur de retour se dtermine comme pour strcmp. 8.3.1.19 memchr (string.h) void *memchr(const char *s1, int c, size_t n); Retourne un pointeur sur la premire occurrence du caractre c (int converti en unsigned char) dans s1, ou NULL si c ne figure pas dans les n premiers caractres. 8.3.1.20 memset (string.h) void *memset (char *s1, int c, size_t n); Remplit les n premiers caractres de s1 par le caractre c et retourne s1.
PS/LANGAGES Page 55
8.4 Tableaux et Fonctions Le nom du tableau reprsente en fait l'adresse du tableau . Si nous voulons modifier un lment du tableau, il suffit de transmettre en paramtre le nom du tableau (ventuellement la taille). Exemple : void init(int tablo[], int ind); main() { int tab[10]; init(tab,10); } void init(int tablo[], int ind) { int i; for (i = 0 ; i < ind ; i++) tablo[i]=1; } Remarque : On aurait pu dclarer la fonction de la manire suivante: void init(int tablo[10], int ind) mais dans ce cas, la fonction init n'aurait pu travailler que sur un tableau de 10 entiers. Lorsque l'on passe un tableau plusieurs dimensions en argument une fonction, le nombre de lignes est sans importance car on passe en ralit son adresse. Par contre, la fonction doit connatre les autres dimensions pour connatre l'organisation du tableau. void ra_un(int t[][15], int nbl); main() { int tablo[10][15]; ra_un (tablo, 10); } void ra_un(int t[][15], int nbl) { /* fonction permettant la mise 1 de tableaux de 15 lments */ int i, j; for(i=0; i < nbl; i++) for(j=0; j < 15; j++) t[i][j] = 1; }
PS/LANGAGES
Page 56
8.5 Les pointeurs 8.5.1 Gnralits Un pointeur est une variable contenant l'adresse d'une autre variable ou d'une fonction. Il est utilis dans le passage de paramtres une fonction (possibilit de modifier les arguments points), la sauvegarde d'adresse ou pour le chanage d'lments. Un pointeur peut pointer sur n'importe quel type de variable (y compris un autre pointeur ou une fonction). La taille d'un pointeur (taille d'un entier "mot machine" est la mme quel que soit l'objet point.) 8.5.2 Dclaration - Utilisation <type> *<identificateur>; o <type> est le type de variable pointe. * : indique qu'il s'agit d'un pointeur Exemples: int *ptr_int; char *ptr_char; int *ptr1, *ptr2, *ptr3; int *adr; int n; n = 20; adr = &n; *adr = 30;
L'instruction (ins2) adr = &n affecte la variable pointeur adr l'adresse de n. L'instruction (ins3) *adr = 30 signifie: affecter la lvalue *adr la valeur 30. Or *adr reprsente l'entier ayant pour adresse adr. @ mmoire 2ff7fc10 n 2ff7fc14 adr
20
n 20 adr 2ff7fc10
n 30 adr 2ff7fc10
ins1
ins2
ins3
Si l'on avait ajout l'instruction (*adr)++; le contenu de n serait devenu gal 31. Ne pas oublier les parenthses (cf priorits et valuation des oprateurs). C'est la lvalue *adr que l'on incrmente.
PS/LANGAGES
Page 57
8.5.3 Pointeurs constants et pointeurs de constantes Soit la dclaration const int *p; On indique que l'on ne veut pas pouvoir modifier la valeur de l'objet point par p en passant par le pointeur. Exemple : int strlen(const char * s1); int *const p = &objet; Ici p pointera toujours sur le mme objet. const int * const q = &objet; q est un pointeur constant sur le mme objet. Via p, on peut modifier l'objet point, via q, on ne le peut pas. Exemple : int x = 10; int *const p = &x; const int * const q = &x; *p = 20 ; *q = 30 ; /* OK */ /* Erreur de compilation *q n'est pas une lvalue*/
8.5.4 Arithmtique des pointeurs Soit la dclaration int *adr; Une expression telle que adr + 1 a un sens pour le langage C. En effet, adr contient l'adresse d'un entier donc adr + 1 reprsente l'adresse de l'entier suivant (en fait incrmentation de sizeof(int)). De la mme faon, adr++ ou adr-- incrmente ou dcrmente l'adresse contenue dans adr. Les oprations utilisables sur les pointeurs sont: - l'addition ou la soustraction d'un pointeur et d'un entier. - la comparaison entre pointeurs de mme type. - l'affectation de pointeurs de mme type. - la soustraction entre pointeurs de mme type. Toutes les autres oprations sont interdites. L'affectation entre deux pointeurs de types diffrents ncessite un cast 8.5.5 L'allocation dynamique dans le tas A ct des objets dclars (statiques, automatiques, ...), il y a ceux allous dynamiquement dans une zone appele tas (ou heap). On accde ces objets obligatoirement par des pointeurs. Le tas est utilis pour la construction de structures de donnes complexes dont on ne connat pas priori la taille.
PS/LANGAGES Page 58
Le langage C comporte des fonctions (prototypes dans stdlib.h) pour allouer ou dsallouer de la mmoire. 8.5.5.1 malloc (stdlib.h) void *malloc(size_t size); malloc retourne un pointeur sur un espace mmoire reserv un objet de taille size, ou bien NULL si cette demande ne peut tre satisfaite. La mmoire alloue n'est pas initialise. 8.5.5.2 calloc (stdlib.h) void *calloc(size_t nobj, size_t size); calloc retourne un pointeur sur un espace mmoire rserv un tableau de nobj objets, tous de taille size, ou bien NULL si cette demande ne peut tre satisfaite. La mmoire alloue est initialise par des zros. 8.5.5.3 realloc (stdlib.h) void *realloc(void *p, size_t size); realloc change en size la taille de l'objet point par p. Si la nouvelle taille est plus petite que l'ancienne, seul le dbut du contenu de l'objet est conserv. Si la nouvelle taille est plus grande que l'ancienne, le contenu de l'objet est conserv. 8.5.5.4 free (stdlib.h) void free(void *p); free libre l'espace mmoire point par p; elle ne fait rien si p vaut NULL. p doit tre un pointeur sur un espace mmoire allou par une des fonctions prcdentes. p n'est pas modifi. 8.5.6 Les pointeurs gnriques Les fonctions calloc et malloc sont deux exemples de fonction retournant un pointeur gnrique (du type void *). Exemple: void demi(void *pt, char type); main() { int i=5; float x=15.4; demi(&i, 'i'); printf("%d\n", i); demi(&x, 'f'); printf("%f\n", x); return 0; } void demi(void *pt, char type) { switch(type) { case 'i' : *(int*)pt /= 2;break; case 'l' : *(long*)pt /=2;break; case 'f : *(float *)pt /=2.;break; } } Remarque : il est ncessaire d'effectuer un transtypage.
PS/LANGAGES
Page 59
8.5.7 Les pointeurs de fonction Une fonction elle-mme n'est pas une variable, mais il est possible de dfinir des pointeurs de fonctions que l'on peut affecter, placer dans des tableaux, passer en arguments des fonctions, etc... La dclaration suivante est une dclaration de pointeur de fonction qui renvoie un entier et qui admet deux entiers comme paramtre. int (*pointeur_fonc)(int, int);
Excution Valeurs de i = 15 et de j = 25 avant echange Valeurs de i = 15 et de j = 25 aprs echange En effet @ mmoire 2ff7fc00 i 2ff7fc04 j 2ff7fbe0 2ff7fbe4 2ff7fbc0 Dbut du main
15 25
i j a b tampon
15 25 15 25 Dbut de echange
i j a b tampon
15 25 25 15 15 Fin de echange
i j
15 25
Fin du main
Modifions maintenant le programme de la faon suivante: #include <stdio.h> void echange(int *pa, int *pb); main() { int i = 15, j = 25; printf("Valeurs de i = %d et de j = %d avant echange\n", i, j); echange(&i, &j); printf("Valeurs de i = %d et de j = %d aprs echange\n", i, j); } void echange(int *pa, int *pb) { int tampon ; tampon = *pa; *pa = *pb; *pb = tampon; } Excution Valeurs de i = 15 et de j = 25 avant echange Valeurs de i = 25 et de j = 15 aprs echange @ mmoire 2ff7fc00 i 2ff7fc04 j 2ff7fbe0 2ff7fbe4 2ff7fbc0 Dbut du main
15 25
i j
15 25
i j
25 15
i j
25 15
Fin du main
PS/LANGAGES
Page 61
8.5.9 Les pointeurs et les oprations sur les tableaux main() { int t[10] = {5,3,2,7,9,8,6,4,1,7}; int *pt = t; int i, j; i = *pt /* donc i = 5 valeur pointe par pt */ j = *(pt + 1); /* j = 3 valeur pointe par le suivant de pt */ pt + 1 est donc l'adresse de l'lment t[1]. De la mme faon: (pt + i) est l'adresse de t[i], donc (pt + i) est donc le mme objet que t[i] Les notations suivantes sont quivalentes t[i] L'oprateur + est commutatif *(t + i) *(i + t) L'oprateur [] est commutatif i[t] Dans le cas de tableaux multidimensionnels main() { int t[3][3] = { {1,3,5}, {2,4,6}, {7,8,9}}; int *p; /* p est un pointeur sur un entier */ int *ptr[3]; /* ptr est un tableau de pointeurs */ int (*pm)[3]; /* pm est un pointeur sur un tableau de 3 entiers */ p=t; /* MERREUR car p est un pointeur sur un entier */ /* et t est un pointeur sur un tableau de 3 entiers */ /* CORRECT */ /* affiche la valeur 3 */ /* affiche la valeur 5 */ /* CORRECT */ /* affiche la valeur 1 */
p = &t[0][0]; ptr[0] = p + 1; printf("%d\n", *(ptr[0])); ptr[1] = &t[0][2]; printf("%d\n", *(ptr[1])); pm = t printf("%d\n", *(pm[0])); }
Un tableau 2 dimensions est l'quivalent d'un pointeur sur les lignes de ce tableau. Si on augmente de 1 un tel pointeur, on doit se dcaler de la "largeur" d'une ligne (en fait le nombre de colonnes du tableau). Les notations suivantes sont quivalentes t[i][j] L'oprateur + est commutatif *(*(t + i)+j) *(j + *(t + i)) L'oprateur [] est commutatif j[i[t]]
PS/LANGAGES Page 62
8.5.10 Les pointeurs et les chanes de caractres La dclaration char *message; dclare un pointeur sur un caractre mais ne reserve pas de place en mmoire. char *message = "bonjour"; dclare un pointeur sur un caractre qui est initialis sur la chane "bonjour\0". message b o n j o u r \0
Les dclarations suivantes ne sont pas identiques: char message1[] = "bonjour"; char *message2 = "bonjour"; Dans le premier cas, il n'y a qu'un tableau de 8 caractres alors que dans le deuxime cas, il y a un pointeur et un tableau de 8 caractres. 8.5.11 Les tableaux de pointeurs La dclaration char *lignes[7]; dclare un tableau de 7 pointeurs sur un caractre. La dclaration char *mois[12] = { "janvier","fvrier","mars","avril","mai","juin", "juillet","aot","septembre","octobre","novembre","dcembre"}; dclare et initialise un tableau de pointeurs sur les chanes de caractres. mois 0 1 2 3 4 5 6 7 8 9 10 11
j f m a m j j a s o n d
a a v a u u o e c o
n v r r i i i p t v c
v r s i \0 n l t t o e e
i e r i e r \0 l \0 \0 l \0 e b m m
\0 \0
e m r b b
t b e r r
\0 r e \0 \0 e \0 e \0
On peut remarquer que la place mmoire est adapte au contenu des donnes. Ce qui ne serait pas le cas si on avait utilis la dclaration suivante: char mois[12][10] = { {"janvier"},{"fvrier"},{"mars"},{"avril"},{"mai"},{"juin"}, {"juillet"},{"aot"},{"septembre"},{"octobre"},{"novembre"},{"dcembre"}};
PS/LANGAGES
Page 63
8.5.12 Les paramtres du programme principal Il s'agit en fait d'un exemple d'utilisation des tableaux de pointeurs sur tableaux. Le programme principal peut recevoir des paramtres qui apparatront sur la ligne de commande aprs le nom du fichier excutable. Les paramtres possibles sont: un entier (argument count) signifiant nombre d'arguments. - argc un pointeur sur un tableau de chanes de caractres (argument vector) - argv Exemple d'utilisation : Ligne de commande : program bonjour, matre Par convention, argv[0] est le nom par lequel le programme a t appel (ici program) et par consquent argc vaut au moins 1. argv l l program\0 l bonjour,\0 l matre\0 0 Le programme suivant affiche de deux manires diffrentes les arguments passs program. #include <stdio.h> main(int argc, char *argv[]) { int i; for (i=1 ; i < argc; i++) printf("%s%s", argv[i], (i < argc - 1) ? " " : ""); putchar('\n'); /* ou encore */ while ( --argc > 0) printf("%s%s", *++argv, (argc > 1) ? " " : ""); putchar('\n'); }
PS/LANGAGES
Page 64
PS/LANGAGES
Page 65
9.2 Les structures 9.2.1 Gnralits - Dclaration Une structure est une collection de donnes regroupes dans une mme entit logique. Elles permettent de crer des types complexes partir de diffrents types dja connus et de les regrouper sous un mme nom. Les seules oprations permises sur les structures sont: - la copie - l'affectation - l'accs ses membres - la rcupration de son adresse. Par contre, les membres d'une structure sont utiliss comme n'importe quelle autre variable. Pas de comparaisons entre structures en raison de l'alignement des donnes et de la possibilit de prsence de bits de bourrage. struct [<nom struct> ] { typel <nom lmentl>, <nom lment2>; type2 <nom lment3>; } [<varl>, <var2> ... ]; Exemple : struct enreg { int numero, qte; float prix; }; Cette dclaration dfinit un modle de structure mais ne rserve pas de variable correspondant cette structure. Une fois le modle dfini, nous pouvons dclarer des variables du type correspondant. Exemple: struct enreg article; Dans cette dclaration, on rserve un emplacement mmoire de la taille d'une structure de type enreg. Il est possible de regrouper la dfinition du modle et la dclaration de la variable dans une seule instruction. Ainsi, l'opration prcdente aurait pu s'crire: struct enreg { int numero, qte; float prix; } article;
PS/LANGAGES
Page 66
Dans ce dernier cas, il est possible d'omettre le nom du modle (enreg) condition de ne pas avoir dclarer par la suite d'autres variables du mme modle. struct adr { int numero; char rue[30]; long codepostal; char ville[15]; }; struct compte { long numero; char nom[15]; char prenom[10]; struct adr adresse; } compte1; struct compte compte2; } compte1 et compte2 sont deux variables de type struct compte. Restriction : un champ ne peut pas tre de type fonction. typedef struct { int jour, mois, annee; } date; /* date est ici un alias de type, et non pas un vrai type personnalis comme auparavant */ date date_naissance; 9.2.2 Initialisation des structures 1) struct famille{ char nom[15]; char prenom[10]; int nb_enfants; } famille1 = {"DUPONT","Jean",3}; 2) 3) struct famille famille2 = famille1; struct famille famille3 = {"DURAND","Pierre",4};
9.2.3 Accs aux lments <identificateur de la variable>.<nom du champ> struct famille famille4; strcpy(famille4.nom , "DUPUIS"); strcpy(famille4.prenom, "Eric"); famille4.nb_enfants = 0;
PS/LANGAGES Page 67
9.2.4 Structures et Fonctions Une structure peut tre passe en argument une fonction et une fonction peut retourner une structure. La structure tant considre comme un tout, elle est passe en paramtre comme n'importe quel autre type de variable. Exemple : struct date { int jour, mois,annee; }; struct personne { char nom[20], prenom[15]; struct date date_naiss; }; /* fonction retournant une structure de type personne */ struct personne maj_pers(char name[],char pren[], struct date d_naiss) { struct personne tempo; tempo.date_naiss = d_naiss; strcpy(tempo.nom,name); strcpy(tempo.prenom, pren); return tempo; } main() { static struct date datel = {10,07,97}; struct personne persl; persl = maj_pers("TOTO","Jean",datel); printf("%s %s %d/%d/%d",persl.nom,pers1.prenom, persl.dat_naiss.jour, pers1.date_naiss.mois, pers1.date_naiss.annee); }
PS/LANGAGES
Page 68
9.2.5 Pointeurs sur une structure struct famille{ char nom[15]; char prenom[10]; int nb_enfants; } famille5; struct famille *pt; pt = &famille5;
9.3 Les unions L'union permet de dclarer des objets polymorphes : objets qui peuvent changer de forme mais qui n'ont un moment donn qu'une forme et une seule. L'union permet de faire partager un mme emplacement mmoire par des variables de types diffrents. Elle permet : - d'conomiser des emplacements mmoire. - d'interprter de faons diffrentes un mme motif binaire Lors de la dclaration de la variable, la structure de donnes ne rserve en mmoire que la place ncessaire au stockage de la plus grande des entits qu'elle contient. union [nom] { typel varl; type2 var2; } var; Exemples: main() { union essai { long n; float x; }union1; printf("donner un nombre rel : "); scanf("%f",&union1.x); printf("en entier cel fait : %ld",union1.n); } Excution : donner un nombre rel : 1.23e4 en entier cel fait : 1178611712 union donnee { char nom[10]; int numero; float reel; }u1; u1 a 3 formes possibles: - un tableau de 10 caractres - un entier - un float
PS/LANGAGES
Page 70
u1.numero = 256; printf("%x--%x--%x--%x\n", u1.nom[0], u1.nom[1], u1.nom[2], u1.nom[3]); u1.numero = 257; printf("%x--%x--%x--%x\n", u1.nom[0], u1.nom[1], u1.nom[2], u1.nom[3]); u1.numero = 278; printf("%x--%x--%x--%x\n", u1.nom[0], u1.nom[1], u1.nom[2], u1.nom[3]); Excution: 0--0--1--0 0--0--1--1 0--0--1--16
MAttention, ces rsultats sont valables sous UNIX. Dans le cas de processeur INTEL, avec le mme programme, on obtiendrait un rsultat diffrent du fait de l'inversion des octets. Sous TURBO C: 0--1--0--0 1--1--0--0 16--1--0--0
Autre exemple: typedef enum {cartesien, polaire} representation; typedef struct { float reel, imaginaire } rep_cartesien; typedef struc { float rho, theta} rep_polaire; typedef struct { representation rep; union { rep_cartesien champ_cart; rep_polaire champ_pol; } info; } complexe; complexe c; c.representation = polaire; c.info.champ_pol.rho = 10; Le champ rep sert de discriminant. 9.4 Les champs de bits Il est possible d'indiquer comment les champs d'une structure seront reprsents. Le nombre constant indique la longueur du champ de bits. typedef struct{ unsigned int code : 7; /* les 7 premiers bits */ unsigned int : 1; /* 1 bit inutilis */ unsigned int reg1 : 4; unsigned int reg2 : 4; } format; Les champs de bits n'ont pas d'adresse donc pas de pointeur sur ces champs.
PS/LANGAGES Page 71
9.5 typedef La directive typedef est employe pour dfinir un nouveau type partir des types existants. Les types ne sont pas rellement crs, mais les noms dfinis sont synonymes d'un type existant qui pourrait tre utilis leur place. Dans des cas simples, le typedef joue le rle similaire que la directive de compilation #define. Mais typedef permet de rsoudre des cas qui ne peuvent tre traits par le #define (ou lorsque la directive de compilation choue). L'utilisation de typedef permet de rendre des programmes plus facilement portables. La dfinition et la modification de type ne devra tre faite que dans un seul fichier. Il autorise galement une lecture ou une documentation du code plus aise en rendant les noms de types plus explicites. Syntaxe: typedef type identificateur; type: n'importe quel type de donnes dj existant. identificateur: l'identificateur en C, il peut tre utilis comme synonyme de type. Remarques: Les modificateurs de type (short, long, signed, unsigned) ne peuvent tre utiliss sur des types dfinis par un typedef, mme si ceux-ci sont synonymes d'un type qui les admet. typedef int entier; unsigned entier nombre;
M -
/* dclaration illgale */
Plusieurs synonymes d'un type peuvent tre dfinis dans un mme typedef, ceux-ci sont alors spars par des virgules.
L'instruction typedef permet de dfinir n'importe quel type, y compris les types pointeurs, fonctions et tableaux. Exemples: typedef enum {FAUX,VRAI} booleen; typedef char chaine[128], *pointeur_char, fonction_char(); typedef int (* pointeur_sur_fonction)(); booleen trouve=FAUX; chaine ch1, ch2; pointeur_char pt_ch; pt_ch = &ch1[127]; pointeur_sur_fonction fonction_quitter;
MAttention l'abus des typedef qui peut rendre un code difficilement comprhensible et donc produire l'effet contraire de celui escompt.
PS/LANGAGES
Page 72
Les fichiers
Sous UNIX, uniquement des fichiers binaires. Pour favoriser la portabilit, TURBO C propose une variable _fmode dfinie dans <stdlib.h> qui peut prendre l'une des deux valeurs suivantes: O_BINARY ou O_TEXT qui sont dfinies dans <fcntl.h>. On peut galement ajouter b dans le mode d'ouverture pour spcifier un fichier binaire (ou t pour un fichier texte par dfaut). 10.2 Les fonctions de gestion de fichier Il existe deux classes de fonctions permettant de grer les fichiers. Les fonctions de niveau 1 ("LOW LEVEL") ont les caractristiques suivantes: -Elles sont proches et donc dpendantes du systme d'exploitation. -Les fichiers sont identifis par un simple numro. -Les informations sont manipules en binaire et n'offrent pas de possibilit de formatage. Les fonctions de niveau 2 ("STREAM") ont les caractristiques suivantes: -Elles font appel aux fonctions de niveau 1. -Les fichiers peuvent tre manipuls soit en binaire soit faire l'objet de formatage. -Les fichiers sont identifis par un pointeur de type FILE. Ce type dsigne un modle de structure dfini dans <stdio.h> et sera utilis lors de chaque manipulation du fichier. Ces fonctions utilisent ou mettent jour des variables globales dcrites dans des fichiers d'en-tte. La gestion des erreurs ncessite l'inclusion du fichier <errno.h> . La principale variable utilise est errno : Quand une erreur survient lors d'un appel systme la variable errno prend une valeur indiquant le type d'erreur. Cette variable peut tre consulte tout moment grce la fonction perror().
PS/LANGAGES
Page 73
Les fichiers
10.3 Les fonctions de niveau 1 10.3.1 open (fcntl.h) Ouvre un fichier. int open (char * chemin, int omode, [int amode]); Renvoie un handle dsignant le fichier pour les oprations ultrieures. L'argument omode dfinit le mode d'ouverture. mnmonique opration O_APPEND Ecriture partir de la fin du fichier O_BINARY Ouverture en mode binaire (DOS) O_CREAT Si le fichier n'existe pas, il est cr O_NDELAY Ne se bloque pas si l'ouverture ncessite un dlai O_RDONLY Ouverture en lecture seule O_RDWR Ouverture en lecture et criture O_TEXT Ouverture en mode texte (DOS) O_TRUNC Ouvre un fichier dj existant en rduisant sa taille 0. Le fichier doit possder des droits d'criture O_WRONLY Ouvre en criture seule Plusieurs paramtres omode peuvent tre spcifis, ils sont alors spars par le caractre '|'. Certains paramtres sont exclusifs les uns des autres (Exemple O_TEXT et O_BINARY). L'argument amode n'est utilis que si l'option O_CREAT a t invoque. Il correspond sous UNIX aux valeurs utilises par chmod (valeurs comprises entre 0000 et 0777). Sous DOS, l'argument amode peut prendre les valeurs suivantes: mnmonique opration S_IWRITE Ecriture seule S_IREAD Lecture seule S_IREAD | S_IWRITE Lecture et criture autorises
10.3.2 eof (fcntl.h) Dtermine si le pointeur de fichier associ au handle a atteint la fin du fichier. int eof (int handle); Renvoie 1 si la fin de fichier est dtecte et 0 sinon.
PS/LANGAGES
Page 74
Les fichiers
10.3.3 read Lecture dans un fichier. int read (int handle, void * buffer, unsigned nb); Lit dans un fichier rfrenc par handle, nb octets qui sont stocks dans le tampon buffer. La lecture commence la position courante du pointeur de fichier dans le fichier. Sous DOS, si le fichier est ouvert en mode texte, la squence CR-LF est remplace par un caractre newline et le caractre CTRL-Z (^Z) est interprt comme caractre de fin de fichier. La fonction renvoie: le nombre d'octets rellement lus. 0 en cas de dtection de fin de fichier -1 en cas d'erreur (errno prend la valeur EBADF ou EACCES). 10.3.4 write Ecriture dans un fichier int write (int handle, void * buffer, unsigned nb); Ecrit nb octets pris dans buffer dans le fichier rfrenc par handle. L'criture commence la position courante dans le fichier. Sous DOS, si le fichier est ouvert en mode texte, le caractre newline est remplac par la squence CR-LF et un caractre CTRL-Z (^Z) est ajout en fin de fichier. La fonction renvoie: le nombre d'octets rellement crits. -1 en cas d'erreur (errno prend la valeur EBADF ou EACCES). 10.3.5 close (fcntl.h) int close (int handle); Ferme le fichier dsign par handle. Les tampons systme associs sont vids. La fonction renvoie: 0 en cas de succs -1 en cas d'erreur (errno prend la valeur EBADF) 10.3.6 lseek (fcntl.h) Attention, cette fonction n'est pas dans la norme ANSI. long lseek (int handle, long depl, int orig); Dplace le pointeur de fichier de depl octets partir de orig. Orig peut prendre les valeurs suivantes: 0 SEEK_SET depuis le dbut de fichier. 1 SEEK_CUR depuis la position courante du pointeur 2 SEEK_END depuis la fin de fichier
PS/LANGAGES
Page 75
Les fichiers
10.4 Les fonctions de niveau 2 10.4.1 fopen (stdio.h) Ouvre un fichier. FILE* fopen(char *nomfic,char *mode); La fonction retourne un pointeur sur le fichier en cas de russite sinon NULL. Les diffrents modes d'accs sont en criture (w, w+), en lecture (r, r+) ou en ajout(a, a+). Il peut tre exprim soit sous la forme d'une variable soit sous la forme d'une constante. Mode daccs w Fichier Nexiste pas Cre le fichier Ouvre en criture Existe Dtruit lancien Cre le fichier Ouvre en criture Mode daccs w+ Fichier Nexiste pas Cre le fichier Ouvre en E/S Existe Dtruit lancien Cre le fichier Ouvre en E/S w+ r+ r Erreur Ouvre en lecture a Cre le fichier Ouvre en criture Ouvre en ajout en fin de fichier
a+
cration pour mise jour mise jour en lecture/criture. Le fichier doit exister. Il n'est pas possible de raliser une lecture aprs une criture (et vice-versa) sans se repositionner (par un fseek ou autre). Il est possible d'enchaner plusieurs lectures (ou critures) conscutives. extension et mise jour. L'criture n'est possible qu'en fin de fichier.
Sous DOS, il est possible d'ajouter b (pour binaire) ou t (pour texte). Exemple : ptr_fic = fopen ("ESSAI.DAT", "wb+"); 10.4.2 fclose (stdio.h) Ferme un fichier et force l'criture sur disque du contenu du tampon associ au flux. int fclose (FILE *ptr_fic); La fonction retourne 0 si la fermeture s'est bien passe ou EOF dans le cas contraire.
PS/LANGAGES
Page 76
Les fichiers
10.4.3 fseek (stdio.h) Positionne le pointeur de fichier. int fseek(FILE *ptr_fic, long int depl, int orig); depl orig : Taille du dplacement en octets (+ ou - ) : Origine du dplacement
Orig peut prendre les valeurs suivantes: 0 SEEK_SET depuis le dbut de fichier. 1 SEEK_CUR depuis la position courante du pointeur 2 SEEK_END depuis la fin de fichier SEEK_SET, SEEK_END et SEEK_END sont dfinies dans <stdio.h>. La fonction retourne 0 si le dplacement a pu se faire ou diffrent de 0 dans le cas contraire. Cette fonction permet de grer les fichiers en accs direct, le dplacement du pointeur tant gr par l'utilisateur qui doit connatre la position dans le fichier de la donne recherche. 10.4.4 rewind (stdio.h) Positionne le pointeur en dbut de fichier. void rewind(FILE *ptr_fic,); Idem fseek (ptr_fic, 0L, 0); 10.4.5 ftell (stdio.h) Retourne la position courante du pointeur d'un fichier. long int ftell (FILE *ptr_fic); La fonction retourne la position courante ou EOF s'il y a une erreur. La position courante du pointeur est le dplacement en octets par rapport au dbut du fichier. 10.4.6 feof (stdio.h) Dtecte une fin de fichier. int feof (FILE *ptr_fic); La fonction retourne une valeur non nulle (vraie) si l'indicateur de fin de fichier a t dtect lors de la dernire opration de lecture. Il est ncessaire d'avoir tent de lire au del de la fin de fichier pour que la fonction renvoie un rsultat non nul.
PS/LANGAGES
Page 77
Les fichiers
10.4.7 ferror (stdio.h) Dtecte les erreurs. int ferror(FILE *ptr_fic); La fonction retourne une valeur non nulle (vraie) lorsqu'une erreur est dtecte. La fonction teste la possibilit de lire ou d'crire dans un fichier et met jour la variable errno. 10.4.8 clearerr (stdio.h) Rinitialise l'indicateur d'erreur. void clearerr (FILE *ptr_fic); La fonction rinitialise les indicateurs d'erreurs et de fin de fichier. 10.4.9 perror (stdio.h) Affiche les messages d'erreurs systmes. void perror(char *s); La fonction affiche dans un premier temps le message 's' suivi de deux points puis le message correspondant la dernire erreur systme. 10.4.10 getw (stdio.h) Lit un entier (un mot machine) dans un flux. int getw(FILE *ptr_fic); En cas de russite, la fonction renvoie l'entier suivant dans le fichier d'entre . En cas d'erreur (fin de fichier ... ) la fonction renvoie EOF (-1 ). EOF tant un entier autoris, il est ncessaire de recourir la fonction ferror( ) pour tester la russite de getw( ). 10.4.11 putw (stdio.h) Ecrit un entier (un mot machine) dans un flux. int putw(int var,FILE *ptr_fic); La fonction renvoie l'entier crit en cas de russite. En cas d'erreur (fin de fichier ...) la fonction renvoie EOF (-l). EOF tant un entier autoris, il est ncessaire de recourir la fonction ferror( ) pour tester la russite de putw( ). 10.4.12 fflush (stdio.h) int fflush(FILE *stream); Sur un flot de sortie, fflush provoque l'criture des donnes mises en mmoire tampon. Sur un flot d'entre, son effet est indfini. Elle retourne EOF lors d'une erreur, zro sinon.
PS/LANGAGES
Page 78
Les fichiers
10.4.13 fwrite (stdio.h) Ecrit des donnes dans un fichier, partir de la position courante du pointeur dans le fichier ( sauf en mode ajout). size_t fwrite(void *donnee, size_t taille, size_t n, FILE *ptr_fic); void *donnee size_t taille size_t n : Adresse de la donne crire. : Taille en octets de la donne crire. : Nombre de donnes crire (si n > 1 c'est le nombre total d'octets transfrs = n x taille ).
La fonction retourne le nombre de donnes crites ( si ce nombre est diffrent de n, alors une erreur s'est produite lors de l'criture 10.4.14 fread (stdio.h) Lit des donnes depuis un fichier, partir de la position courante du pointeur dans le fichier. size_t fread(void * donnee, size_t taille, size_t n, FILE *ptr-fic); void *donnee size_t taille size_t n : Adresse o sera stocke la donne. : Taille en octets de la donne lire. : Nombre de donnes lire (si n > 1 c'est le nombre total d'octets transfrs = n x taille )
La fonction retourne le nombre de donnes lues ( si ce nombre est diffrent de n, alors une erreur s'est produite lors de la lecture). 10.4.15 Autres fonctions de lecture-criture On peut galement utiliser les fonctions standards d'entres-sorties dcrites dans le chapitre 5 (Les entres-sorties sur les voies standards) telles que fputc, fgetc, fscanf, fprintf, fgets, fputs. 10.4.16 Autres oprations sur les fichiers FILE *freopen(const char *filename, const char *mode, FILE *stream); freopen ouvre le fichier et lui associe un flot. Elle retourne un flot, ou NULL en cas d'erreur. S'utilise pour changer les fichiers associs stdin, stdout ou stderr. int remove(const char *filename); remove dtruit le fichier. Retourne une valeur diffrente de zro en cas d'chec. int rename(const char *oldname, const char *newname); rename change le nom du fichier oldname en newname. Retourne une valeur diffrente de zro en cas d'chec. FILE *tmpfile(void); tmpfile cre un fichier temporaire dans le mode "wb+" qui sera automatiquement dtruit lors de sa fermeture ou lors de la fin normale du programme. tmpfile retourne un flot ou NULL si le fichier ne peut pas tre cr.
PS/LANGAGES Page 79
Les fichiers
char *tmpnam(char s[L_tmpnam]); tmpnam(NULL) cre une chane de caractres qui n'est pas le nom d'un fichier existant et retourne un pointeur sur un tableau statique interne. tmpnam(s) stocke cette chane dans s et renvoie s. tmpnam gnre un nom diffrent chaque appel. int setvbuf(FILE *stream, char *buf, int mode, size_t size); setvbuf contrle la mise en mmoire tampon pour le flot stream. Il faut l'appeler avant la premire lecture ou criture sur ce flot. Diffrentes valeurs de mode: _IOFBF provoque un tamponnage complet _IOLBF provoque un tamponnage par lignes de fichier texte _IONBF pas de tamponnage void setbuf(FILE *stream, char *buf); Si buf vaut NULL, setbuf stoppe la mmoire tampon pour le flot stream. Sinon, elle quivaut (void) setvbuf(stream, buf, _IOFBF, BUFSIZ).
PS/LANGAGES
Page 80
Si c est une lettre majuscule, tolower(c) retourne la lettre minuscule correspondante sinon elle retourne c. Si c est une lettre minuscule, toupper(c) retourne la lettre majuscule correspondante sinon elle retourne c.
PS/LANGAGES
Page 81
11.2 Les fonctions mathmatiques : <math.h> Le fichier d'en-tte <math.h> contient des dclarations de fonctions et de macros mathmatiques. Pour chaque fonction, x et y sont de type double, i est de type int et toutes les valeurs de retour sont de type double.
sin(x) cos(x) tan(x) asin(x) acos(x) atan(x) atan2(y,x) sinh(x) cosh(x) tanh(x) exp(x) log(x) log10(x) pow(x,y) sqrt(x) ceil(x) floor(x) fabs(x) ldexp(x,n) frexp(x, int *exp) modf(x, double *ip) fmod(x,y) sinus de x cosinus de x tangente de x arc sinus de x dans l'intervalle [- /2, /2], x [-1,1] arc cosinus de x dans l'intervalle [0, ], x [-1,1] arc tangente de x dans l'intervalle [- /2, /2] arc tangente de y/x dans l'intervalle [- , ] sinus hyperbolique dex cosinus hyperbolique dex tangente hyperbolique dex fonction exponentielle de x = e x logarithme nprien de x = ln(x), x > 0 logarithme base 10 = log 10(x), x > 0 xy x, x 0 le plus petit entier suprieur ou gal x, exprim en double le plus grand entier infrieur ou gal x, exprim en double valeur absolue de x : |x| x.2n spare x en une fraction dans l'intervalle[1/2,1] qui est retourne et une puissance de 2 qui est place dans *exp. spare x en ses parties entire place dans *ip et fractionnaire qui est retourne. reste de x/y, exprim en virgule flottante
PS/LANGAGES
Page 82
11.3 Les fonctions utilitaires : <stdlib.h> Le fichier d'en-tte <stdlib.h> contient des dclarations de fonctions traitant la conversion des nombres et l'allocation de mmoire. double atof(const char *s); convertit une chane s en un double. int atoi(const char *s); convertit une chane s en un int. long atol(const char *s); convertit une chane s en un long. double strtod(const char *s, char **endp); convertit le dbut de la chane s en un double. Elle place dans *endp un pointeur sur la partie non convertie sauf si endp vaut NULL. long strtol(const char *s, char **endp, int base); convertit le dbut de la chane s en un long. Elle place dans *endp un pointeur sur la partie non convertie sauf si endp vaut NULL. Si base vaut 0, la base est 8,10 ou 16. unsigned long strtoul(const char *s, char **endp, int base); idem strtol mis part les types des arguments et du rsultat. int rand(void); retourne un entier pseudo-alatoire compris entre 0 et RAND_MAX. void srand(unsigned int seed); prend seed comme amorce de la nouvelle squence de nombres pseudo-alatoires. L'amorce initiale vaut 1. void abort(void); provoque un arrt anormal du programme. void exit(int status); provoque l'arrt normal du programme. L'criture des tampons associs aux fichiers ouverts est force. Les flots ouverts sont ferms. La faon dont status est retourn dpend de l'implmentation. void atexit(void (*fcn)(void)); enregistre que la fonction fcn devra tre appele lors de l'arrt normal du programme. Retourne une valeur non nulle si cet enregistrement n'est pas ralisable. int system(const char *s); passe la chane s l'environnement pour que celui-ci l'excute. La valeur de retour dpend de l'implmentation. char *getenv(const char *name); retourne la chane d'environnement associe name.
PS/LANGAGES
Page 83
void bsearch(const void *key, const void *base, size_t n, size_t size, int (*cmp)(const void *keyval, const void *datum)); recherche parmi base[0]..base[n-1] un objet s'identifiant la cl *key. La fonction cmp doit retourner une valeur ngative, nulle ou positive en fonction de la comparaison des cls. Les objets du tableau base doivent tre rangs dans l'ordre croissant. bsearch retourne un pointeur sur un objet identique la cl ou NULL s'il n'en existe aucun. void qsort(void *base, size_t n, size_t size, int (*cmp)(const void *, const void *)); trie dans l'ordre croissant un tableau base[0]..base[n-1] d'objets de taille size. La fonction cmp doit retourner une valeur ngative, nulle ou positive en fonction de la comparaison des cls. int abs(int n); retourne la valeur absolue de son argument de type int. long labs(long n); retourne la valeur absolue de son argument de type long. div_t div(int num, int denom) calcule le quotient et le reste de la division de num par denom. Le quotient et le reste sont placs dans les champs quot et rem de type int d'une structure de type div_t. ldiv_t ldiv(long num, long denom); calcule le quotient et le reste de la division de num par denom. Le quotient et le reste sont placs dans les champs quot et rem de type long d'une structure de type ldiv_t. 11.4 Les listes variables d'arguments : <stdarg.h> Le fichier d'en-tte <stdarg.h> permet une fonction d'utiliser une liste d'arguments de nombre et de types inconnus. void va_start(va_list ap, lastfix); type va_arg(va_list ap, type); void va_end(va_list ap); Les macros de la famille va_arg, va_end et va_start fournissent un moyen portable d'accder ces listes d'arguments. _ va_start fait pointer ap sur le premier argument fourni la fonction. _ va_arg gnre une expression de mme type et valeur que le prochain argument transmis (un des arguments variables). _ va_end facilite le travail de retour normal de la fonction appele. ap lastfix type Pointe sur la liste va_list transmise ap de va_arg doit tre le mme que celui initialis par va_start Nom du dernier paramtre fixe transmis Sert va_arg pour drfrencer et situer l'lment suivant
PS/LANGAGES
Page 84
11.5 Les fonctions de traitement de la date et de l'heure : <time.h> Le fichier d'en-tte <time.h> contient des dclarations de types et de fonction servant manipuler l'heure et la date. clock_t et time_t sont des types arithmtiques qui reprsentent des instants et struct tm contient les composants d'une heure calendaire: int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; int tm_yday; int tm_isdst; secondes aprs la minute (0-61) minutes aprs l'heure (0-59) heures depuis minuit (0-23) jour du mois (1-31) mois depuis janvier (0-11) anne depuis 1900 jours depuis dimanche (0-6) jours depuis le 1er janvier (0-365) drapeau de l'heure d't (positif si heure d't nul sinon)
clock_t clock(void); retourne le temps d'utilisation par le programme depuis le dbut de son excution. time_t time(time_t *tp); retourne l'heure calendaire actuelle. *tp reoit aussi cette valeur de retour. double difftime(time_t time2, time_t time1); retourne la dure time2 - time1, exprime en secondes. time_t mktime(struct tm *tp); convertit l'heure locale contenue dans la structure *tp en heure calendaire. Retourne l'heure calendaire. char *asctime(const struct tm *tp); convertit l'heure reprsente dans la structure *tp en une chane de la forme: Sun Jan 3 15:14:17 1997\n\0 char *ctime(const time_t *tp); convertit l'heure calendaire *tp en heure locale. struct tm *gmtime(const time_t *tp); convertit l'heure calendaire en Temps Universel. struct tm *localtime(const time_t *tp); convertit l'heure calendaire *tp en heure locale.
PS/LANGAGES
Page 85
size_t strftime(char *s, size_t smax, const char *fmt, const struct tm *tp); transforme les informations de date et d'heure contenues dans *tp suivant le format fmt (analogue un format de printf) et place le rsultat dans s. strftime place au maximum smax caractres dans s. Caractres de conversion pour strftime: %a abrviation du jour de la semaine %A nom complet du jour de la semaine %b abrviation du mois %B nom complet du mois %c reprsentation locale de la date et de l'heure %d jour du mois (01-31) %H heure (0-23) %I heure (01-12) %j numro du jour dans l'anne (001-366) %m numro du mois (01-12) %M minutes (00-59) %p quivalent local de AM ou PM %S secondes (00-59) %U numro de la semaine dans l'anne %w numro du jour de la semaine (0-6) 0 = dimanche %W numro de la semaine dans l'anne %x reprsentation locale de la date %X reprsentation locale de l'heure %y anne dans le sicle (00-99) %Y anne y compris le sicle %Z nom du fuseau horaire %% %
11.6 Les limites dfinies par l'implmentation : limits.h, values.h et float.h Le fichier d'en-tte <limits.h> dfinit des constantes pour les tailles des types entiers. Ces valeurs sont fonction de l'implmentation. CHAR_BIT CHAR_MAX CHAR_MIN INT_MAX INT_MIN LONG_MAX LONG_MIN SCHAR_MAX SCHAR_MIN SHRT_MAX SHRT_MIN UCHAR_MAX UINT_MAX ULONG_MAX USHRT_MAX
PS/LANGAGES
8 UCHAR_MAX ou SCHAR_MAX 0 ou SCHAR_MIN +2147483647 -2147483648 +2147483647 -2147483648 +127 -128 +32767 -32768 255 4294967295 4294967295 65535
Page 86
bits par caractre valeur maximum d'un char valeur minimum d'un char valeur maximale d'un int (-(INT_MAX+1)) valeur maximale d'un long (-(LONG_MAX+1)) valeur maximale d'un signed char (-(SCHAR_MAX+1)) valeur maximale d'un short (-(SHRT_MAX+1)) valeur maximale d'un unsigned char valeur maximale d'un unsigned int valeur maximale d'un unsigned long valeur maximale d'un unsigned short
Valeurs dfinies dans <values.h> HIBITS HIBITI HIBITL MAXSHORT MAXINT MAXLONG MAXFLOAT MINDOUBLE MINFLOAT M_PI M_SQRT2 ((short)-32768) ((int)-2147483648) ((long)-2147483648) ((short)~HIBITS) ((int)~HIBITI) ((long)~HIBITL) ((float)3.40282346638528860e+38) 4.94065645841246544e-324 ((float)1.40129846432481707e-45) 3.14159265358979323846264338327950288 1.41421356237309504880168872420969808 constantes relatives l'arithmtique en Signification le plus grand nombre float le plus petit nombre float prcision en chiffres dcimaux mode d'arrondi pour l'addition base de la reprsentation (base 2) nombre de chiffres de la mantisse le plus petit x ; 1.0 + x 1.0 le plus petit exposant pour 10n le plus grand exposant n pour que FLT_RADIXn-1 soit reprsentable le plus grand nombre double le plus petit nombre double prcision en chiffres dcimaux nombre de chiffres de la mantisse le plus petit x ; 1.0 + x 1.0 le plus petit exposant pour 10n le plus grand exposant n pour que FLT_RADIXn-1 soit reprsentable
Le fichier <float.h> contient des dclarations de virgule flottante. Constantes Valeurs courantes FLT_MAX 3.4028234663852886e+38F FLT_MIN 1.1754943508222875e-38F FLT_DIG 6 FLT_ROUNDS ( fp_read_rnd() ) FLT_RADIX 2 FLT_MANT_DIG 24 FLT_EPSILON 1.1920928955078125e-7F FLT_MIN_EXP -125 FLT_MAX_EXP 128 DBL_MAX DBL_MIN DBL_DIG DBL_MANT_DIG DBL_EPSILON DBL_MIN_EXP DBL_MAX_EXP 1.7976931348623158e+308 2.2250738585072014e-308 15 53 2.2204460492503131e-16 -1021 1024
PS/LANGAGES
Page 87
11.7 Le fichier errno.h Le fichier errno.h contient les diffrentes valeurs que peut prendre la variable errno.
EPERM ENOENT ESRCH EINTR EIO ENXIO E2BIG ENOEXEC EBADF ECHILD EAGAIN ENOMEM EACCES EFAULT ENOTBLK EBUSY EEXIST EXDEV ENODEV ENOTDIR EISDIR EINVAL ENFILE EMFILE ENOTTY ETXTBSY EFBIG ENOSPC ESPIPE EROFS EMLINK EPIPE EDOM ERANGE ENOMSG EIDRM ECHRNG EL2NSYNC EL3HLT EL3RST ELNRNG EUNATCH ENOCSI EL2HLT EDEADLK ENOTREADY EWRPROTECT EFORMAT ENOLCK ENOCONNECT ESTALE EDIST Operation not permitted No such file or directory No such process interrupted system call I/O error No such device or address Arg list too long Exec format error Bad file descriptor No child processes Resource temporarily unavailable Not enough space Permission denied Bad address Block device required Resource busy File exists Improper link No such device Not a directory Is a directory Invalid argument Too many open files in system Too many open files Inappropriate I/O control operation Text file busy File too large No space left on device Invalid seek Read only file system Too many links Broken pipe Domain error within math function Result too large No message of desired type Identifier removed Channel number out of range Level 2 not synchronized Level 3 halted Level 3 reset Link number out of range Protocol driver not attached No CSI structure available Level 2 halted Resource deadlock avoided Device not ready Write-protected media Unformatted media No locks available no connection no filesystem old, currently unused AIX errno
PS/LANGAGES
Page 88
Utilitaires
12. UTILITAIRES
12.1 Gestion de projets Le langage C s'appuie sur la structuration au niveau des fichiers. Le programmeur va devoir recompiler les diffrents fichiers chaque fois qu'il effectuera des modifications sur l'un de ces fichiers. Il apparat intressant de ne recompiler que les fichiers ayant subi des modifications. Pour cela on utilisera un gestionnaire de projets: le make. 12.1.1 Make L'utilitaire make s'appuie sur un fichier texte appel makefile qui indique les dpendances, ou relations entre les diffrents fichiers. Par dfaut, make cherche dans le rpertoire de l'utilisateur un fichier makefile ou Makefile. Si le fichier makefile n'existe pas dans le rpertoire courant, la commande suivante $make prog gnre la commande suivante: cc prog.c -O -o prog En l'absence de fichier makefile, des rgles implicites sont appliques. Exemple de fichier makefile:
# make de maintenance de l'application prog prog: initial.o princ.o cc -o prog initial.o princ.o initial.o: initial.c initial.h princ.h cc -c initial.c princ.o: princ.c princ.h cc -c princ.c
Lancement: $make -f makefile prog ou plus simplement $make Ce fichier est constitu d'une ligne de commentaires commenant par #, de premires lignes de dpendances directes et de deuximes lignes de commandes de compilation (commenant imprativement par une tabulation). Le rsultat de la compilation sera le fichier prog. Ce programme dpend de initial.o et princ.o. Si l'un de ces fichiers est plus rcent que prog, la ligne de commande cc -o prog initial.o princ.o sera excute pour recrer un nouvel excutable. De la mme faon, initial.o dpend de initial.c, initial.h et princ.h
PS/LANGAGES
Page 89
Utilitaires
12.1.1.1 Syntaxe des fichiers makefile Commentaire jusqu' la fin de la ligne # $(chaine1) vaut chaine2 chaine1=chaine2 Remplace val1 par val2 dans chaine1 $(chaine1:val1=val2) Exemples: OFILE=x.o y.o z.o ... applic:$(OFILE) cc $(OFILE) -O -o applic
$(OFILE:.o=.c)
12.1.1.2 Les macros prdfinies le nom complet du fichier cible $@ le nom du fichier sans suffixe $* liste des fichiers pr-requis dont la date est postrieure celle de l'objectif $? valu seulement quand l'objectif est membre d'une librairie $% le nom du fichier dpendance dans les rgles implicites $<
12.1.1.3 Options du make nom du fichier de description du makefile -f nom afficher les macros et les rgles prdfinies -p afficher les commandes et ne pas les excuter -n les codes d'erreurs des commandes excutes sont ignors -i ne tient pas compte des rgles implicites -r debug : des informations sont donnes sur les fichiers et les dates -d les commandes sont excutes sans tre affiches -s
PS/LANGAGES
Page 90
Utilitaires
12.1.2 Gestion de projets sous TURBO C TURBO C permet de grer des projets selon deux modes: En mode ligne de commande avec un utilitaire make qui fonctionne sensiblement comme le make d'UNIX. Au sein de l'EDI grce au menu PROJECT. Au sein de l'EDI, le gestionnaire de projets permet: L'assemblage automatique de tous les modules L'dition des diffrents fichiers sources ou d'en-tte associs au projet La cration automatique d'un fichier de type makefile qui a pour extension .PRJ. Lorsque l'on reconstruit un projet, le gestionnaire met jour automatiquement les informations du fichier projet. Utilisation du gestionnaire de projets Choisir un nom pour le projet (dans PROJECT/OPEN PROJECT). Ajouter les noms de fichiers source dans la boite de dialogue PROJECT/ADD ITEM. Lancer la compilation au moyen de COMPILE/MAKE. Ensuite, vous pouvez ajouter (ou enlever) des fichiers a votre projet dfinir les options pour un fichier du projet visualiser les fichiers inclus 12.2 L'utilitaire LINT Cet utilitaire permet de vrifier la syntaxe d'un fichier source c. Il n'effectue pas de modifications et ne gnre pas de programme excutable. Il vrifie la syntaxe des instructions et signale celles qui pourraient poser un problme de portabilit. Il effectue un contrle approfondi des types de donnes. Utilisation: lint fichier.c Pour les diffrentes options se reporter la documentation ou l'aide en ligne.
PS/LANGAGES
Page 91
Utilitaires
12.3 Dbogage des programmes sous UNIX UNIX propose des dbogueurs (SDB ou DBX plus convivial). Il est souvent ncessaire de passer par une phase de mise au point d'un programme. Le dbogueur symbolique est un outil qui aide la mise au point des programmes C en permettant d'examiner des variables de poser des points d'arrts d'excuter pas pas etc... 12.3.1 Utilisation de DBX Pour dbogger un programme, il faut le compiler avec l'option -g $cc -g fichier.c -o ficexec puis excuter le programme DBX de la faon suivante: $dbx ficexec (a.out par dfaut) On peut dfinir les options par dfaut ou des alias en utilisant le fichier .dbxinit Exemple: alias p print alias rr rerun alias c cont alias d dump set $listwindow=20 Le prompt de dbx est (dbx). 12.3.2 Lancement et sortie r[arguments] s rerun c n q ou quit
Lancement [avec arguments] Excution pas pas (step) Relance aprs une excution Continue l'excution jusqu'au prochain point d'arrt Excute la ligne suivante. Next quivaut Step over Sortie de dbx
PS/LANGAGES
Page 92
Utilitaires
12.3.3 Pose de points d'arrts stop 100 stop at 100 if var == 2 stop in fonc status delete num delete all clear num
Pose un point d'arrt la ligne 100 Pose un point d'arrt la ligne 100 si var vaut 2 Pose un point d'arrt sur la premire instruction de fonc Affiche tous les points d'arrts Supprime le point d'arrt de la ligne num Supprime tous les points d'arrts Supprime le point d'arrt de la ligne num
12.3.4 Principales commandes d'dition Edite les 10 lignes suivantes (ou 20 si $listwindow=20) (dbx)list ou l Edite la ligne numro n (dbx)l n Edite les lignes de 10 15 (dbx)l 10, 15 Recherche avant et dition de la ligne contenant nom (dbx)/nom/ Recherche arrire et dition de la ligne contenant nom (dbx)?nom? Edite sous 'vi' le programme en debug (dbx) e
12.3.5 Edition du source en cours de debug Edite la ligne courante en excution (dbx) l $ Affiche la ligne qui sera excute aprs la ligne courante (dbx) l @ Edite les +- n lignes qui encadrent la ligne courante (dbx) l $-n, $+n
12.3.6 Examen des variables du programme Affiche l'adresse de var (dbx)print &var Affiche le contenu de var (dbx)print var Si var est un pointeur, affiche ce qui est point par var (dbx)print *var (dbx)print st.membre Affiche le membre de la structure st Affiche tablo (dbx)print tablo (dbx)print tablo [0..2] Affiche les lments de 0 2 de tablo
12.3.7 Commandes diverses (dbx)assign var = val (dbx)print sizeof var (dbx)where (dbx)whereis x (dbx)whatis x (dbx)dump (dbx)alias (dbx)set (dbx)trace
Assigne la valeur val la variable var Affiche la taille en octets de var Affiche l'empilement des fonctions appeles Indique o est dclare la variable x (fichier.main.x) Indique la nature de la variable x (int x) Affiche les noms et les valeurs des variables Liste des alis de dbx Liste des variables internes de dbx Trace l'excution du programme instruction par instruction pour une ligne, une fonction ou le programme
PS/LANGAGES
Page 93
Utilitaires
12.4 Dbogage des programmes sous TURBO C TURBO C, grce au multi-fentrage permet de faire apparatre sur l'cran plusieurs fentres dont l'une est rserve au dbogage. TURBO C propose plusieurs manires de suivre l'excution d'un programme. 12.4.1 Principales commandes F7 (ou menu RUN/TRACE INTO) Chaque frappe sur la touche F7 fait excuter la ligne d'instructions. La prochaine ligne excuter est mise en surbrillance. Lorsque la ligne d'instruction excute est un appel de fonction, cette dernire est excute en mode pas pas. F8 (ou menu RUN/STEP OVER) Idem que F7 mais lorsque la ligne d'instruction est un appel de fonction, la fonction est excute d'un coup. On peut basculer de F7 F8 et inversement. F4 (ou menu RUN/GO TO CURSOR) Excute le programme jusqu' la ligne sur laquelle est positionn le curseur. On peut mettre fin l'excution du programme par CTRL-BREAK. 12.4.2 Actions sur les variables A l'aide du menu DEBUG/ADD WATCH ou CTRL-F7, on peut entrer le nom des variables que l'on souhaite visualiser. On peut galement valuer (et/ou modifier) une variable au cours du dbogage l'aide de la commande menu DEBUG/EVALUATE ou CTRL-F4. On peut aussi inspecter une variable l'aide de menu DEBUG/INSPECT. Le contenu affich indique alors le nom de la variable, son adresse et le type de donne. 12.4.3 Points d'arrts Comme dans tous les dbogueurs, on peut mettre en place des points d'arrts l'aide de la commande menu DEBUG/BREAKPOINTS... ou DEBUG/TOOGLE BREAKPOINTS (CTRL-F8). Ces points d'arrts peuvent tre conditionnels (menu BREAKPOINTS... puis EDIT). 12.5 Gestionnaires de bibliothques Une bibliothque est un groupe de fichiers gr comme un fichier unique par le systme. Chaque membre de la bibliothque est dsign par son nom d'origine. Un fichier de tout peut tre rang en bibliothque. Utilisation : les binaires objets (.o) utiliss par l'diteur de liens.
PS/LANGAGES
Page 94
Utilitaires
12.5.1 L'utilitaire ar (UNIX) Gnralement les bibliothques sont dots du suffixe .a. Exemples : /lib/libc.a bibliothque standard /lib/libm.a bibliothque mathmatique Utilisation $ar option nom_bibli [liste_fic] Options d r u q t v x
suppression de membre(s) du fichier remplacement d'un membre contrle de la date ajoute un membre en fin de fichier affiche le contenu de la bibliothque mode verbose (bavard) extraction d'un membre
12.5.2 L'utilitaire TLIB (TURBO C) Permet de crer ou de maintenir des bibliothques partir de modules objets .OBJ TLIB nom_biblio commande [liste_fic] Commande + * -+ ou +-* ou *-
ajoute le (ou les) modules spcifis retire de la bibliothque le module dsign extraction de la bibliothque sans effacer le module remplace le module dans la bibliothque extraction de bibliothque et efface le module
PS/LANGAGES
Page 95
Annexes
13. ANNEXES
13.1 UTILISATION DE VI 13.1.1 Prsentation de VI VI travaille selon deux modes: un mode commande divis en deux sous-modes - dplacement du curseur, mode insertion, copies, effacement etc.. - un autre sous-mode introduit par : qui permet d'accder certaines commandes spciales un mode texte utilis pour entrer les diffrents caractres du fichier.
13.1.2 Spcification du type de terminal VI doit connatre le type de terminal utilis. On peut le spcifier l'aide de la variable TERM de l'environnement. Exemple: $ TERM=vt320;export TERM
13.1.3 Configuration de VI VI est paramtrable: on peut modifier certains de ses comportements (indentation, numrotation des lignes, tabulations etc..) par la commande set. Exemples :set all : affiche toutes les options de configuration. :set num : affiche la numrotation des lignes sous VI. On peut paramtrer VI de faon permanente en spcifiant les options dans le fichier $HOME/.exrc ou dans la variable d'environnement EXINIT. Exemple de fichier de configuration: set nu # affiche la numrotation des lignes set showmode # affiche sur la dernire ligne l'tat : INPUT MODE/ REPLACE MODE etc... set autoindent # met en oeuvre l'auto-indentation set ts=4 # fixe la tabulation 4 caractres
13.1.4 Entre dans VI $ vi [-options] [nom(s) de fichier(s)] Si on appelle VI sans paramtre, il prsente une page vierge. On peut alors charger un fichier avec la commande :e nom_fich Si le fichier existe, la premire page de celui-ci est affiche. Si le fichier spcifi n'existe pas, il est cr dans le rpertoire courant et VI affiche une page blanche. Si plusieurs noms de fichiers sont spcifis, VI affiche d'abord le premier. Pour accder au suivant :n Pour basculer entre les deux derniers fichiers dits : CTRL-A ou :e# Lorsqu'un fichier est dit, on peut charger un deuxime fichier (:e nouveau) et basculer de l'un l'autre grce CTRL-A ou :e#<RC>
PS/LANGAGES
Page 97
Annexes
Les principales options -R VI ouvre le fichier en lecture seule pour consultation +5 VI ouvre le fichier spcifi la ligne N5 +/mot VI ouvre le fichier la premire occurrence de mot. -r VI peut rcuprer des donnes (un fichier) perdu la suite d'un incident (coupure de courant, fausse manuvre etc..)
13.1.5 Sortie de VI Avec sauvegarde: ZZ ou :x :w suivi de :q ou :wq Sans sauvegarde: :q si pas de modifications :q! si modifications Vers le Shell :! commande ou :sh $ commandes $ <CTRL>D 13.1.6 Cration et insertion de texte Insertion de texte dans une ligne a<texte><ESC> Insertion de texte derrire le curseur. <ESC> sortie du mode Insertion i<texte><ESC> Insertion de texte avant le curseur. A<texte><ESC> Insertion de texte en fin de ligne. I<texte><ESC> Insertion de texte en dbut de ligne Insertion de lignes o<texte><ESC> O<texte><ESC>
Insertion d'une ligne la suite de la ligne courante Insertion d'une ligne avant la ligne courante
PS/LANGAGES
Page 98
Annexes
13.1.7 Dplacement du curseur dans un fichier Sur caractres ou h ou backspace ou l ou espace ou k ou j ou linefeed Sur lignes ^ $ 0 6| CR -
Dbut de ligne Fin de ligne (zro) Dbut de ligne physique 6me caractre de la ligne courante Dbut de ligne suivante Dbut de ligne prcdente
Sur cran H Home (premire ligne de l'cran) L Dernire (Last) M Milieu Sur mots w W Dbut du mot suivant b B Dbut du mot courant e E Fin du mot courant Les commandes majuscules ne tiennent compte que des espaces et des tabulations Les commandes minuscules tiennent compte des signes de ponctuation. Sur phrase ( Dbut de la phrase courante ) Fin de la phrase courante Une phrase se termine par . ! ou ? Sur paragraphe { Dbut du paragraphe } Fin du paragraphe. Un paragraphe se termine par une ligne blanche. Sur numro de ligne 10G ou :10 se place ligne N 10 G ou :$ se place sur la dernire ligne du fichier Sur emplacement marqu (2 simples quotes) permet de se dplacer au dernier endroit marqu par ma permet de nommer un emplacement (ici a) a permet de se repositionner au dbut de la ligne marque `a permet de se repositionner lendroit du marquage (par exemple au milieu de la ligne)
PS/LANGAGES
Page 99
Annexes
13.1.8 Dplacement du curseur dans la fentre z. Centrer sur la ligne courante z<CR> Ligne courante en haut de l'cran zLigne courante en bas de l'cran ^D ^U ^F ^B ^L Un demi cran vers la bas (Down) Un demi cran vers le haut (Up) Un cran (vers le bas Forward) Un cran (vers le haut Backward) Raffrachit l'cran (aprs une modification)
13.1.9 Recherche de chanes de caractres La recherche se fait par /chane en avant dans le fichier ?chane en arrire dans le fichier Prochaine recherche n N // ?? %
dans le mme sens qu'avant dans le sens inverse en avant dans le fichier en arrire dans le fichier recherche le frre pour () , [] , {}
13.1.10 Destruction de texte Destruction de caractres x Dtruit le caractre courant 3x Dtruit 3 caractres X Dtruit le caractre prcdent Destruction de lignes dd ou :d<RC> Dtruit la ligne courante 5dd ou :5d<RC> Dtruit 5 lignes d$ ou D Dtruit la fin de la ligne Destruction de mots dw 3dw ou d3w d/chane
Dtruit le mot courant Dtruit 3 mots Dtruit jusqu' la premire occurrence de chane (non comprise)
PS/LANGAGES
Page 100
Annexes
13.1.11 Remplacement de texte rb Remplace le caractre courant par 'b' R<texte><ESC> Mode REFRAPPE jusqu' ce que l'utilisateur frappe <ESC> s<texte><ESC> Remplace le caractre courant par le texte frapp jusqu' <ESC> 3s<texte><ESC> Remplace 3 caractres par le texte frapp jusqu' <ESC> S<texte><ESC> Dtruit la ligne courante et passe en mode INSERTION ~ Modifie le caractre courant (MAJUSCULE/minuscule) Changement de mots cw<texte><ESC> Remplace le mot par "texte". Le mot remplacer est dlimit par $ c3w<texte><ESC> Remplace les 3 mots par "texte" C ou c$ Remplace jusqu' la fin de la ligne c/chane Remplace jusqu' chane non comprise 13.1.12 Annulation ou rptition d'une commande Annulation d'une commande Annule l'effet de la dernire directive de u changement (mme pour elle) Annule tous les changements effectus dans la U ligne courante Rptition d'une commande Effectue nouveau la dernire commande de . (point) modification de texte Etat du fichier Donne le nom, l'tat du fichier, le numro de ^G ou ligne, o est le curseur et le pourcentage de texte :f au-dessus du curseur.
PS/LANGAGES
Page 101
Annexes
13.1.13 Copie et dplacement de texte Copie de texte La directive y (yank) copie sans dtruire l'objet dans un buffer sans nom. y3w met les 3 mots suivants dans le buffer Y ou yy met la ligne courante dans le buffer 5yy met 5 lignes dans le buffer Il suffit de se positionner et de rcuprer le contenu du buffer sans nom par les directives p ou P p Copie la dernire copie aprs l'objet du mme type P Idem avant l'objet du mme type Autres moyens pour copier du texte: :5,8t25 les lignes 5 8 sont copies aprs la ligne 25 :5,8co25 idem Dplacement de texte Pour chaque directive x ou d , VI mmorise la partie dtruite dans un buffer sans nom jusqu' la prochaine destruction Il suffit de se positionner et de rcuprer le contenu du buffer sans nom par les directives p ou P p Copie la dernire copie aprs l'objet du mme type P Idem avant l'objet du mme type Autre moyen pour dplacer du texte: :5,8m25 les lignes 5 8 sont dplaces aprs la ligne 25 13.1.14 Insrer le contenu d'un autre fichier La directive :r permet l'insertion d'un autre fichier dans le buffer :r fic le contenu de fic est insr l'emplacement du curseur 13.1.15 Insrer le rsultat d'une commande dans un fichier :r! commande permet d'insrer le rsultat de la commande partir de la position courante du curseur 13.1.16 Copie d'une partie d'un fichier dans un autre fichier :adresse1,adresse2w fichier.tmp copie le texte compris entre les lignes adresse1 et adresse2 dans "fichier.tmp" :/chane1/,/chane2/w fichier2 copie les lignes comprises entre chane1 et chane2 dans "fichier2" 13.1.17 Les buffers nomms (de la forme "lettre) "a5yy met 5 lignes dans le buffer a "f3yy met 3 lignes dans le buffer f "ap insre le contenu du buffer a aprs le curseur
PS/LANGAGES Page 102
Annexes
13.1.18 Regroupement de lignes J permet de regrouper des lignes (supprime le caractre fin de ligne de la ligne courante) 13.1.19 Echange de buffers nomms entre fichiers :w sauvegarde du fichier courant "b5yy mmorisation de 5 lignes dans le buffer nomm b :e fic.nou dition d'un nouveau fichier "bp copie des 5 lignes du buffer nomm b aprs la ligne courante :e# retour au fichier de dpart (ou <CTRL>A) 13.1.20 Rcupration des objets dtruits L'diteur sauvegarde les 9 derniers blocs de texte supprims dans un jeu de registre numrots de 1 9 "1p rcupration de la dernire destruction ". rcupration de l'avant-dernire destruction "3p rcupration de la destruction qui prcde l'avant-dernire 13.1.21 Recherche et remplacement de chanes de caractres Substitution de la 1re occurrence de "chane1" par "chane2" pour les lignes d'adresse1 adresse2 :[adresse1[,adresse2]]s/chane1/chane2/[options] Substitution de la 1re occurrence de "chane1" par "chane2" pour la ligne courante :/chane1/s//chane2/ :/chane1/s/chane1/chane2/ ou Substitution de toutes les occurrences de "chane1" par "chane2" pour la ligne courante :/chane1/s//chane2/g Substitution de toutes les occurrences de "chane1" par "chane2" pour la ligne courante avec demande de confirmation (y/n) :/chane1/s//chane2/gc Substitution de toutes les occurrences de "chane1" par "chane2" pour tout le fichier :g/chane1/s//chane2/g Substitution de toutes les occurrences de "chane1" par "chane2" pour tout le fichier avec demande de confirmation :g/chane1/s//chane2/gc Substitution de toutes les occurrences de "chane1" par "chane2" pour tout le fichier avec affichage des lignes traites :g/chane/s//chane2/gp Substitution de toutes les occurrences de "chane1" par "chane2" sur toutes les lignes ne contenant pas "chane3" :v/chane3/s/chane1/chane2/g
PS/LANGAGES Page 103
Annexes
D 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
D 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
H 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
Ch @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _
D 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
H Ch 60 ` 61 a 62 b 63 c 64 d 65 e 66 f 67 g 68 h 69 i 6A j 6B k 6C l 6D m 6E n 6F o 70 p 71 q 72 r 73 s 74 t 75 u 76 v 77 w 78 x 79 y 7A z 7B { 7C | 7D } 7E ~ 7F
D 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
H Ch 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E P 9F
D 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
H Ch A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
D 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
H Ch C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
D H Ch 224 E0 225 E1 226 E2 227 E3 228 E4 229 E5 230 E6 231 E7 232 E8 233 E9 234 EA 235 EB 236 EC 237 ED 238 EE 239 EF 240 F0 241 F1 242 F2 243 F3 244 F4 245 F5 246 F6 247 F7 248 F8 249 F9 250 FA 251 FB 252 FC 253 FD 254 FE 255 FF
PS/LANGAGES
Page 104
Table des matires 1. GENERALITES 1.1 Introduction - Historique 1.2 Notions de fonctions et de blocs 1.3 Le compilateur c 1.3.1 La compilation sous UNIX 1.3.2 La compilation sous TURBO C 2. ELEMENTS DE BASE DU LANGAGE 2.1 Les identificateurs 2.2 Les mots rservs 2.3 Les sparateurs 2.4 Les commentaires 2.5 Principales directives de compilation 2.5.1 Gnralits 2.5.2 Inclusion de fichier 2.5.3 Dfinition de pseudo-constante 2.5.4 Dfinition de macro-instructions 2.5.5 Compilations conditionnelles 2.6 Les constantes 2.6.1 Les constantes entires 2.6.2 Les constantes relles 2.6.3 Les constantes caractres 2.6.4 Les constantes chanes 2.7 Les variables 2.8 Structure d'un programme en langage C 3. LES TYPES DE BASE 3.1 Gnralits-classification 3.1.1 Les types de base 3.1.2 Les types drivs 3.1.3 Le type void 3.1.4 Les dfinitions de types par typedef 3.2 Les types entiers 3.3 Les rels 3.4 Les caractres 3.5 Initialisation des variables 3.6 Modle mmoire d'un programme C 3.7 Classes d'allocation mmoire 3.7.1 Les variables externes 3.7.2 Les variables locales 3.7.3 Les variables locales registres 3.7.4 Tableau rcapitulatif 3.7.5 Dfinition et dclaration d'une variable 3.8 Conversions de types 3.8.1 Combinaisons d'oprandes 3.8.2 Conversions lors d'assignations 3.8.3 Casting d'oprandes 4. LES OPERATEURS DE BASE 4.1 Les oprateurs arithmtiques 4.2 Les oprateurs de manipulations internes 4.3 L'oprateur d'affectation 4.4 Combinaison d'oprateurs 4.5 Incrmentation / Dcrmentation
PS/LANGAGES Page 105
1 1 2 4 5 5 7 7 7 8 8 9 9 9 9 9 10 11 11 11 11 12 12 14 15 15 15 15 15 16 16 17 17 17 18 18 19 20 20 20 21 21 21 21 22 23 23 23 23 24 24
Table des matires 4.6 Les oprateurs relationnels 4.7 Les oprateurs logiques 4.8 Oprateur ternaire ou oprateur conditionnel 4.9 Oprateur squentiel 4.10 Oprateurs d'adressage 4.11 L'oprateur sizeof 4.12 Autres oprateurs 4.13 Priorits des oprateurs 4.14 Remarques sur les rgles de prcdence 5. LES ENTREES - SORTIES SUR LES VOIES STANDARDS 5.1 Gnralites 5.2 Les sorties mises en forme 5.3 Les entres mises en forme 5.4 Les fonctions d'entres-sorties de caractres 5.5 Squences de contrle ansi 6. LES INSTRUCTIONS EN C 6.1 L'instruction if-else 6.2 L'instruction d'aiguillage switch 6.3 La boucle while 6.4 La boucle for 6.5 La boucle do...while 6.6 Les instructions break et continue (sauts associes aux boucles) 6.7 L'instruction return 6.8 L'instruction goto 7. LES FONCTIONS 7.1 Dfinition de fonction 7.2 Appel d'une fonction 7.3 Passage de paramtres 7.4 Retour du rsultat 7.5 Prototypes des fonctions 7.6 Exemples 8. LES TABLEAUX ET LES POINTEURS 8.1 Les tableaux un indice 8.1.1 Initialisation d'un tableau un indice 8.2 Les tableaux multidimensionnels 8.2.1 Initialisation d'un tableau multidimensionnel 8.3 Les chanes de caractres 8.3.1 Fonctions de traitement sur les chanes de caractres 8.4 Tableaux et Fonctions 8.5 Les pointeurs 8.5.1 Gnralits 8.5.2 Dclaration - Utilisation 8.5.3 Pointeurs constants et pointeurs de constantes 8.5.4 Arithmtique des pointeurs 8.5.5 L'allocation dynamique dans le tas 8.5.6 Les pointeurs gnriques 8.5.7 Les pointeurs de fonction 8.5.8 Les pointeurs et les arguments de fonction 8.5.9 Les pointeurs et les oprations sur les tableaux 8.5.10 Les pointeurs et les chanes de caractres 8.5.11 Les tableaux de pointeurs
PS/LANGAGES Page 106
24 25 25 25 25 25 26 26 27 29 29 29 33 36 38 39 39 40 41 41 42 42 43 43 45 45 46 46 47 47 48 51 51 52 52 52 53 53 56 57 57 57 58 58 58 59 60 60 62 63 63
Table des matires 8.5.12 Les paramtres du programme principal 9. LES TYPES ENUMERES ET STRUCTURES 9.1 Les numrations 9.2 Les structures 9.2.1 Gnralits - Dclaration 9.2.2 Initialisation des structures 9.2.3 Accs aux lments 9.2.4 Structures et Fonctions 9.2.5 Pointeurs sur une structure 9.2.6 Structures rcursives 9.3 Les unions 9.4 Les champs de bits 9.5 typedef 10. LES FICHIERS 10.1 Gnralits 10.2 Les fonctions de gestion de fichier 10.3 Les fonctions de niveau 1 10.3.1 open (fcntl.h) 10.3.2 eof (fcntl.h) 10.3.3 read 10.3.4 write 10.3.5 close (fcntl.h) 10.3.6 lseek (fcntl.h) 10.4 Les fonctions de niveau 2 10.4.1 fopen (stdio.h) 10.4.2 fclose (stdio.h) 10.4.3 fseek (stdio.h) 10.4.4 rewind (stdio.h) 10.4.5 ftell (stdio.h) 10.4.6 feof (stdio.h) 10.4.7 ferror (stdio.h) 10.4.8 clearerr (stdio.h) 10.4.9 perror (stdio.h) 10.4.10 getw (stdio.h) 10.4.11 putw (stdio.h) 10.4.12 fflush (stdio.h) 10.4.13 fwrite (stdio.h) 10.4.14 fread (stdio.h) 10.4.15 Autres fonctions de lecture-criture 10.4.16 Autres oprations sur les fichiers 11. AUTRES FONCTIONS DE LA BIBLIOTHEQUE STANDARD 11.1 Les tests de catgories de caractres : <ctype.h> 11.2 Les fonctions mathmatiques : <math.h> 11.3 Les fonctions utilitaires : <stdlib.h> 11.4 Les listes variables d'arguments : <stdarg.h> 11.5 Les fonctions de traitement de la date et de l'heure : <time.h> 11.6 Les limites dfinies par l'implmentation : limits.h, values.h et float.h 11.7 Le fichier errno.h 12. UTILITAIRES 12.1 Gestion de projets 12.1.1 Make
PS/LANGAGES Page 107
64 65 65 66 66 67 67 68 69 69 70 71 72 73 73 73 74 74 74 75 75 75 75 76 76 76 77 77 77 77 78 78 78 78 78 78 79 79 79 79 81 81 82 83 84 85 86 88 89 89 89
Table des matires 12.1.2 Gestion de projets sous TURBO C 12.2 L'utilitaire LINT 12.3 Dbogage des programmes sous UNIX 12.3.1 Utilisation de DBX 12.3.2 Lancement et sortie 12.3.3 Pose de points d'arrts 12.3.4 Principales commandes d'dition 12.3.5 Edition du source en cours de debug 12.3.6 Examen des variables du programme 12.3.7 Commandes diverses 12.4 Dbogage des programmes sous TURBO C 12.4.1 Principales commandes 12.4.2 Actions sur les variables 12.4.3 Points d'arrts 12.5 Gestionnaires de bibliothques 12.5.1 L'utilitaire ar (UNIX) 12.5.2 L'utilitaire TLIB (TURBO C) 13. ANNEXES 13.1 UTILISATION DE VI 13.1.1 Prsentation de VI 13.1.2 Spcification du type de terminal 13.1.3 Configuration de VI 13.1.4 Entre dans VI 13.1.5 Sortie de VI 13.1.6 Cration et insertion de texte 13.1.7 Dplacement du curseur dans un fichier 13.1.8 Dplacement du curseur dans la fentre 13.1.9 Recherche de chanes de caractres 13.1.10 Destruction de texte 13.1.11 Remplacement de texte 13.1.12 Annulation ou rptition d'une commande 13.1.13 Copie et dplacement de texte 13.1.14 Insrer le contenu d'un autre fichier 13.1.15 Insrer le rsultat d'une commande dans un fichier 13.1.16 Copie d'une partie d'un fichier dans un autre fichier 13.1.17 Les buffers nomms (de la forme "lettre) 13.1.18 Regroupement de lignes 13.1.19 Echange de buffers nomms entre fichiers 13.1.20 Rcupration des objets dtruits 13.1.21 Recherche et remplacement de chanes de caractres 13.2 Table ASCII 91 91 92 92 92 93 93 93 93 93 94 94 94 94 94 95 95 97 97 97 97 97 97 98 98 99 100 100 100 101 101 102 102 102 102 102 103 103 103 103 104
PS/LANGAGES
Page 108
Index
#define ,9 #endif,10 #ifdef,10 #ifndef,10 #include,9 #undef,10 abort,83 abs,84 acos,82 ar,95 argc,64 argv,64 asctime,85 asin,82 atan,82 atan2,82 atexit,83 atof,83 atoi,83 atol,83 auto,20 break,40, 42 bsearch,84 calloc,59 case,40 Casting,22 cc,5 ceil,82 char,15 clearerr,78 clock,85 clock_t,85 close,75 commentaires,8 continue ,42 cos,82 cosh,82 ctime ,85 DBX,92 default ,40 difftime ,85 div,84 do...while,42 double,15 enum,65 eof,74 errno.h,88 exit,83 exp,82 extern,21 fabs,82 feof,77 ferror,78 fflush,78 fflush(stdin) ,36 fgetc ,36 fgets,36 float ,15 float.h,87 floor,82 fmod,82 fopen,76 for,41 fprintf ,29
fputc,36 fputs,37 fread,79 free,59 freopen,79 frexp,82 fscanf ,33 fseek,77 ftell,77 fwrite,79 getc,37 getchar,37 getenv,83 gets,37 getw,78 gmtime,85 goto,43 heap,58 identificateur,7 if-else,39 include,9 int ,15 isalnum,81 isalpha,81 isascii,81 iscntrl,81 isdigit,81 isgraph,81 islower,81 isprint,81 ispunct,81 isspace,81 isupper,81 isxdigit,81 labs,84 ldexp,82 ldiv,84 left-value ,21 limits.h ,86 LINT,91 localtime ,85 log,82 log10,82 long,15 lseek,75 lvalue,13, 23 main,2 Make,5, 89 makefile,89 malloc,59 memchr,55 memcmp,55 memcpy,55 memmove,55 memset,55 mktime ,85 modf,82 mots rservs,7 open,74 perror,78 pow,82 printf ,29 putc,37 putchar,37
PS/LANGAGES
Page 109
Index
puts,37 putw,78 qsort,84 rand,83 read,75 realloc,59 register,20 remove,79 rename,79 return,40, 43, 47 rewind,77 rvalue,13 scanf ,33 sparateurs,8 setbuf ,80 setvbuf ,80 short,15 sin,82 sinh,82 sizeof,25 sprintf ,29 sqrt,82 srand,83 sscanf ,33 static ,19 stdaux,29 stderreur,29 stdin,29 stdio.h ,29 stdout,29 stdprn,29 strcat,54 strchr,54 strcmp,54 strcpy,53 strcspn,55 strerror,55 strftime ,86 strlen,55 strncat,54 strncmp,54 strncpy,53 strpbrk,55 strrchr,54 strspn,54 strstr,55 strtod,83 strtok,55 strtol,83 strtoul,83 struct,66 switch,40 system,83 tan,82 tanh,82 tas ,58 time,85 time_t,85 TLIB,95 tmpfile,79 tmpnam,80 toascii,81 tolower,81 toupper,81 transtypage,22 typedef,16, 72 ungetc,37 union,70 va_arg,84 va_end,84 va_start,84 values.h,87 VI,97 void,15 while,41 write,75