Professional Documents
Culture Documents
Gilles Maire
Gilles@gillesmaire.com
Prsentation de la formation
2
Prsentation du langage C
Programme C utilitaire.c
Librairie Glibc
et autres Programme
6
Fabrication d'un programme
Environnements de dveloppement
10
Ouvrir un projet C
11
Le premier programme
On crit le programme
On
compile !
12
On lance le programme Le programme s'excute
Introduction : Langage C ANSI
Plate-formes
Environnement de dveloppement
Formats de prsentation des informations
Types et oprateurs ANSI
Entres/Sorties standards
Instructions et branchements conditionnels
13
Langage C : plate-forme
15
Lettres majuscules
Lettres minuscules sans accent
Chiffres
Caractres de soulignement _
Caractre d'espace, de tabulation, de retour arrire, de
nouvelle ligne, de saut de page
Caractres spciaux et de ponctuation :, ! |; / :
\ ? ~ ' + " # ( % ) &[ ^ ] * {
- } = < > qui ont tous une signification
particulire
16
Langage C : fonction main
17
Exercice 1
18
Langage C : bloc et instructions
Instructions
Une instruction lmentaire est une expression termine par un point virgule (seules les instructions du
prprocesseur C ne devront pas tre suivies d'un point virgule).
Dans le programme gnr par code::blocks on ne trouve qu'un seul bloc qui contient une seule
instruction. Cette instruction appele "printf" est une fonction spcifique du C . Elle permet
d'afficher des donnes.
La phrase "\nExemple de programme c" place entre parenthses sert de paramtre la fonction
printf. Le fait de donner le nom d'une fonction dans une instruction active cette fonction : on appelle
la fonction.
La fonction excute sa mission, puis le programme continue l'instruction suivante. Dans notre
exemple, le programme se termine car il n'y a pas d'autres instructions.
La fonction printf est une fonction prdfinie fournie avec le compilateur. Son code se trouve dans
un fichier spcial appel bibliothque.
19
Les commentaires
Type char
Le type char est utilis pour reprsenter un caractre, plus
prcisment la valeur entire d'un lment de l'ensemble
des caractres reprsentables. Ce nombre entier est le code
ASCII (American Standard for Information Interchange ) du
caractre . Un caractre unique occupe un octet. A est le
caractre 65, a est 97.
Type int entier standard.
Le type int a une taille de reprsentation qui dpend du
systme sur lequel on travaille. Par exemple, sur pc un
lment de type int est stock sur 2 octets alors que sur la
machine Alpha ou sur Vax, il occupe 4 octets.
22
23
Les rels
Type float
Un nombre du type float est habituellement rang en
mmoire sous la forme suivante : mantisse sur 23 bits,
exposant sur 8 bits et signe sur 1 bit .3,4 * 10-38 3,4 * 10 38
Type double
Le type double est stock sur 8 octets. Il est cod comme le
type float, ceci prs que sa mantisse est sur 52 bits et son
exposant sur 11 bits. 1,7*10-308 3,4 * 10 308
long double
mantisse de 64 bits et un exposant de 15 bits 3,4 * 10 -4932
3,4 * 10 4932
24
Constantes
26
Variables
Type varnom1,varnom2, ;
Une variable est un donne qui peut avoir plusieurs valeurs
int x=3 ; veut dire que x prend la valeur 3
x=x+1 ; veut dire que x prend comme nouvelle valeur, sa valeur
incrment d'une unit
Exemple :
int i,j ;
int u=3 ;
char c='\n' ;
Attention ne pas utiliser les mots rservs : auto double int struct break
else long switch case enum register typedef char extern return union
const float short unsigned continue for signed void default goto sizeof
volatile do if static while
27
Porte et initialisation des variables
Sorties formates
29
Formatage numrique
Formatage caractre :
printf("%c", a) ;
Formatage chanes de caractres
prinf ("%s",chaine) ;
32
Exercice 3
33
Exercice 4
34
Entre formate
35
Entres Sorties non formates
char c ;
c = getchar() ; /* lecture sur l'entre standard qui est le
clavier par dfaut */
putchar('a') : affiche a
putchar(12) affiche 12
Ncessite #include <stdio.h>
36
Exercice 5
37
Les oprateurs
38
Exercice 6
39
Exercice 6
40
Oprateur conditionnel
41
Le conversions de type (cast)
Oprateur relationnel
43
Oprateurs logiques
Oprateur d'incrmentation
45
Oprateur d'affectation largie
Oprateur squentiel
47
Oprateur sizeof
48
49
Structure if
Exercice 7
51
Structure switch
Boucle for
Comme la structure while, la structure for est une boucle qui teste une
condition avant d'excuter les instructions qui en dpendent. Les
instructions sont rptes tant que la condition est remplie .
Syntaxe :
for (<expression_I>;<expression_C>;<expression_R>) <instruction>;
for(<expression_I>;<expression_C>;<expression_R>) {
<instruction(s)>;
}
Exemple :
int i;
for(i=1;i<11;i++) printf("%d",i);
55
Instruction do while
Break et continue
57
Exercice 8
58
Les tableaux
Dans certaines applications, il serait utile de pouvoir ranger des valeurs logiquement
rattaches, non pas dans des variables distinctes mais dans une variable commune. Par
exemple, si on veut stocker en mmoire les cotes obtenues par 50 tudiants un examen, il
serait plus simple de pouvoir stocker toutes ces cotes dans une variable de type complexe
plutt que de devoir stocker ces cotes dans 50 variables diffrentes.
Les variables qui permettent de stocker non pas une mais plusieurs valeurs sont des variables
de types complexes(composs). Complexes parce qu'on peut imaginer une telle variable
comme faite d'une srie de variables lmentaires. Le langage C dispose de deux types de
donnes complexes : les tableaux et les structures.
Un tableau est une variable qui se compose d'un certain nombre de donnes lmentaires de
mme type, ranges en mmoire les unes la suite des autres. Chaque donne lmentaire
reprsente elle-mme une variable. Le type des lments d'un tableau peut tre quelconque
Le tableau est unidimensionnel lorsque ses lments ne sont pas eux-mmes des tableaux.
Mais un lment de tableau peut lui-mme tre un tableau, donc un objet de type complexe.
On dit alors que l'on a un tableau multidimensionnel. Le terme "tableau" admet comme
synonymes les mots "vecteur" (tableaux unidimensionnel uniquement), "table" ou "matrice"
59
Tableaux une dimension
Aprs sa dfinition
int x[3];
on peut initialiser ce tableau 0 en mettant :
x[0]=x[1]=x[2]=0;
Au cours de sa dfinition
<Type> <Nom du tableau> <[nombre d'lments>]={k1,k2,
,kn};
Exemple : int t[5]={0,0,0,0,0};
qui peut aussi s'crire int t[5]={0} ;car tous les lments
sont identiques
61
Exercice 9
62
Tableaux multi-dimensionnels
64
char chaine[41];
scanf("%s",chaine); // et pas &chaine
char * chaine="comment allez vous ?" ; // Fonctionne mais chaine est un
pointeur sur une chane constante pas question de changer la valeur de
chane
char s[]="bonjour"; // est quivalent char s[8]="bonjour" ;
char s[]={'b','o','n','j','o','u','r','\0'}; // idem
while((name[i]=getchar())!='\n'){
i++;
name[i]='\0';
}
Nous verrons que les chanes de caractres sont galement des pointeurs :
s[] se note *s
67
Copie de chanes de caractres
Il existe une fonction de bibliothque strcpy qui permet de recopier une chane dans un
tableau char, ce qui correspond bien la manipulation demande.
strcpy(<adresse_tableau1destination>,<adresse_tableau2source>);
Les deux paramtres de la fonction <Adresse_tableau1> et <Adresse_tableau2>
reprsentent les adresses de deux tableaux char. La fonction strcpy copie le contenu du
tableau dont l'adresse est spcifie par le second paramtre de la fonction (caractre
nul compris) dans le tableau dont l'adresse est donne par le second paramtre. Le
tableau "cible" devrait tre ici au moins aussi grand que la chane que l'on y recopie.
Les adresses des tableaux peuvent tre transmises la fonction sous l'une des formes
que nous connaissons dj (nom de tableau, constante chane, expression avec
l'oprateur &, pointeur).
char s[8];
strcpy(s,"bonjour");
L'utilisation de strcpy et de quelques autres fonctions de traitement de chanes de
caractres exige l'inclusion dans le programme du fichier d'en-tte : string.h qui contient
les dclarations des fonctions concernes.
#include <string.h>
68
69
Les fonctions
Dans un programme, on est souvent amen rpter plusieurs fois les mmes
oprations des endroits diffrents et avec des donnes diffrentes. Pour viter de
devoir rcrire chaque fois cette suite d'oprations, la plupart des langages de
programmation permettent au programmeur de dfinir des sous-programmes qu'il
suffit d'appeler aux endroits voulus.
Ces sous-programmes sont aussi trs utiles lorsqu'on a un problme trs complexe
traiter. En effet, il est plus facile de le dcouper en sous-problmes et d'crire un
sous-programme pour chacun d'eux. Il suffit alors de rassembler le tout dans un
programme principal. En C tous les sous-programmes sont appels des fonctions.
Chaque fonction peut en gnral tre teste indpendamment du reste du
programme et une fonction peut tre utilise plusieurs fois diffrents endroits du
programme sans devoir rcrire les instructions chaque fois.
Il existe des fonctions prdfinies que le programmeur peut utiliser, par exemple
printf ou scanf.
Nous allons voir dans la suite du cours comment le programmeur peut dfinir de
nouvelles fonctions
70
Pour construire une fonction, il faut coder les instructions qu'elle doit excuter.
classe type identificateur (liste des paramtres formels avec leur type)
{
corps de la fonction
}
S'il n'y a pas de paramtres, les parenthses sont quand mme obligatoires ( pour
certains compilateurs, on doit mettre void entre parenthses pour indiquer qu'il n'y a
pas de paramtres).
Les dfinitions de fonction se placent dans n'importe quel ordre mais toujours en
dehors de toute fonction(c'est--dire de manire globale).
Si la fonction n'est pas dfinie avant son appel, on est oblig de la dclarer.
71
Dclaration de fonction
Tout objet en C doit tre dclar avant d'tre utilis. Ceci est donc applicable
aux fonctions on peut dclarer la fonction sans sa dfinition mais uniquement
avec ses paramtres. On appellera cela le prototype d'une fonction. Les
arguments sont appels la signature d'une fonction.
classe type identificateur (liste des types des paramtres);
Sur certains compilateur ceci pose problme
#include <stdio.h>
void main() {
message();
}
void message() {
printf("cours de langage\n");
}
on placera une dclaration avant le main
void message() ; // avec les arguments ventuels
72
Paramtres de fonction
73
Retour d'une fonction
74
75
Exercice 10
76
En C, une fonction ne peut retourner qu'une seule valeur. Une fonction ne peut pas modifier la valeur de ses
paramtres.
Pour qu'une fonction puisse fournir des rsultats dans un de ses paramtres effectifs ou modifier un paramtre,
il faut utiliser les pointeurs comme paramtres. Le pointeur(adresse) ne sera pas modifi mais le contenu de
l'adresse sera ,lui, modifi !
void echange(int *,int *);
void main() {
int u,v;
scanf("%d %d",&u,&v);
echange(&u,&v) ;
}
void echange(int *a,int *b)
{ int z;
z=*a;
*a=*b;
*b=z;
}
77
Exercice 11
78
#define
#macro
#undef
#ifdef
Autres directives
79
Les #define
#define nbmax 5
demande de substituer au symbole nbmax le texte 5, et cela chaque fois que ce
symbole apparatra dans la suite du fichier source.
#define entier int
place en dbut de programme, permettra d'crire "en franais" les dclarations de
variables entires. Ainsi par exemple :
entier a,b;
sera remplac par :
int a,b;
On peut galement remplacer une instruction par un mot :
#define bonjour printf("bonjour");
#define affiche printf("resultat %d\n",a);
#define ligne printf("\n");
80
Attention attention
82
84
Autres directives
L'oprateur #defined
L'oprateur defined est un oprateur spcial : il ne peut tre utilis que dans le contexte d'une
commande #if ou #elif. Il peut tre utilis sous l'une des deux formes suivantes : defined nom ou
bien : defined ( nom ). Il dlivre la valeur 1 si nom est une macro dfinie, et la valeur 0 sinon.
L'intrt de cet oprateur est de permettre d'crire des tests portant sur la dfinition de plusieurs
macros, alors que #ifdef ne peut en tester qu'une.
#if defined(SOLARIS) || defined(SYSV)
85
Programmation II
Gestion de la mmoire
Pointeurs et allocation dynamique
Structures et Unions
Champs de bits
Types et numrations
86
Les pointeurs
87
Dfinition
88
Pointeur et adresse
91
92
malloc
#include <stdlib.h>
La fonction "malloc" prend de la place mmoire sur le tas (heap). Ce
dernier est une zone de mmoire libre, disponible pour le programme
concern. Pour cela, on transmet la fonction, comme paramtre , un
nombre entier exprimant la dimension (en octets) du bloc mmoire que l'on
dsire rserver. La fonction "malloc" rserve alors(si possible) un bloc de
mmoire contigu ayant la dimension indique et retourne son adresse
void * malloc(int size);
exemple : double *d;
d=(double*) malloc(400);
si malloc n'arrive pas rserver de la mmoire elle renvoie un pointeur
NULL
93
Exercice 12
94
Cas des chanes de caractres
95
Organisation de la mmoire
HEAP (Tas)
malloc (C)
new (c++)
DONNEES STATIQUES
variables globales et locales statiques, constantes,fonctions
CODE 96
Exercice 12 bis
97
calloc
void * calloc(int,int);
les valeurs entires <nombre> et <dimension> dsignent
respectivement le nombre d'objets dsirs et la taille (en
octets) de chaque objet. <pointeur> est une variable
pointeur dans laquelle on range l'adresse du bloc allou
retourne par calloc.
calloc rservera donc nombre * dimension octets
calloc initialise la mmoire 0 ce qui peut tre utile
98
realloc
99
Fonctions
Lorsqu'on veut qu'une fonction puisse modifier la valeur d'une donne passe
comme paramtre, il faut transmettre la fonction non pas la valeur de l'objet
concern, mais son adresse. La consquence en est que la fonction appele ne
travaille plus sur une copie de l'objet transmis, mais sur l'objet lui-mme (car la
fonction en connat l'adresse). La fonction appele range l'adresse transmise dans
un paramtre formel appropri, donc dans un pointeur. Bien que ce paramtre
formel ne soit qu'une variable locale la fonction appele, la fonction a maintenant
accs, via ce paramtre, l'objet de la fonction appelante dont l'adresse a t
passe comme paramtre effectif. Le passage des paramtres par adresse permet
donc une fonction de modifier les valeurs des variables d'autres fonctions.
Si nous reprenons la fonction "echange" dj rencontre, on peut comprendre
maintenant son prototype :
void echange (int *, int *);
en effet, on communique la fonction des adresses d'entiers et donc, les
paramtres formels de cette fonction sont des pointeurs vers des entiers.
l'appel se fera par echange(&val1,&val2)
100
Pointeur en argument d'une fonction
101
102
Fonctions avec arguments variables
v_start initialise ap qui peut tre de type entier, char * etc en fonction du type de n
v_arg renvoie l'argument suivant, suivant le type donn en deuxime argument
v_end dclenche un retour normal de la fonction
103
Le fonctions rcursives
105
Les numrations
106
Variables structures
struct livre{
char auteur[30];
char titre[20];
short an;
};
struct livre l={"AGATHA","CHRISTIE","MORT SUR LE NIL",1965};
on peut galement btir un tableau de variables structures
struct livre livres[200] ;
l'auteur du premier livre sera livres[0].auteur
on utilise souvent un typedef pour dfinir une structure
typedef struct {
char titre[10] ;
int ISBN ;
} livres;
On peut utiliser livres comme un type et dclarer livres l ;
107
Pointeurs et structures
struct article
{
char nom[20];
long numero ;
};
struct article *px; dfinit un pointeur sur la structure article
on accde on nom par (*px).nom ou par la notation simplifie
px->nom
Notons aussi que l'on peut trouver la variable struct article
a avec :
a.nom
&a->nom
108
Les structures
struct client{
char nom[30];
char prenom[20];
int cp;
float ca;
};
struct client a;
On accde nom par a.nom que l'on peut manipuler comme une chane
de caractres puisque c'en est une.
On peut faire struct client a, b ; suivi de b=a, par contre on ne peut
comparer deux structures.
la structure peut tre dclare dans la partie variable globale (en dehors du
main) ou dans la partie variable locale (dans une fonction)
on ne peut pas initialiser les diffrents champs des structures
109
Listes chanes
111
Exercice 13
112
Structures et fonctions
113
Les unions
Le langage C permet de crer, l'intrieur d'une structure, des donnes (champs) dont
la taille est spcifie en bits. Ces champs doivent tre de type entier. Par exemple :
struct {
unsigned a : 1;
unsigned b : 1;
unsigned c : 4;
unsigned d : 3;
} x;
Ici, on a une structure x compose de 4 champs tous de type unsigned int : a de taille
= 1 bit, b de taille = 1 bit, c de taille = 4 bits, et d de taille = 3 bits. Cela ne signifie pas
que la taille de x est de 9 bits mais au moins 9 bits. La taille d'une donne est toujours
un multiple entier d'un "octet".
Les champs de bits peuvent tre galement utiliss, en faisant une union avec un
autre type, dans des programmes dpendantes d'une plateforme particulire pour
accder directement aux bits d'une donne quelconque. On retrouve alors l'intrt de
crer des champs sans noms : ils sont juste utiliss pour espacer des champs entre
eux. Dans des programmes portables, on utilisera plutt les oprateurs de
manipulation de bits que les unions et les champs de bits.
115
117
criture
int fputc(int <caractre>,FILE *<pointeur >);
La valeur de retour de cette fonction est un nombre entier
correspondant au caractre crit si pas de problme, ou
EOF (-1) en cas de problme.
Lecture
int fgetc (FILE *<pointeur>);
La fonction fgetc retourne le caractre lu sous la forme d'une
valeur entire. Si la valeur EOF(-1) est renvoye c'est que la
fin de fichier a t atteinte ou qu'il y a eu une
118
Lecture criture des chanes de caractres
criture
int fputs(char *<string>,FILE *<pointeur>);
La fonction fputs crit une chane de caractres dans un fichier, la
position courante. Le caractre nul de fin de chane n'est pas recopi. Fputs
retourne une valeur non ngative si l'criture s'est droule sans encombre.
La valeur de retour EOF indique une erreur.
Lecture
char * fgets(char *<string>, int <nombre>, FILE *<pointeur>);
Le premier paramtre correspond l'adresse de la zone mmoire qui va
recevoir la chane lue.Le deuxime paramtre donne le nombre de
caractres ranger dans la chane.Le troisime paramtre indique le
pointeur FILE rattach au fichier dans lequel on lit.
La fonction fgets retourne un pointeur vers le dbut de la zone mmoire
contenant la chane de caractres lue ou bien le pointeur NULL en cas de fin
de fichier ou d'erreur.
119
Exercice 14
120
Classes de variables
121
Variables auto
automatique : auto
Les variables de classe auto sont dfinies au sein d'une fonction ou d'un bloc.
Toute variable locale est donc par dfaut auto.
La porte d'une variable auto est la fonction dans laquelle elle est dfinie.
La variable n'existe en mmoire que durant l'excution de la fonction ou du bloc
dans lequel elle est dfinie. Lorsque toutes les instructions du bloc sont
excutes, la variable disparat de la mmoire et sa valeur est
automatiquement perdue pour le programme. Si le bloc est de nouveau
excut, la variable est recre.
Une variable auto n'a pas de valeur initiale par dfaut. Si elle apparat dans le
membre de droite d'une galit, elle doit avoir t initialise soit par affectation
soit explicitement lors de sa dfinition.
122
Variables static
statique : static
Les variables statiques sont dfinies avec le mot cl static.
Elles ont la mme porte que les variables auto mais elles
existent en mmoire pendant toute l'excution du
programme.
Une variable statique existe partir du moment o le bloc
dans lequel elle a t dfinie a t excut une fois.
Une telle variable est cre une seule fois en mmoire. Si
elle est initialise lors de sa dfinition ,elle ne sera plus
rinitialise lors d'un appel ultrieur.
Une telle variable est initialise automatiquement zro
123
variable extern
externe : extern
On utilise parfois, dans une fonction ou dans un bloc, le
mot cl extern dans la dfinition d'une variable. Il est l
pour indiquer au compilateur qu'il ne s'agit pas ici de la
dfinition d'une variable locale , mais de la dclaration
d'une variable qui a t dfinie ailleurs dans le
programme. Cette dclaration ne cre pas de nouvel objet,
et en particulier n'entrane aucune allocation de mmoire
pour quelque donne que ce soit. Elle sert simplement
dclarer au compilateur qu'il doit utiliser une variable
globale dfinie ailleurs dans le programme. On parle alors
d'importation de variable globale.
124
Exercice 15
125
Variables volatiles
127
Les principales options de compilation
129
Quatre tapes
Preprocessing
gcc -E programme.c > programme.i
Compilation vers l'assembleur
gcc -S programme.i produit le fichier programme.s
Assembleur vers le code machine
gcc -c programme.s produit le fichier programme.o
dition des liens
gcc -o programme programme.o produit l'excutable programme
Mais en gnral on fait les 4 en une tape raccourcie :
gcc -o programme programme.c
130
Makefile
131
all : hello
hello: hello.o main.o
gcc -o hello hello.o main.o
hello.o: hello.c
gcc -o hello.o -c hello.c
main.o: main.c hello.h
gcc -o main.o -c main.c
clean :
rm *.o
132
Pour aller plus loin
Les librairies
135
Librairie dynamique
Cration
gcc -c -fPIC truc -o truc.o
gcc -shared -fPIC truc.o -o libtruc.so
L'option -fPIC (Position Independent Code) compile sans
indiquer d'adresse mmoire dans le code
Utilisation
cp libtruc.so /usr/local/lib
lancer ldconfig : il inspecte les bibliothques dans les
emplacements /lib,/usr/lib,/usr/local/lib, les chemins
indiqus dans /etc/ld.so.conf , les chemins de
LD_LIBRARY_PATH.
136
Techniques de dveloppement
137
138
Alignement en mmoire
Exemple
140
Rgles pour la portabilit
Redfinissez les types car : char est toujours sur 8 bits, mais en fonction de
architectures short, int peuvent aller de 16 64 bits,long de 32 64 bits. Idem pour
les pointeurs sur entier ou long
mfiez vous donc des cast sur les pointeurs
signed unsigned n'est pas portable
pensez que les chanes de caractres sont constitues de charactres UTF8 sur 16
bits
Pensez aux problmes d'alignements de donnes ( voir struct )
Pensez que certaines machines sont little endian d'autre big endian
Mfiez vous des manipulations de bits
Utilisez des librairies portes dans tous les environnements Qt4 par exemple
fonctionne sous Windows, Mac, Unix
vitez d'crire des portions de code qui communiquent avec un hardware, passez
par des librairies portables au pire crivez une librairie contenant toutes les
fonctions communiquant avec le hardware
141
Redfinissez les types car : char est toujours sur 8 bits, mais en fonction de
architectures short, int peuvent aller de 16 64 bits,long de 32 64 bits. Idem pour
les pointeurs sur entier ou long
mfiez vous donc des cast sur les pointeurs
signed unsigned n'est pas portable
pensez que les chanes de caractres sont constitues de charactres UTF8 sur 16
bits
Pensez aux problmes d'alignements de donnes ( voir struct )
Pensez que certaines machine sont little endian d'autre big endian
Mfiez vous des manipulations de bits
Utilisez des librairies portes dans tous les environnements Qt4 par exemple
fonctionne sous Windows, Mac, Unix
vitez d'crire des portions de code qui communiquent avec un hadware, passez
par des librairies portables au pire crivez une librairie contenant toutes les
fonctions communiquant avec le hardware
142
Techniques de dbogage
Dbugueur gdb
Interface ddd
Excution pas pas
Points d'arrt conditionnels
Scrutation des registres de la mmoire
Dbugage distance
Dbugage crois
nm
143
gdb
gdb est un dbogueur en interface ligne de commande il est appel par les outils de haut niveau
et peut tre masqu par des interfaces graphiques. Souvent les interfaces graphiques ne tirent
pas toute la puissance de gdb
il est utile d'avoir compil son programme avec l'option -g afin de disposer des tables des
symboles
help
help affiche une aide de premier niveau
help data affiche une aide de deuxime niveau sur la rubrique choisie ici data
help command affiche l'aide sur une commande
on peut afficher les variables voulues par :
print variable : affiche la variable
whatis fonction : affiche le prototype de la fonction
where affiche la pile des fonctions appeles
dump avec divers arguments permet d'envoyer des donnes dans un fichier
binaire
watch pose un point d'affichage c'est dire interrompt l'affichage lorsqu'une
variable est modifie
list : affiche l'endroit o l'on se trouve dans le code
145
146
Autres outils
147
148
Debug aprs plantage
149
Fonctions inline
152
C++
Prsentation
153
C++
155
Utilisation de librairies C
156
Vocabulaire
157
New Delete
T *p=(T*) malloc(sizeof(T)) ;
est remplac par
T *p = new T ;
Pour les tableau on ajoute la dimension
double *table= new double[dim]
int *tab= new int[10] ;
dim peut tre une expression quelconque et pas seulement une constante comme en C.
dans les tableaux deux dimensions seule la premire dimension peut tre une expression,
les autres doivent tre des constantes
159
160
Dclaration de variables
161
Espace de nom
#include <string>
string nom("Albert Dupont") ;
string nom("Einstein"), prenom("Albert") ;
163
#include <vector>
vector <type> nom (taille) ;
initialisation :
vector <type> nom (taille,valeur) ;
Exemple :
vector <int> tableau(5) ; tableau[2] etc
vector <int> tableau(5,0) ;
vector<string> listeNoms(12, "Sans nom");
Modification de taille :
nom.push_back(valeur) ;
tableau.push_back(2) ; => on ajoute un lment initialis 2
tableau.pop_back(1) ; => on enlve 1 lment
tabeau.size() => taille courante du tableau
164
Mutable
166
Rfrences
Dfinition :
la rfrence est une faon de renommer un objet X& est une rfrence
vers l'objet
Exemple : double & ref = compteur ;
Une rfrence doit obligatoirement tre initialise au moment de sa
dclaration
ce mcanisme est utilis pour permettre le passage d'arguments de
fonction par rfrence
ainsi void incremente ( int *i )
peut s'crire void incremente (int &i)
si on fait prcder la rfrence par const on est sr que le paramtre ne
sera pas modifi et qu'en plus il n'y aura pas de recopie de l'argument
void incremente ( const int &i)
l'appel se fait juste par incremente (i) et surtout pas incrmente (*i) ;
167
Entres sorties simplifies
#include <iostream>
using namespace std ;
lecture d'un entier
cin >> i ;
Affichage d'un entier et du suivant
cout << i << i+1 ;
affichage d'une fin de ligne
cout << endl ;
affichage d'une chane de caractres
cout << chaine << endl ;
une fonction cerr permet d'envoyer les messages sur la sortie d'erreurs
remarque en omettant using namespace std ; on doit adopter la syntaxe :
std::cout<<chaine<<std::end ;
168
Accs au fichiers
#include <fstream>
using namespace std;
ofstream flux("fichier.txt"); // ouverture en criture
ofstream monFlux(" fichier", ios::app); // criture en fin
ifstream flux("fichier") ; // ouverture en lecture
ostream f
flux <<"entier :"<<i<<endl
on peut utiliser getc() etc ..
critre avec >>
fermeture avec flux.close() ;
consulter le fichier fstream.h
169
Paramtres par dfaut des fonctions
170
Surcharge de fonctions
171
Limites de la surcharge
Une mme classe ne peut pas redfinir une fonction avec le mme nom d'une
fonction existante si :
elles ne diffrent que par leur type retour ;
elles ont les mmes arguments, le mme type retour mais l'une d'elles est
statique ;
elles ont les mmes arguments, le mme type retour, la mme constance mais
l'une d'elles est virtuelle (ou virtuelle pure) et l'autre normale ;
elles ont les mmes arguments, le mme type retour, la mme constance mais
l'une d'elles est virtuelle et l'autre virtuelle pure ;
un argument ne diffre qu' cause d'un typedef ;
elles ne diffrent que par un const non significatif sur le type d'un argument.
elles ne diffrent que par les valeurs par dfaut de leur(s) argument(s).
172
Exceptions : principe
173
C++
Les classes
174
Dclarations de classes
[mthode;
[mthode;
[]]]
}; // ne pas oublier le ;
les mthodes sont des fonctions propres cette classe
un objet correspondant une classe est une instance de la
classe
175
Exemple de dclaration de classe
struct client
{
char Nom[21], Prenom[21]; // Dfinit le client.
unsigned int Date_Entree; // Date d'entre du client
int Solde ;
bool dans_le_rouge(void {return (Solde<0);
}
bool bon_client(void)
{
return (Date_Entree<1993); // Date limite : 1993.
}
};
176
Conventions
struct class
struct mere{ class mere{
int fonction(int) ;
int i ;
private:
public :
int i ; int fonction(int) ;
} }
int mere::fonction(int j) int mere::fonction(int j)
{
{
i=2 ;
i=2 ;
return ( 2*i*j) ;
return ( 2*i*j) ;
} }
int main() int main()
{
{
// en C++ sans struct
mere m ; mere m ;
int i= m.fonction(2) ; int i= m.fonction(2) ;
} }
178
179
Exemple
struct client {
public:
char nom[21] ;
char prenom[21] ;
private :
bool bonclient() ;
bool mauvaisclient()
};
par dfaut les classes struct voient tous leurs lments publics
Si on veut que tous les lments soient par dfaut private on remplace le
mot struct par class (c'est souvent l'appellation par dfaut)
Dfaut veut dire que pour struct on n'est pas oblig de commencer par
public et pour class on n'est pas oblig de commencer par private
180
Utilisation et this
182
Utilisation de ::
186
Exercice 16
187
Constructeur de classe
189
Dans un fichier h
class machin {
machin () ;
~machin() ;
};
Dans un fichier cpp
machin::machin(){
du code d'initialisation de la classe
}
machin::~machin(){
du code gnralement de libration de la mmoire dynamique
}
190
C++
Hritage drivation
192
Hritage / drivation
193
Exemple fondamental
class mere {
public :
int i ;
// la classe accde ses donnes class fille3: private mere{
mere(){ i=0; j=0; k=0; } public:
private : fille3() {k=3;} /// n'accde pas pas i ni j
int j; };
protected :
int k ;
}; int main()
class fille1 : public mere{ {
public: mere m;
// la classe accde i et k // de l'extrieur on accde uniquement la //
fille1(){ i=1; k=1; } // fille n'accde pas j donne publique
}; m.i ;
class fille2 : protected mere { fille1 f1;
public : // on n'accde la donne publique
// la classe accde i et k f1.j ; // accde j
fille2() {i=2 ;k=2 ; } /// n'accde pas j // aucune des donnes n'est publique
}; fille2 f2 ;
class fille21 : public fille2 { fille21 f21 ;
public : fille3 f3 ;
fille21() {i=21 ;k=21 ; } /// n'accde pas j return(1);
}; }
194
Rsum hritage
Classe mre classe fille public classe fille protected classe fille private
private non visible non visible non visible
protected visible protected visible protected visible private
public visible public visible protected visible private
195
Intrt des limiteurs private, public et protected
199
Exercice 17
200
Drivation de type
203
Explication drivation de type
Mre
Fille
204
Hritage multiple
class mere1 {
public:
mere1(){i=1;}
int i ; int k;
};
class mere2 {
public:
mere2(){i=2;}
int i;
int j;
};
class fils :public mere1, public mere2 {
};
int main ()
{
fils f;
std ::cout<<f.mere2::i<<std ::endl; // Sans la classification mere2 :: on a ambigut
return 2;
}
206
Polymorphisme : prsentation
class mere{
public :
void methode() ;
}
class fille : public mere{
public :
void methode() ; // masquage de la mthode
}
void fonction ( mere m)
{
m.methode () ;
}
main()
{
mere m ;
fonction(m) ;
fille f ;
fonction(f) ; // c'est methode qui sera appele !! (rsolution statique)
}
207
Polymorphisme : mthode virtuelle
208
Exercice 18
209
Cas des constructeurs et destructeurs
211
Classes abstraites
212
Classes amies
Pour rendre toutes les mthodes d'une classe amies d'une autre classe,
il suffit de dclarer la classe complte comme tant amie.
class Hote
{
friend class Amie; // Toutes les mthodes de Amie sont amies.
int i; // Donne prive de la classe Hote.
public:
Hote(void) {
i=0;
}
};
Attention : l'amiti n'est pas transitive et les classes drives de classes
amies ne sont pas amies.
214
Transtypage de constructeur
216
Objet membre
217
Surcharge des oprateurs
218
Surcharge interne
219
Surcharge des oprateurs externes
220
Exercice 19
crire une classe qui gre des heures sous sous la forme
heures, minutes, secondes
On fournira une fonction qui indique l'heure sous forme
heures, minutes et secondes partir d'une chane
"hh:mm:ss", si aucune chane n'est entre le compteur
sera initialis zro
On fournira deux oprateurs permettant d'ajouter deux
heures (dure) et de retrancher deux heures (temps
pass)
221
C++
Librairies SL et STL
222
La librairie SL
223
SL : hritage du C
224
STL
225
Mthodes communes
C++
Notions avances
227
Les exceptions
Exception : try
Structure du try
// ici on met du code sans test particulier
try
{
// ici on met du code qui peut gnrer une exception
throw ...
}
on peut mettre un bloc try dans un bloc try
229
Exceptions : throw expression
230
Exception : catch
Templates
233
Templates convention
234
Template fonction
Exemple : dclaration
template <class T>
T Min(T x, T y){
return x<y ? x : y;
}
Utilisation par instanciation implicite
int i = Min (2 ,4) ;// comme 2 et 3 sont entiers T est considr comme entier
en cas d'ambiguit par exemple min (2 ,3.4) faire int i = Min<int>(2,3.4)
Utilisation par instanciation explicite
template int Min(int, int) ;
i = Min(2,3) ;
235
Template fonction
Exemple : dclaration
template <class T>
T Min(T x, T y){
return x<y ? x : y;
}
Utilisation par instanciation implicite
int i = Min (2 ,4) ;// comme 2 et 3 sont entiers T est considr comme entier
en cas d'ambiguit par exemple min (2 ,3.4) faire int i = Min<int>(2,3.4)
Utilisation par instanciation explicite
template int Min(int, int) ;
i = Min(2,3) ;
236
Template classe
Dfinition :
template <paramtres_template> class|struct|union nom;
Exemple :
template <class T> class Chaine
{
public:
// Fonction membre template dfinie
// l'extrieur de la classe template :
template<class T2> int compare(const T2 &) ;
// Fonction membre template dfinie
// l'intrieur de la classe template :
template<class T2>
Chaine(const Chaine<T2> &s) {
//
}
};
Instanciation
template<class T = char> class Chaine;
template Chaine<>; // Instanciation explicite de Chaine<char>.
237