Vous êtes sur la page 1sur 32

Architecture des systmes

(1) Notions avances de C

2015-2016 : Alain Sigayret


Alexandre Guitton - Architecture des systm
es

Plan

1. Structures de donnes du C

2. Allocation dynamique

3. Structures de donnes algorithmiques en C

4. Complments

Alexandre Guitton - Architecture des systm


es

1. Structures de donnes du C

Alexandre Guitton - Architecture des systm


es

Types du C

Types simples :
int, char, float, double, short, long, void
Types complexes :

Structures (dont les fichiers)

Unions

Enumrations

Pointeurs

Tableaux

Alexandre Guitton - Architecture des systm


es

Structures

Structure

Regroupement de plusieurs types pour crer un nouveau


sur-type

Mot-clef : struct

Les sous-types sont appells des champs

Remarque : on peut inclure une structure diffrente dans


une structure
Intrt : regrouper les informations au mme endroit, rduire
le nombre de paramtres d'une fonction
Un premier pas vers la notion d'object de programmation

Alexandre Guitton - Architecture des systm


es

Structures
Exemples :
struct {char* nom; int age;} perso ;
struct personne {char* nom; int age;};
struct personne p;
struct identite {struct personne pe; char* prenom;};
structure
struct identite id;

// declarer une variable


// declarer un type
// structure incluant

void main() {
perso.nom="Durand"; perso.age=20;
printf("nom: %s, age: %d\n",perso.nom,perso.age);
p.nom="Martin"; p.age=19;
printf("nom: %s, age: %d\n",p.nom,p.age);
id.pe=p; id.prenom="Jacques";
printf("nom: %s, prenom: %s, age: %d\n",id.pe.nom,id.prenom,id.pe.age);
}

Alexandre Guitton - Architecture des systm


es

Unions

Unions

Regroupement au mme endroit mmoire de plusieurs types


