TP 3 : Allocation dynamique de mémoire

Documents pareils
Le langage C. Séance n 4

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

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

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)

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

Introduction au langage C

Le prototype de la fonction main()

Algorithmique et Programmation, IMA

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

Chapitre 1 : La gestion dynamique de la mémoire

TP : Gestion d une image au format PGM

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

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

Programmation Classique en langage C

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

Chap III : Les tableaux

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

Programmation système I Les entrées/sorties

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Java Licence Professionnelle CISII,

Programmation système de commandes en C

INF 104 (SELC) Introduction au langage C

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

Programmation C. Apprendre à développer des programmes simples dans le langage C

Programmation C. J.-F. Lalande. 15 novembre 2012

Programmation système en C/C++

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

Programmation en C. École Nationale Supérieure de Techniques Avancées. Pierre-Alain Fouque et David Pointcheval

Programmation impérative

Les chaînes de caractères

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

Initiation. àl algorithmique et à la programmation. en C

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN

Algorithmes et Programmes. Introduction à l informatiquel. Cycle de vie d'un programme (d'un logiciel) Cycle de vie d'un programme (d'un logiciel)

Pensez à vous inscrire... si ce n est pas encore fait

Les structures. Chapitre 3

Gestion de la mémoire

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

Programmation en langage C

INITIATION A LA PROGRAMMATION

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

Cours de C. Allocation dynamique. Sébastien Paumier

Programmation en langage C Eléments de syntaxe

Conventions d écriture et outils de mise au point


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

