IAP2 Cours n 4 Novembre 2007 ENSIIE C. DUBOIS

Documents pareils
Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Programme Compte bancaire (code)

Conventions d écriture et outils de mise au point

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Cours d initiation à la programmation en C++ Johann Cuenin

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Le prototype de la fonction main()

Chapitre 1 : La gestion dynamique de la mémoire

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Les structures de données. Rajae El Ouazzani

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski


Les arbres binaires de recherche

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

Compression de Données - Algorithme de Huffman Document de Conception

Cours Programmation Système

Algorithmique, Structures de données et langage C

Java Licence Professionnelle CISII,

Package Java.util Classe générique

TD2/TME2 : Ordonnanceur et Threads (POSIX et fair)

Premiers Pas en Programmation Objet : les Classes et les Objets

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Analyse de sécurité de logiciels système par typage statique

Cours 6 : Tubes anonymes et nommés

Corrigé des exercices sur les références

Cours d Algorithmique et de Langage C v 3.0

OS Réseaux et Programmation Système - C5

Les processus légers : threads. Système L3, /31

Bases de programmation. Cours 5. Structurer les données

Les structures. Chapitre 3

as Architecture des Systèmes d Information

Projet de programmation (IK3) : TP n 1 Correction

Programmation avec des objets : Cours 7. Menu du jour

3IS - Système d'exploitation linux - Programmation système

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Le langage C. Séance n 4

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

L exclusion mutuelle distribuée

ACTIVITÉ DE PROGRAMMATION

Le système de gestion des fichiers, les entrées/sorties.

TD3: tableaux avancées, première classe et chaînes

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

I. Introduction aux fonctions : les fonctions standards

Introduction à la programmation concurrente

Programmation en langage C

V- Manipulations de nombres en binaire

Utilisation d objets : String et ArrayList

INITIATION A LA PROGRAMMATION

Assurance Qualité. Cours de génie logiciel. Renaud Marlet. LaBRI / INRIA (d'après A.-M. Hugues) màj 23/04/2007

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

Arguments d un programme

Cours de C. Allocation dynamique. Sébastien Paumier

Travaux Dirigés n 1 : chaînes de caractères

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Algorithmique et Programmation, IMA

Un ordonnanceur stupide

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Gestion de la mémoire

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Programmation C++ (débutant)/instructions for, while et do...while

Programmer en JAVA. par Tama

Programmation système de commandes en C

Chapitre 10. Les interfaces Comparable et Comparator 1

GESTION DES FICHIERS C/UNIX

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Stockage du fichier dans une table mysql:

Introduction au langage C

Java DataBaseConnectivity

Recherche dans un tableau

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

Derrière toi Une machine virtuelle!

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Playing with ptrace() for fun and profit

TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 2 e année Génie Informatique

Le langage C. Introduction, guide de reference

Plan du cours. Historique du langage Nouveautés de Java 7

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Exercices INF5171 : série #3 (Automne 2012)

INTRODUCTION À LA PROGRAMMATION CONCURRENTE

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

TP2 : tableaux dynamiques et listes chaînées

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

SUPPORT DE COURS. Langage C

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Introduction à MATLAB R

Informatique III: Programmation en C++

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Architecture des ordinateurs

Transcription:

IAP2 Cours n 4 Novembre 2007 ENSIIE C. DUBOIS

Allocation dynamique de la mémoire 2 types de données dans un programme : données statiques on connaît à l'avance (lors de l'écriture du programme) la taille des données la mémoire peut être réservée à l'avance, avant l'exécution du programme données dynamiques on ne connaît la taille des données qu'à l'exécution du programme la réservation de la mémoire se fait au cours de l'exécution du programme

Modèle de mémoire Données statiques Données dynamiques : le tas

Outils de gestion de la mémoire «dynamique» pour réserver de la mémoire d'une taille donnée d'un type donné pour libérer de la mémoire Utilisation des pointeurs pour accéder à ces espaces mémoires alloués dynamiquement