exclusifs pour crer un nouveau type
Mot-clef : union
N.B. on ne peut pas stocker simultanment des donnes
dans deux champs (sous peine d'crasement), il faut savoir
quel est le champ utilis

But : conomie de mmoire

On peut combiner structures et unions

Alexandre Guitton - Architecture des systm


es

Unions

Exemples

union {int i; double d;} x;


union nombre {int i; double d;};
union nombre n;
struct personne {char* nom; int age;};
union {char inconnu; struct personne connu;} y;
void main() {
x.i=25; printf("entier: %d ...", x.i); printf(" et double associe: %f\n",x.d);
x.d=-5.2; printf("double: %f ...",x.d); printf(" et entier associe: %d\n",x.i);
y.inconnu='X'; printf("inconnu: %c ...",y.inconnu);
// attention : segmentation fault :
// printf(" et connu associe: {%s, %d}\n",y.connu.nom,y.connu.age);

y.connu.nom="Martin"; y.connu.age=20;
printf("connu: {%s, %d} ...",y.connu.nom,y.connu.age);
printf("et inconnu associe: %c\n",y.inconnu);
}
Alexandre Guitton - Architecture des systm
es

Enumrations

Type dfini par la liste de ses valeurs possibles


Les valeurs peuvent tre symboliques mais correspondent
des entiers naturels
Exemples

enum booleen {Faux,Vrai};


int estvrai(enum booleen b) {if (b==Vrai) return 1; else return 0;}enum booleen b;
enum jour {Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi};
enum jour j;
void main() {
b=Vrai;
if (estvrai(b)) printf("vrai\n"); else printf("faux\n");
j=Jeudi;
printf(jour: %d)
}
Alexandre Guitton - Architecture des systm
es

Structures et unions en assembleur

Comment une structure peut-elle

tre cre en assembleur ?


tre utilise en assembleur ?

Comment une union peut-elle

tre cre en assembleur ?

tre utilise en assembleur ?

Alexandre Guitton - Architecture des systm


es

10

Pointeurs et tableaux

Pointeur

Adresse mmoire (accs indirect)


Mots-clefs : * (dclaration et drfrencement) et
& (rfrencement),
NULL

Tableau

Allocation statique de la mmoire + cration d'un


pointeur sur la premire case + libration statique
de la mmoire
Remarque : t[n] est un synonyme de pointeur-surcase-0 + n*taille-case
Alexandre Guitton - Architecture des systm
es

11

Tableaux plusieurs dimensions

Exemple

Dclaration
int t[5];
// rappel : indiage de 0 4!
int u[4]={0,1,2,3};
int w[2][2];
int x[3][2]={{0,1},{2,3},{4,5}};
Utilisation
for (i=0;i<5;i++) t[i]=(i+1)*(i+1);
for (i=1;i<5;i++) t[i]=t[i]+t[i-1];
for (i=0;i<3;i++)
for (j=0;j<2;j++)
w[i][j]=10*i+j;
Alexandre Guitton - Architecture des systm
es

12

Pointeurs et tableaux
(en assembleur)

Comment les pointeurs sont-ils implments ?

Comment les tableaux sont-ils implments ?

But des pointeurs

Passage de paramtres plus efficace (un pointeur


plutt qu'une structure)
Permet de simuler, en C, le passage par adresse
Permet de manipuler la mmoire (cf structures de
donnes algorithmiques)

Est-ce que le passage des paramtres en assembleur


se fait par valeur ou par adresse ?
Alexandre Guitton - Architecture des systm
es

13

Pointeurs de fichiers

Fichiers en C

FILE *, dfinit dans la bibliothque stdio.h

Fonctions : fopen, fclose, feof, fprintf, fscanf

Exemple :
FILE * f=NULL;
int n;
f = fopen(numbers.txt, r);
if (f!=NULL) {
while (!feof(f)) {
fscanf(f, %d, &n);
printf(%d\n, n);
}
}
fclose(f);

// r pour read (only)

Alexandre Guitton - Architecture des systm


es

14

Pointeurs de paramtres

Fichiers en C

int argv : nombre d'arguments passs en ligne de


commande
Char * * argc : pointeur vers un tableau de chaines
de caractres
Exemple :
int main(int argv, char ** argc) {
printf(''nom de l'executable : %s\n'',argc[0]);
if (argv>1) printf(''premier parametre : %s,argc[1]);
return 0;
}

Alexandre Guitton - Architecture des systm


es

15

2. Allocation dynamique

Alexandre Guitton - Architecture des systm


es

16

Allocation dynamique

Allocation statique

Allocation dynamique

Demande de mmoire au cours de l'excution du programme

Appel systme : void * malloc(int taille); // taille : utiliser sizeof(variable)

Libration dynamique

Demande de mmoire avant l'excution du programme (dtermin la


compilation)

Appel systme : void free(void * pointer);


Remarque : la mmoire alloue (statiquement ou dynamiquement) est
automatiquement libre la fin d'un programme

But : utiliser de la mmoire dont la taille n'est pas connue


l'avance

Alexandre Guitton - Architecture des systm


es

17

Exemples d'allocation dynamique


#include <stdlib>
Int * p=NULL;
p = malloc(sizeof(int));
if (p==NULL) exit(0);
printf("nombre ?"); scanf("%d",p);
printf("p=%d\n",*p);
printf("adresse pointeur: %p\n",p);
int y=(*p)+1;
p=&y;
printf("*p=%d et y=%d",*p,y);
y=0;
printf("*p=%d et y=%d",*p,y);
free(x);

// dclaration
// allocation
// vrification
// utilisation ...

// x pointe sur y

//*x et y on mme valeur

// libration de la mmoire
Alexandre Guitton - Architecture des systm
es

18

Allocation d'un tableau de n entiers


int i;
int * t=NULL;
int n=4;
t = malloc(n*sizeof(int));
if (t==NULL) exit(0);
for (i=0;i<n;i++) t[i]=i;
for (i=0;i<n;i++) printf("%d ",t[i]);
free(t);

Alexandre Guitton - Architecture des systm


es

19

Allocation d'un tableau


de r lignes et c colonnes d'entiers
int i,j;
int ** t=NULL; int r=6, c=4;
t = (int **) malloc(r*sizeof(int));
if (t==NULL) exit(0);
for (j=0;j<r;j++)
{ t[j]= malloc(c*sizeof(int)); if (t[j]==NULL) exit(0); }
for (i=0;i<c;i++) for (j=0;j<r;j++) t[i][j]=10*i+j;
for (i=0;i<c;i++)
{
for (j=0;j<r;j++) printf("%d ",t[i][j]);
printf("\n");
}
free(t);
Alexandre Guitton - Architecture des systm
es

20

Le tas

Tas (=heap) : zone mmoire o se font les allocations


(statiques et dynamiques) d'un programme

Les variables internes sont alloues dans le tas

Remarques

Ne pas utiliser des variables dsalloues


(automatiquement ou manuellement)
Tas et pile* se trouvent dans la mme zone
mmoire, il faut donc viter qu'ils grossissent trop
risque defuite [en avant] de mmoire
viter les pointeurs en prog. rcursive

*call stack : utilise pour les appels rcursifs


Alexandre Guitton - Architecture des systm
es

21

Comportements imprvisibles en C

Lorsqu'un programme C a un comportement


imprvisible (et non dterministe), c'est souvent que

Le programme manipule mal les pointeurs

Le programme retourne des tableaux internes

Le programme dborde des tableaux

Le programme utilise de la mmoire dsalloue

Clart et rigueur de programmation impratives

Alexandre Guitton - Architecture des systm


es

22

3. Structures de donnes
algorithmiques en C

Alexandre Guitton - Architecture des systm


es

23

La pile

Pile = structure de donnes de type LIFO (last


in, first out)

Utilis [en assembleur] pour passer les paramtres


aux fonctions, et pour le retour des fonctions

Remarques

Les fonctions rcursives sollicitent beaucoup la pile


du programme (call stack)
Problme du dbordement de pile (stack overflow)

Alexandre Guitton - Architecture des systm


es

24

La pile

Exemple :

int recursif(int n, int I)


{ if (i<=0) return 1; else return n*recursif(n,(i-1)); }
void main()
{ int a=2; int b=3; int c=recursif(a,b); }
Pile des appels rcursifs :
recursif(2,3) \ recursif(2,2) \ recursif(2,1) \ recursif(2,0)
Dpilement :
recursif(2,3) \ recursif(2,2) \ recursif(2,1) \ recursif(2,0)
recursif(2,3) \ recursif(2,2) \ recursif(2,1) \ 1
recursif(2,3) \ recursif(2,2) \ 2*1=2
recursif(2,3) \ 2*2=4
4*2=8
Alexandre Guitton - Architecture des systm
es

25

Drcursivation

Drcursiver = enlever la rcursion

Toujours possible
Pour les fonctions rcursives terminales, la
drcursivation peut se faire sans pile
Pour les autres fonctions rcursives, il faut souvent
programmer une structure de pile (cf algorithmique)

Exemple :
a=2, b=3; c=1;
for (int i=0;i<b;i++) c=c*a;

Alexandre Guitton - Architecture des systm


es

26

Implmentation de pile en C

Implmentation d'une pile

Pourquoi ? Pas de type pile prdfini, inversion des


lments, parcours en profondeur

Avec un tableau ? Simple, mais taille limite

Avec un pointeur de dbut

Cration d'une liste vide


Ajout d'un lment en haut
Suppression de l'lment en haut
Affichage des lments
Test de la pile vide
Alexandre Guitton - Architecture des systm
es

27

Implmentation de file en C

File* = structure de donnes de type FIFO (first in, first out)

Pourquoi, pas de type file prdfini, file d'attente,


parcours en largeur...

Avec un tableau ?

Avec un pointeur de dbut ?

Avec un pointeur de dbut et un pointeur de fin ?

Avec une liste doublement chane

* viter d'utiliser le mot file en programmation


(confusion avec le mot anglais pour fichier)
Alexandre Guitton - Architecture des systm
es

28

4. Complments

Alexandre Guitton - Architecture des systm


es

29

Instruction goto

L'instruction goto existe en C


(le noyau Linux en utilise normment)

Pourquoi ne pas faire de goto en C ?

Lisibilit du code (cf assembleur)

tat de la pile lors de sauts entre fonctions

programmation spaghetti

Pourquoi ne pas faire de variable globale ?

Effet de bord des fonctions

Problme avec la rcursivit (et la rentrance)

Problme avec le paralllisme


Alexandre Guitton - Architecture des systm
es

30

Divers

Pointeurs de fonctions

Permet de passer une fonction en paramtre d'une


autre fonction (fonction de calcul, fonction de
comparaison, etc.)
Syntaxe un peu complexe
Base de l'implmentation des mcanismes de
programmation oriente objets

Le mot-clef register

Indique au compilateur d'essayer de mettre la


variable dans un registre
Alexandre Guitton - Architecture des systm
es

31

(Complments sur la compilation)

(tapes de la compilation)

(un zoom sur l'dition de liens)

(ld -dynamic-linker /lib64/ld-linux-x86-64.so.2


/usr/lib/crt1.o /usr/lib/crti.o -lc methode3.o
/usr/lib/crtn.o)

(diffrence entre _start et main)

(bibliothques dynamiques .so et .a)

Alexandre Guitton - Architecture des systm


es

32