MINIMUM. connaissances nécessaires à la programmation des microcontrôleurs PIC18 en langage C (une introduction au langage c A.N.S.

Claude Delannoy. 3 e édition C++

SUPPORT DE COURS. Langage C

COURS D'INFORMATIQUE: LANGAGE C NOTES DE COURS

Table des matières. Chapitre 4 : Variables pointeurs

Rappels Entrées -Sorties

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

I. Introduction aux fonctions : les fonctions standards

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

OS Réseaux et Programmation Système - C5

Logiciel de base. Première année ENSIMAG

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

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

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

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

Langages et Concepts de Programmation Introduction à la programmation en langage C

Notes du cours 4M056 Programmation en C et C++ Vincent Lemaire et Damien Simon

GESTION DES FICHIERS C/UNIX

Langage Éric Guérin 5 octobre 2010

Architecture des ordinateurs

Programmation en C/C++

Programmation en C - Sommaire

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Les structures de données. Rajae El Ouazzani

Lier Erlang avec d autres langages de programmation

Anis ASSÈS Mejdi BLAGHGI Mohamed Hédi ElHajjej Mohamed Salah Karouia

Département Automatisation et Informatisation Année Programmation en C++ Institut des Sciences et Techniques de l Ingénieur d Angers

Support de Cours de Langage C. Christian Bac

INFO-F-105 Language de programmation I Séance VI

Les fichiers. Chapitre 4

Introduction au calcul parallèle avec OpenCL

Cours Informatique Master STEP

COMPARAISONDESLANGAGESC, C++, JAVA ET

Algorithmique, Structures de données et langage C

Cours de programmation avancée. Le langage C. Université du Luxembourg

Le Langage C Licence Professionnelle Qualité Logiciel Pr. Mouad BEN MAMOUN ben_mamoun@fsr.ac.ma Année universitaire 2011/2012

Cours d Algorithmique et de Langage C v 3.0

UE C avancé cours 1: introduction et révisions

UE Programmation Impérative Licence 2ème Année

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

Cours Programmation Système

Cours 6 : Tubes anonymes et nommés

Outils pour la pratique

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

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

PROGRAMMATION PAR OBJETS

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

Programmation en Java IUT GEII (MC-II1) 1

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

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

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

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Transcription:

TP 3 : Allocation dynamique de mémoire Programmation en C (LC4) Semaine du 11 février 2008 Pendant l exécution d un programme, une zone de la mémoire de l ordinateur contient les données dont le programme a besoin pour s exécuter, et qui peut être agrandie au cours de l exécution. L allocation dynamique de la mémoire consiste donc à étendre, pendant l exécution d un programme, la mémoire qui lui est attribuée. Les principales fonctions d allocation dynamiques sont : malloc pour allouer un bloc de mémoire calloc pour allouer un bloc de mémoire et l initialiser à 0 realloc pour agrandir la taille d un bloc de mémoire free pour liberer un bloc de mémoire Ces fonctions se trouvent dans la bibliothèque standard <stdlib.h> Les prototypes de ces quatres fonctions sont les suivant : «void * malloc (size_t size)» : alloue size octets, et renvoie un pointeur sur la mémoire allouée. Le contenu de la zone de mémoire n est pas initialisé. «void * calloc (size_t nmemb, size_t size)» : alloue la mémoire nécessaire pour un tableau de nmemb éléments, chacun d eux représentant size octets, et renvoie un pointeur vers la mémoire allouée. Cette zone est remplie avec des zéros. «void * realloc (void * ptr, size_t size)» : modifie la taille du bloc de mémoire pointé par ptr pour l amener à une taille de size octets. realloc()réalloue une nouvelle zone mémoire et recopie l ancienne dans la nouvelle sans initialiser le reste. «void free (void * ptr)» : libère l espace mémoire pointé par ptr, qui a été obtenu lors d un appel antérieur à malloc(), calloc() ou realloc(). Le type size t est equivalent au type unsigned long int. Exercice 1 Ecrire les fonctions d affichage d un vecteur d entiers de taille dimension, «void affiche_vecteur(int * vecteur, int dimension)» et d une matrice d entiers de taille «lignes*colonnes», «void affiche_matrice(int ** matrice, int lignes, int colonnes)». Exercice 2 void affiche vecteur(int vecteur, int dimension) printf( ( ); for(i=0;i<dimension;i++) printf( %d,vecteur[i]); printf( )\n ); void affiche matrice(int matrice, int lignes,int colonness) for(i=0;i<lignes;i++) 1

affiche vecteur(matrice[i],colonnes); printf( \n ); Exercice 3 Ecrire la fonction qui alloue la mémoire d un vecteur de taille dimension, puis qui l initialise à la valeur val, «int * alloue_vecteur(int dimension, int val)». Ecrire la fonction «void libere_vecteur(int * vecteur)», qui libère le vecteur vecteur. Afficher ce vecteur pour tester vos fonctions. Exercice 4 int alloue vecteur(int dimension, int val) int vecteur = malloc(dimension sizeof(int)); for(i=0;i<dimension;i++) vecteur[i]=val; return vecteur; void libere vecteur(int vecteur) free(vecteur); Exercice 5 Ecrire la fonction qui alloue la mémoire d une matrice de taille «lignes*colonnes», puis qui l initialise à la valeur val, «int ** alloue_matrice(in t lignes,int colonnes, int val)». Ecrire la fonction «void libere_matrice(int ** matrice, int n)», qui libère la matrice matrice. Afficher cette matrice pour tester vos fonctions. Exercice 6 int alloue matrice (int lignes, int colonnes,int val) int i,j; int matrice = malloc(lignes sizeof(int )); matrice[i]= malloc(colonnes sizeof(int)); for(j=0;j<colonnes;j++) matrice[i][j]=val; void libere matrice(int matrice,int lignes) free((int )matrice[i]); Exercice 7 Ecrire une fonction qui génère une matrice identité en utilisant une simple boucle «int ** genere_matrice_identite(int dimension)». 2

Exercice 8 int alloue matrice zero(int lignes, int colonnes) int matrice = calloc(lignes,sizeof(int )); matrice[i]= calloc(colonnes,sizeof(int)); int genere matrice identite(int dimension) int identite = alloue matrice zero(dimension,dimension); for (i=0;i<dimension;i++) identite[i][i]=1; affiche matrice(identite,dimension,dimension); return identite; Exercice 9 Le triangle de Pascal : En mathématiques, le triangle de Pascal est un arrangement géométrique qui stocke les coefficients du developpement de (x + y) i qui sont les coefficients binomiaux ( i j). À la lignes i et colonnes j (0 j i) est placé le coefficient binomial ( i j), dont voici la représentation : (vous trouverez plus de detail sur la page http://fr.wikipedia.org/wiki/triangle_de_pascal) 1) Ecrire la fonction qui alloue la mémoire d une matrice triangulaire inférieure carrée «int ** alloue_matrice_pascal(int dimension)». 2) Ecrire une foction «int ** remplit_matrice_pascal(int dimension)» qui stocke les coefficients binomiaux d un polynôme de taille n (matrice de Pascal de taille n). 3) Ecrire une fonction «void affiche_matrice_pascal(int dimension)» qui affiche une matrice de pascal de taille n. Exercice 10 3

int alloue matrice pascal(int dimension) int i,j; int matrice = malloc(dimension sizeof(int )); for (i=0;i<dimension;i++) matrice[i]= malloc(i sizeof(int)); int remplit matrice pascal(int dimension) int i,j; int matrice = alloue matrice pascal(dimension); for (i=0;i<dimension;i++) matrice[i][0]=1; matrice[i][i]=1; for (i=2;i<dimension;i++) for(j=1;j<i;j++) matrice[i][j]= matrice[i 1][j 1]+ matrice[i 1][j]; void affiche matrice pascal(int matrice, int dimension) for(i=0;i<dimension;i++) affiche vecteur(matrice[i],i+1); printf( \n ); La fonction «int scanf (const char * format,...) ;» permet de lire les caractères de l entrée standard. S il s agit d entier, il faut utiliser le format %d, puis indiquer à quelle adresse mémoire stocker cet entier.cette fonction se trouve dans la bibliothèque standard <stdio.h>. Exemple : pour récuperer un caractère de l entrée standard et le mettre dans la variable car char recupere caractere() char car; scanf( %c,&car); Exercice 11 1) Ecrire une fonction «int * recupere_n_entiers(int n)» qui récupère consécutivement n entiers depuis l entrée standard et les stocke dans un tableau de taille n. 2) Ecrire une fonction «int * recupere_entiers(int n,int taille_max)» qui après avoir alloué un tableau tab de taille n, récupère consécutivement des entiers depuis l entrée standard. Lorsque plus de n entiers sont récupérés, cette fonction augmente la taille du tableau tab de n jusqu à ce que la taille de tab soit égale à «taille_max». Pour tester la fonction, on prendra «n=5» et «taille_max=20» 4