int *p; (ici p est non intialisé) p=malloc(sizeof(int)); p pointe sur un espace mémoire pouvant accueillir un entier Allocation mémoire void* malloc(size_t t) renvoie un pointeur sur l'espace alloué de la taille t renvoie NULL si l'allocation a échoué fonction de la librairie standard #include <stdlib.h> size_t type non signé pour manipuler des tailles d'espaces mémoire On peut utiliser la fonction sizeof pour obtenir la taille associée à un type Exemple :

101 102 20 205 int i=20; int *p; p=malloc(sizeof(int)); *p = 4 le contenu de la zone mémoire allouée vaut 4 205 4

101 102 20 205 int i=20; int *p; p=malloc(4*sizeof(int)); *p = 4 *(p+1)=5 le contenu de la zone mémoire allouée vaut 4 205 4 5

Mémoire pleine? Lorsque la mémoire dynamique a complétement été allouée, malloc renvoie NULL Il faut tester cette valeur à chaque allocation de mémoire int *p1, *p2; p1 = malloc(sizeof(int)); if (p1 == NULL) exit(0); #include <assert.h> int *p1; p1 = malloc(sizeof(int)); assert(p1!= NULL);...

Il existe d'autres fonctions d'allocation : calloc, realloc void* calloc(size_t nb, size_t t) alloue nb blocs consécutifs de taille t, renvoie NULL si l'allocation a échoué Exemple : int *p; (ici p est non intialisé) p=calloc(4,4*sizeof(int)); p pointe sur un espace mémoire de 4 blocs de mémoire pouvant accueillir 4 entiers

void* realloc(void* ptr, size_t t) pour agrandir ou rétrécir une zone mémoire déjà allouée dynamiquement, pointée par ptr renvoie NULL si l'allocation a échoué, ptr n'est pas modifié renvoie l'adresse de la nouvelle zone allouée si nouvelle taille > ancienne taille l'ancien contenu est intégralement conservé si nouvelle taille < ancienne taille seuls les premiers éléments du début sont conservés

Libération de la mémoire void free(void *ptr) libère l'espace pointée par ptr la mémoire doit avoir été préalablement allouée dynamiquement n'a pas d'effet si ptr a la valeur NULL Attention! * La fonction free peut aboutir à un désastre si on essaie de libérer de la mémoire qui n'a pas été allouée par malloc. * La fonction free ne change pas le contenu du pointeur; il est conseillé d'affecter la valeur NULL au pointeur immédiatement après avoir libéré le bloc de mémoire qui y était attaché. * Si nous ne libérons pas explicitement la mémoire à l'aide free, alors elle est libérée automatiquement à la fin du programme.

Représentation des listes pas de type prédéfini en C implantation possible à l'aide d'un tableau si on peut évaluer la taille maximale de la liste utilisation d'un tableau surdimentionné On parle alors de représentation contingüe ou représentation avec des pointeurs On parle alors de listes chaînées.

Représentation contigüe soit T un type typedef struct liste{ int tete T tab[n ] } tliste tete : indice de la tête de la liste : un entier compris entre 1 et N 1 1 pour signifier que la liste est vide La liste croît vers la droite Fonction qui retourne l'élément de tête d'une liste d'éléments de type T T head( tliste l){ if (l.tete== 1) exit(0); else return(l.tab[l.tete]); }

Procédure qui ajoute un élément en tête de la liste Ce n'est possible que si on ne dépasse pas la longueur maximale > listes bornées void cons(tliste l, T nvelt){ if (l.tete==n 1) exit 0; else { l.tab[l.tete+1]=x; l.tete=l.tete+1; } } Fonction qui retourne la longueur d'une liste int lg(tliste l){ return(l.tete+1); }

Représentation chaînée : vers plus de dynamicité Chaque élément contient des données un lien (pointeur) vers l'élément suivant Un élément = 1 structure avec 2 champs : un champ qui contient les données + 1 champ qui contient un pointeur sur l'élément suivant typedef struct element{ T data struct element * suivant } telement structure de données récursive : auto référence

