Académique Documents
Professionnel Documents
Culture Documents
Module: M1 - LFSMI - S4
Prof. R. HANNANE
r.hannane@uca.ma
Types composés
Introduction
Pourquoi faire?
⇒ Créer de nouveaux types de variables devient
indispensable quand on cherche à faire des
programmes plus complexes
Types composés
Structure
Structure
Définition d’une structure
Attention:
Le point-virgule après l’accolade fermante est obligatoire.
Si vous ne le faites pas, la compilation plantera.
Prof. R. HANNANE (FSSM) Programmation II 5 / 39
Les types composés
Structure
Définition d’une structure
Remarque:
On met entre les accolades les variables dont est
composée notre structure
Une structure est généralement composée d’au moins deux
”sous-variables”
Il n’y a pas de limite au nombre de variables dans une structure
Exemple de définition d’une structure nommée Coordonnees qui
permette de stocker les coordonnées d’un point:
Exemple:
struct Coordonnees
{
int x ; // Abscisses
int y ; // Ordonn é es
};
Structure
L’utilisation de structure
Une fois que la structure est définie dans le fichier .h, on peut
l’utiliser dans une fonction du fichier .c
La création d’une variable de type structure se fait comme suite:
Exemple:
# include " main . h " /* Inclusion du fichier . h qui contient
les prototypes et structures */
int main ()
{
struct Coordonnees point ; /* Cr é ation d ’ une variable " point "
de type Coordonnees . Cette variable est
a ut om at i qu em e nt compos é e de
deux sous - variables : x et y */
// suite du programme
return 0;
}
Structure
L’utilisation de structure
Note:
Il est obligatoire d’écrire le mot-clé struct lors de la
déclaration de la variable
Cela permet au compilateur de différencier un type de
base (comme int) d’un type personnalisé (comme
Coordonnees)
Problème:
C’est lourd de mettre le mot struct à chaque définition
de variable personnalisée
Solution:
Ajout de l’instruction typedef qui sert à créer un alias de
structure, c’est-à-dire qu’écrire telle chose équivaut à écrire
telle autre chose
Prof. R. HANNANE (FSSM) Programmation II 8 / 39
Les types composés
Structure
L’utilisation de structure
Comment??
⇒ En ajoutant une ligne commençant par typedef juste avant
la définition de la structure
Exemple:
typedef struct Coordonnees Coordonnees ;
// é crire le mot Coordonnees est é quivalent à
é crire struct Coordonnees
struct Coordonnees
{
int x ;
int y ;
};
Structure
L’utilisation de structure
L’habitude veut que ces deux étapes soient faites en
même temps, comme suite:
Exemple:
typedef struct Coordonnees
{
int x ;
int y ;
} Coordonnees ;
Structure
L’accès aux champs de structure
Chaque élément d’une structure, appelé membre ou champ, est désigné par un
identificateur
Structure
L’accès aux champs de structure
Exemple:
typedef struct Coordonnees
{
int x ;
int y ;
} Coordonnees ;
int main (){
Coordonnees point ;
point . x =12; /* affecte la valeur 12 au champ x
de la structure point */
printf ( " x =% d " , point . x ); /* affiche la valeur du
champ x de la structure point */
scanf ( " % d " ,& point . y ); /* lit une valeur qui sera
affect é e au champ y de la structure point .
Notez bien la pr é sence de l ’ op é rateur & */
point . x ++; /* incr é mente de 1 la valeur du
champ x de la structure point */
return 0;
}
Structure
Utilisation globale d’une structure
point2 . x = point1 . x ;
point2 . y = point1 . y ;
Structure
Utilisation globale d’une structure
Attention:
Une affectation globale n’est possible que si les structures
ont été définies avec le même nom de modèle
Structure
Initialisations de structure
Structure
Initialisations de structure
Structure
Structure et tableaux
Exemple:
struct Personne
{
char nom [100];
char prenom [100];
char adresse [1000];
int age ;
char genre ; // h = homme , f = femme
};
Structure
Structure et tableaux
Structure
Structure et tableaux
Structure
Structure et tableaux
Attention aux Tableaux de structure
struct Personne employe [10];
employe [ i ]. nom ;
Structure
Structure de structures
Exemple:
struct date
{
int jour ;
int mois ;
int annee ;
};
struct Personne
{
char nom [50] ;
char prenom [50] ;
int age ;
struct date date_embauche ;
} employe , employe1 ;
Structure
Structure de structures
Structure
Structure et fonctions
Les structures peuvent être utilisées comme résultat
d’une fonction
Exemple: La fonction creationpoint qui prend deux entiers
et retourne une structure point
Exemple:
struct Coordonnees creationpoint ( int x , int y ) {
struct Coordonnees temp ;
temp . x = x ;
temp . y = y ;
return temp ;
}
Structure
Structure et fonctions
Structure
Structure et fonctions
Structure
Structure et pointeurs
Problème:
L’opérateur ” . ” ne convient plus lorsqu’on veut accéder,
au sein de la définition de fct, à chacun des champs de la
structure d’adresse ads, car il suppose comme premier
opérande un nom de structure et non une adresse
Prof. R. HANNANE (FSSM) Programmation II 26 / 39
Les types composés
Structure
Structure et pointeurs
Solutions:
1 Adopter une notation telle que (*ads).a ou (*ads).b pour
désigner les champs de la structure d’adresse ads
Structure
Structure et pointeurs
Exemple:
# include < stdio .h >
typedef struct enreg {
int a ;
int b ; } Enreg ;
int main () {
void fct ( Enreg *) ;
Enreg x ;
x . a = 1; x . b = 12;
printf ( " \ n avant appel fct : % d % d " ,x .a , x . b );
fct (& x ) ;
printf ( " \ n au retour dans main : % d % d " , x .a , x . b );
return 0;}
void fct ( Enreg * s ){
s - > a = 0; // (* s ). a =0;
s - > b =1; // (* s ). b =1;
printf ( " \ n dans fct : % d % d " , s - >a , s - > b );
} /* Affichage :
avant appel fct : 1 12
dans fct : 0 1
au retour dans main : 0 1 */
Prof. R. HANNANE (FSSM) Programmation II 28 / 39
Les types composés
Structure
Structure et pointeurs
Attention:
Le raccourci de la flèche (”− >”) est réservée aux
pointeurs, tandis que le point (” . ”) est réservé aux
variables
Exemple:
int main ()
{
Coordonnees point ;
Coordonnees * pointeurPoint = & point ;
point . x = 10; /* On travaille sur une variable ,
on utilise le "." */
printf ( " point . x =% d \ n " , point . x ); // point . x =10
pointeurPoint - > x = 12; /* On travaille sur un
pointeur , on utilise la fl è che */
printf ( " pointeurPoint - > x =% d \ n " , pointeurPoint - > x );
// pointeurPoint - > x =12
return 0;
}
Prof. R. HANNANE (FSSM) Programmation II 29 / 39
Les types composés
Structure
Structure et Allocation Dynamique
Les champs d’une structure peuvent aussi être des pointeurs
Exemple:
# include < stdio .h >
# include < stdlib .h >
typedef struct data {
int * array ;
} Data ;
int main (){
int j , l =2;
Data x , y ;
x . array =( int *) malloc ( l * sizeof ( int ));
y . array =( int *) malloc ( l * sizeof ( int ));
x . array [0]=1; x . array [1]=2;
y . array [0]=8; y . array [1]=8;
for ( int j =0; j < l ; j ++)
printf ( " x . array [% d ]= % d \ t y . array [% d ]= % d \ n " ,j , x . array [ j ] ,j , y . array [ j ]);
x = y ; /* Attention : c ’ est pas une copie de contenu de memoire , mais c ’ est une
copie de pointeur d ’ array */
printf ( " \ n " );
for ( int j =0; j < l ; j ++)
printf ( " x . array [% d ]= % d \ t y . array [% d ]= % d \ n " ,j , x . array [ j ] ,j , y . array [ j ]);
x . array [0]=123;
printf ( " \ n \ n " );
for ( int j =0; j < l ; j ++)
printf ( " x . array [% d ]= % d \ t y . array [% d ]= % d \ n " ,j , x . array [ j ] ,j , y . array [ j ]);
free ( x . array );
return 0;}
Prof. R. HANNANE (FSSM) Programmation II 30 / 39
Les types composés
Structure
Structure et Allocation Dynamique
Exemple: (suite)
/* Affichage :
x . array [0]= 1 y . array [0]= 8
x . array [1]= 2 y . array [1]= 8
Structure
Structure et Allocation Dynamique
Exemple:
struct Coordonnees {
int x ;
int y ;
};
int main (){
int j , l =2;
struct Coordonnees * cord1 ;
cord1 = malloc ( l * sizeof ( struct Coordonnees ));
cord1 [0]. x =1;
cord1 [0]. y =1;
(*( cord1 +1)). x =2;
( cord1 +1) - > y =2; // cord1 [1]. y =3
printf ( " \n - - les Cordonnees - -\ n " );
for ( j =0; j < l ; j ++)
printf ( " P % d (% d , % d )\ n " ,j , cord1 [ j ]. x , cord1 [ j ]. y );
printf ( " \ n \n - - les Cordonnees - -\ n " );
l =3;
cord1 = realloc ( cord1 , l * sizeof ( struct Coordonnees ));
cord1 [2]. x =3;
cord1 [2]. y =3;
for ( j =0; j < l ; j ++)
printf ( " P % d (% d ,% d )\ n " ,j , cord1 [ j ]. x , cord1 [ j ]. y );
printf ( " \ n \ n " );
free ( cord1 );
return 0;}
Prof. R. HANNANE (FSSM) Programmation II 32 / 39
Les types composés
Structure
Structure et Allocation Dynamique
Exemple: (suite)
/* Affichage :
-- les Cordonnees - -
P0 (1 , 1)
P1 (2 , 2)
-- les Cordonnees - -
P0 (1 ,1)
P1 (2 ,2)
P2 (3 ,3)
*/
Exemple:
struct Coordonnees {
int x ;
int y ;
char * description ;
};
Structure
Structure et Allocation Dynamique
Exemple:
int main (){
int j , l =2;
struct Coordonnees * cord1 ;
cord1 = malloc ( l * sizeof ( struct Coordonnees ));
Structure
Structure et l’effet de bourage (padding)
On peut savoir la taille d’une structure par sizeof()
Exemple:
...
struct Coordonnees {
char a ;
int x ;
char y ;
};
int main (){
...
printf ( " sizeof ( struct Coordonnees )=% ld \ n " ,
sizeof ( struct Coordonnees ));
printf ( " sizeof ( int )=% ld \ n " , sizeof ( int ));
...
return 0;}
/* Affichage :
sizeof ( struct Coordonnees )=12
sizeof ( int )=4
*/
Structure
Structure et l’effet de bourage (padding)
char a ;
char y ;
int x ;
};
int main (){
...
printf ( " sizeof ( struct Coordonnees )=% ld \ n " ,
sizeof ( struct Coordonnees ));
...
return 0;}
/* Affichage :
sizeof ( struct Coordonnees )=8
*/
⇒ Que ce passe-il???
Prof. R. HANNANE (FSSM) Programmation II 36 / 39
Les types composés
Structure
Structure et effet de bourage (padding)
Attention:
CPU lit la mémoire mot par mot et non octet par octet, donc
l’ordre des champs dans la structure est très important.
Structure
Structure et effet de bourage (padding)
Remarques:
Pour économiser de la mémoire, notamment en programmation
embarquée ou en programmation réseau, pensez à :
⇒ Utiliser la directive #pragma pack(1)
Exemple:
# include < stdio .h >
...
# pragma pack (1)
....
int main (){
...
printf ( " sizeof ( struct Coordonnees )=% ld \ n " , sizeof ( struct Coordonnees ));
...
return 0;}
/* Affichage :
sizeof ( struct Coordonnees )=6
*/
Structure
Structure et effet de bourage (padding)
Remarques:
⇒ Ou bien ajouter à la fin de déclaration de la structure :
attribute ((packed))
Exemple:
...
struct Coordonnees {
char a ;
int x ;
char y ;
} __attribute__ (( packed ));
...
int main (){
...
printf ( " sizeof ( struct Coordonnees )=% ld \ n " , sizeof ( struct Coordonnees ));
...
return 0;}
/* Affichage :
sizeof ( struct Coordonnees )=6
*/
Prof. R. HANNANE (FSSM) Programmation II 39 / 39