Informatique 1A Langage C 6 ème séance 1. Objectifs de la séance 6  Allocation dynamique de mémoire  Application à la création de tableaux 2.

Slides:



Advertisements
Présentations similaires
GEF 243B Programmation informatique appliquée
Advertisements

Premier programme en C :
La boucle for : init7.c et init71.c
Cours de C – Séance dexercices 12 Octobre Exercice 5 Idem quexercice 1 : lire une ligne au clavier Sans limitation de la longueur de la ligne (utilisez.
Les fonctions A quoi ça sert ?
A RECUPERER EN ENTRANT Le polycopié de Caml Partie 1
Introduction Langage très répandu Noyau Linux VLC … Des avantages indéniables mais aussi des contraintes ! Ceci nest quun rapide tour.
Rappels C.
Formation C débutant. Notion de compilation source.c executable Phase de compilation Fichier de texte brut, inexploitable directement par la machine Fichier.
GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §
GEF 243B Programmation informatique appliquée
GEF 243B Programmation informatique appliquée
C.
Paramètres et pointeurs
Les pointeurs Manipulation d'adresses et de ce qui est contenu dans ces adresses Très important, fondamental même en C mauvaise réputation : 'dur à comprendre',
Fonctions Dans un programme : certaines opérations (ou séquences d'opérations) peuvent se répéter plusieurs fois : affichage de tableau, saisie, ou même.
FLSI602 Génie Informatique et Réseaux
FLSI602 Génie Informatique et Réseaux
8. Les tableaux P. Costamagna – ISEN N1.
8PRO100 Éléments de programmation Allocation dynamique de la mémoire.
La fonction alloue un bloc de taille size. Il faut indiquer la taille du bloc que lon veut allouer. Le premier exemple: #include void main()
TRAITEMENT DE STRUCTURES
1 Les pointeurs et quelques rappels sur certains éléments du langage C.
Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction.
Les pointeurs Enormément utilisé en C/C++ ! Pourquoi? A quoi ça sert?
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
IFT-2000: Structures de données
Structures de données IFT-2000
IFT 6800 Atelier en Technologies d’information
Analyse des algorithmes: une introduction. La question abord é e dans ce chapitre est la suivante: Comment choisir parmi les diff é rentes approches pour.
8PRO100 Éléments de programmation Les types composés.
Méthode et Outils pour la Programmation
Structures de données IFT-2000
Plan cours La notion de pointeur et d’adresse mémoire.
Le langage C Structures de données
2.1 - Historique Chapitre 2 : Introduction au langage C++
Les pointeurs L'opérateur &.
Le langage C Rappel Pointeurs & Allocation de mémoire.
Les Pointeurs et les Tableaux Statiques et Tableaux Dynamiques
La notion de type revisitée en POO
et quelques rappels sur certains éléments du langage C
Les adresses des fonctions
Un survol du language C.
1 Structures des données. 2  Le tableau permettait de désigner sous un seul nom un ensemble de valeurs de même type, chacune d'entre elles étant repérée.
La fonction alloue un bloc de taille size. Il faut indiquer la taille du bloc que l’on veut allouer. Le premier exemple: #include void main()
Les types composés Les enregistrements.
TABLEAUX des POINTEURS TRAITEMENT DE STRUCTURES
ISBN Chapitre 10 L'implémentation des sous- programmes.
8PRO100 Éléments de programmation Les pointeurs de caractères.
Classe 1 CSI2572 Autres modificateurs de déclaration de variables: & volatile & register & static & auto & extern & const volatile Indique au compilateur.
6ième Classe (Mercredi, 17 novembre) CSI2572
Conception de Programmes - IUT de Paris - 1ère année Quelques éléments du langage C++ Les références La surcharge de fonctions Les fonctions «
8PRO107 Éléments de programmation Les adresses et les pointeurs.
Langage de Programmation Orientée Objet : C++
Exercices sur les pointeurs. lireCar/remettreCar Lorsque l’on lit caractère par caractère, on ne peut pas savoir qu’on a atteint un caractère avant de.
3ième Classe (Mardi, 23 Septembre) CSI2572. O jourd'8: E Allocation de mémoire E Déallocation de mémoire E Tableaux (n dimensions) E Arithmetique des.
Organisation de la mémoire pour le langage minimal Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI)
C++ BY AURÉLIEN MODULO MARION. PLAN DES TROIS PRÉSENTATIONS C++ avancé C++ orienté objet Bases de C++
Développement d’application avec base de données Semaine 3 : Modifications avec Entité Framework Automne 2015.
1 Initiation aux bases de données et à la programmation événementielle VBA sous ACCESS Cours N° 1 Support de cours rédigé par Bernard COFFIN Université.
1 ALGORITHMIQUE AVANCEE IUT Vélizy – RT2 FA Laurent Marsan.
Informatique 2A Langage C 5ème séance. Déroulement de la séance 5 1 ère partie Étude des chaînes de caractères 2 ème partie Les structures 3.
Informatique 2A Langage C 3 ème séance.
Cours de Langage C Les structures
Informatique 2A Langage C 4ème séance
Cours de Langage C Récursivité. Objectifs de la séance 11 Connaître la récursivité. Mesurer un temps d’exécution. 2.
CINI – Li115 1 Semaine 11 Les pointeurs (suite) ● Tableaux et pointeurs ● Questions sur les pointeurs.
Gestion dynamique de la mémoire : new / delete
Tableaux à plusieurs dimensions en langage C
renvoie la moyenne d’un tableau d’entiers
Transcription de la présentation:

Informatique 1A Langage C 6 ème séance 1

Objectifs de la séance 6  Allocation dynamique de mémoire  Application à la création de tableaux 2

Problématique Avantage : on n’a pas à se préoccuper de l’allocation de mémoire, c’est le programme qui s’en charge. Inconvénient : on doit connaître la taille du tableau (en nombre d’octets) au moment où on la déclare. Conséquence : la taille d’un tableau statique doit être connue à la compilation du programme int n=100; int tab[n]; … for(i=1;i<n;i++) tab[i]=0; - Définition d’une variable tab pouvant être utilisée dans le programme pour manipuler des données - Allocation d’un espace mémoire de 100 cases contigües de 4 octets int tab[100]; Cette déclaration fait deux choses : n est une variable : cela ne fonctionne pas en C 3

Allocation dynamique Solution : - Déclarer une variable contenant une adresse (donc un pointeur) - Allouer l’espace mémoire nécessaire à partir de cette adresse, de manière dynamique - Une fonction d’allocation mémoire est la fonction malloc() (pour m emory alloc ation) -L’argument de la fonction malloc() est le nombre d’octets qu’on souhaite réserver Ex : malloc(4) réserve 4 octets en mémoire -La fonction malloc() retourne l’adresse du 1 er élément réservé Ex : malloc(4) est l’adresse du 1 er octet réservé 4

Allocation dynamique : la taille des variables 5

sizeof( ) retourne la taille en octets de son argument L’argument peut être un type ou une expression : Par exemple, sizeof(int) retourne la taille en octets d’un entier Que vaut sizeof(char) ?  Améliore la portabilité des programmes et permet de ne pas avoir à calculer la taille mémoire exacte réservée →malloc(sizeof( int )) réserve suffisamment d’espace pour stocker un int, quelle que soit la machine 6

Exemple #include... int dim; int *tab;... dim = 100; tab=malloc(dim*sizeof(int)); for(i=0;i<dim;i++) tab[i]=0; On affecte cette adresse au pointeur tab, que l’on peut ensuite manipuler comme un tableau malloc réserve un emplacement mémoire pour stocker 100 entiers et renvoie l’adresse du 1 er entier 7

#include... int dim; int *tab;... dim=100; for(i=0;i<dim;i++) tab[i]=0; Exemple Intérêt des tableaux dynamiques : la dimension d’un tableau n’a pas besoin d’être connue à la compilation pour déclarer la variable qui permet de le manipuler : cela peut être une variable. Mais : il faut s’occuper soi-même de l’allocation mémoire. Avant d’utiliser un tableau, il faut absolument allouer son espace mémoire. mais en général, le programme « plante » ici à l’exécution ! Pas de problème à la compilation, Pas d’allocation mémoire. 8

#include... int dim; int *tab;... dim=100; tab=malloc(dim*sizeof(int)); for(i=0;i<dim;i++) tab[i]=0; Exemple Intérêt des tableaux dynamiques : la dimension d’un tableau n’a pas besoin d’être connue à la compilation pour déclarer la variable qui permet de le manipuler : cela peut être une variable. Mais : il faut s’occuper soi-même de l’allocation mémoire. Avant d’utiliser un tableau, il faut absolument allouer son espace mémoire. Allocation mémoire pour tab OK 9

#include... int dim; int *tab;... dim=100; tab=malloc(dim*sizeof(int)); for(i=0;i<dim;i++) tab[i]=0; Exemple Intérêt des tableaux dynamiques : la dimension d’un tableau n’a pas besoin d’être connue à la compilation pour déclarer la variable qui permet de le manipuler : cela peut être une variable. Mais : il faut s’occuper soi-même de l’allocation mémoire. Avant d’utiliser un tableau, il faut absolument allouer son espace mémoire. Allocation mémoire pour tab OK Il faut aussi libérer l’espace alloué après utilisation (surtout dans une boucle): La fonction est : free(pointeur) 10

Le pointeur NULL Pointeur NULL : par convention, il pointe sur l’adresse #0000 (adresse fictive qui ne correspond à aucune zone de mémoire accessible) float *p; p = NULL; Exemple : la fonction malloc renvoie : un pointeur sur l’espace mémoire alloué, si l’allocation a pu se faire le pointeur NULL si l’allocation n’a pas pu se faire if (malloc(dim*sizeof(float))!=NULL) for(i=0;i<dim;i++) tab[i]=0; else printf(« Allocation impossible\n »); 11

Allocation mémoire dans les fonctions #define DIM 10 int *fonction1(int dim); main() { int *tab1,*tab2; tab1=fonction1(DIM); //OK tab2=malloc(DIM*sizeof(int)); //OK } int *fonction1(int dim) { int *tab; tab=malloc(dim*sizeof(int)); return tab; } Bonnes méthodes pour allouer de la mémoire à un tableau 12

Allocation mémoire dans les fonctions #define DIM 10 void fonction2(int *tab, int dim); main() { int *tab1; fonction2(tab1,DIM); //ne marche pas } void fonction2(int *tab, int dim) { tab=malloc(dim*sizeof(int)); return; } Problème d’initialisation (warning « variable utilisée sans avoir été initialisée » et plantage à l’exécution) 13

Bilan sur les pointeurs -Fonctions : - malloc() - sizeof() - free() - Pointeur NULL Les points clefs pour traiter des pointeurs : 14 - Pas d’allocation ou allocation mal faite - Pointeur non renvoyé par une fonction d’initialisation - Prototype de fonction non cohérent avec la définition - Arguments de fonctions non cohérents (on transmet un int et la fonction attend un int *) - Erreur sur les types des tableaux Les erreurs courantes :

Bilan sur les pointeurs - réaliser des fonctions qui modifient les variables passées en arguments (on parle de passage d’arguments par adresse) - manipuler des tableaux puisqu’un tableau est un pointeur - définir un tableau dont la taille est une variable. On définit pour cela un pointeur et on alloue l’espace mémoire suffisant à partir de ce pointeur grâce à l’allocation dynamique de mémoire (on parle de tableaux dynamiques) Vous savez utiliser les pointeurs pour … : Les pointeurs servent encore à : -manipuler de gros fichiers (type image) à partir d’une seule adresse (soit un octet), d’où un gain de temps et de mémoire -définir des listes chaînées (sorte de tableaux de taille variable) 15