telement* dernier(liste l){ telement * ptr=l; while (*ptr.suivant!=null) ptr=*ptr.suivant; ou ptr=ptr >suivant; return(ptr); } Une liste? On représente une liste non vide par l'adresse de son premeir élément On représente une liste vide par le pointeur NULL type d'une liste chaînée : telement * typedef telement* liste Les éléments sont chaînés les uns aux autres reste de la liste l : *l.suivant données du 2ème élément de la liste l : *(*l.suivant).data ou (l >suivant) >data dernier élément === son champ suivant est NULL parcourir toute la liste

Création d'une liste 1 2 3 La mémoire est allouée élément par élément : On alloue le dernier élément p3 = malloc(sizeof(telement)); On remplit ses champs : *p3.data = 3; ou p3 >data = 3; *p3.suivant=null; ou p3 >suivant=null; On recommence avec le deuxième élément p2 = malloc(sizeof(telement)); *p2.data = 2; ou p2 >data = 2; On chaîne le 2eme élément au dernier : *p2.suivant=p3; p2>suivant=p3; ou Le premier : p1 = malloc(sizeof(telement)); *p1.data = 1; ou p1 >data = 1; *p1.suivant=p2; ou p1 >suivant=p2;

Ajout d'un élément en tête /* interface cons type : liste*t > liste arg l, nvelt (données du nouveau élément) pre aucune post ajoute un élement contenant nvelt en tête de la liste l, retourne l'adresse du nouveau premier élément*/ l liste cons (liste l, T nvelt){ *telement p; On alloue le nouvel élement, soit p son adresse p = malloc(sizeof(telement)); On remplit son champ data *p.data = nvelt; On relie ce nouvel élement à la liste l *p.suivant=l; Le résultat est le nouvel élément return(p); } p nvelt 1 *p.suivant=l;

Exemple d'utilisation : int main(void){ telement *L= NULL; telement *p; L=cons(L, 12); L 112 L=cons(L, 23); L 123 112 p=l; while (p!=null) { printf(''%d > '', p >data); p=p >suivant; } printf(''null\n''); return 0; } p

Ajout d'un élément en fin de liste /* interface ajouter type : liste*t > liste arg l, nvelt (données du nouveau élément) post ajoute un élement contenant nvelt en fin de la liste l, retourne l'adresse du nouveau premier élément*/ Remarque : si la liste n'est pas vide, le résultat est égal à l liste ajouter (liste l, T nvelt){ *telement p, ptr; On alloue le nouvel élement, soit p son adresse p = malloc(sizeof(telement)); On remplit son champ data et son champ suivant *p.data = nvelt; *p.suivant=null; if (l==null) return(p); else { On relie l'élément alloué au dernier de l... ptr=l; while (ptr >suivant!=null) ptr=ptr.suivant; ptr >suivant=p; return l; }}... p ptr nvelt 1... ptr >suivant=p;...

Exemple d'utilisation : int main(void){ telement *L= NULL; telement *p; L=ajouter(L, 12); L 112 L=ajouter(L, 23); L 112 123 p=l; while (p!=null) { printf(''%d > '', p >data); p=p >suivant; } printf(''null\n''); return 0; } p

Recherche d'un élément /* interface appartient type : liste*t > booleen arg l, v post true si v est dans la liste, false sinon */ partir de la tête de la liste comparer les données de chacun des éléments à celui recherché booleen appartient (liste l, T v){ *telement p=l; while (p!=null){ if (p >data==) return vrai; else p >suivant=p; } return faux; }

Supprimer un élément /* interface supprimer type : liste*t > liste arg l, v post retourne la liste après avoir supprimé la première occurrence de v */ Remarque : le résultat est l sauf si le premier élément de la liste représentée par l contient v A vous de jouer...

D'autres listes chaînées Listes doublement chaînées Tout élément a un suivant (NULL si dernier) et prédécesseur (NULL si premier) Les listes doublement chaînées peuvent être parcourues dans les 2 sens

Listes circulaires Le dernier élément pointe sur le premier : tout élément a un suivant