Exercice 12 int recupere n entier(int n) int tableau = alloue vecteur(n,0); for(i=0;i<n;i++) scanf( %d,&tableau[i]); return tableau; int recupere entiers(int n,int taille max) int tableau = alloue vecteur(n,0); for(i=0;i<taille max;i++) if(i == n) n+=n; tableau= realloc((void )tableau, sizeof(int) n); scanf( %d,&tableau[i]); return tableau; Exercice 13 Ecrire la fonction qui alloue la mémoire d un tableau 3D de taille «longueur*largeur*hauteur», «int *** alloue_tableau_3d(int longueur,int largeur,int hauteur)». Ecrire la fonction «void libere_tableau_3d(int *** tableau_3d)», qui libère le tableau tableau. Après avoir ecrit la fonction d affichage «void affiche_tableau_3d(int *** tableau_3d, int longueur, int largeur,int hauteur)», affichez ce tableau 3D pour tester vos fonctions. Remarque : essayer d allouer la mémoire de ce tableau 3D de telle façon que la fonction «void libere_tableau(int *** tableau_3d)» n utilise aucune boucle. Exercice 14 int alloue tableau 3D(int longueur, int largeur, int hauteur) int tableau; int i, j; tableau = malloc (longueur sizeof (int )); tableau[0] = malloc (longueur largeur sizeof (int )); tableau[0][0] = malloc (longueur largeur hauteur sizeof (int)); for (i = 0; i < longueur; i++) tableau[i] = tableau[0] + i largeur; for (j = 0; j < largeur; j++) tableau[i][j] = tableau[0][0] + i largeur hauteur + j hauteur; return tableau; void libere tableau 3D(int tableau) 5

free(tableau[0][0]); free(tableau[0]); free(tableau); void affiche tableau 3D(int tableau,int longueur, int largeur, int hauteur) int i,j,k; for(i=0;i<longueur;i++) printf( ( ); for(j=0;j<largeur;j++) printf( ( ); for(k=0;k<hauteur;k++) printf( %d,tableau[i][j][k]); if(j==largeur 1) printf( ) ); else printf( )\n ); printf( )\n\n ); int main(int argc, char argv) int dimension=6; int lignes =5; int colonnes =4; int n=5; int taille max=20; int longueur=4; int largeur=6; int hauteur=3; int vecteur=alloue vecteur(dimension, 18); int matrice =alloue matrice (lignes,colonnes,33); int matrice zero= alloue matrice zero(lignes,colonnes); int matrice identite= genere matrice identite(dimension); int matrice pascal= remplit matrice pascal(dimension); int tableau =alloue tableau 3D( longueur, largeur, hauteur); int tableau1= recupere n entier(n); int tableau2= recupere entiers(n, taille max); affiche vecteur(vecteur,dimension); affiche matrice(matrice,lignes, colonnes); affiche matrice(matrice zero,lignes, colonnes); affiche matrice(matrice identite,dimension,dimension); 6

affiche matrice pascal(matrice pascal,dimension); affiche tableau 3D(tableau, longueur, largeur, hauteur); affiche vecteur(tableau1,n); affiche vecteur(tableau2,taille max); libere vecteur( vecteur); libere matrice(matrice,lignes); libere matrice(matrice zero,lignes); libere matrice(matrice identite,dimension); libere tableau 3D(tableau); libere vecteur(tableau1); libere vecteur(tableau2); return 1; 7