Programmation I : Cours d introduction à la programmation Pointeurs



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

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

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

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

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

Conventions d écriture et outils de mise au point

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

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

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

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

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

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

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

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

Claude Delannoy. 3 e édition C++

Le langage C. Séance n 4

et Programmation Objet

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Java Licence Professionnelle CISII,

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Programmation en C/C++

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

Algorithmique et Programmation, IMA

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

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

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

Cours d Algorithmique et de Langage C v 3.0

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


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)

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

Cours 1: Java et les objets

1.6- Génération de nombres aléatoires

Une introduction à Java

I. Introduction aux fonctions : les fonctions standards

Introduction au langage C

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

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

30.avr.10 Présentation miniprojet. 9.mars.10 Cours 3 4.mai.10 Cours C mars.10 Cours 4 11.mai.10 Cours C++ 2

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

as Architecture des Systèmes d Information

Les structures. Chapitre 3

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

LE LANGAGE C++ ENAC 1997 A. DANCEL

Introduction à MATLAB R

Arguments d un programme

TP : Gestion d une image au format PGM

Premiers Pas en Programmation Objet : les Classes et les Objets

Programmation système I Les entrées/sorties

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

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

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Programmer en JAVA. par Tama

Introduction au pricing d option en finance

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

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

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

Utilisation d objets : String et ArrayList

Gestion mémoire et Représentation intermédiaire

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

Outils pour la pratique

Cours de C. Allocation dynamique. Sébastien Paumier

Introduction à l algorithmique et à la programmation M1102 CM n 3

Les structures de données. Rajae El Ouazzani

COMPARAISONDESLANGAGESC, C++, JAVA ET

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

Introduction à l héritage en C++

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Algorithmique, Structures de données et langage C

SUPPORT DE COURS. Langage C

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

Programme Compte bancaire (code)

Chap III : Les tableaux

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

Quelques éléments de compilation en C et makefiles

Généralités sur le Langage Java et éléments syntaxiques.

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

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

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

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

Cours de C/C++ par la pratique. Hugues Talbot

Les arbres binaires de recherche

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

Programmation stochastique

TP, première séquence d exercices.

Chapitre 5 : Les procédures stockées PL/SQL

Programmation Objet Java Correction

Corrigé des TD 1 à 5

Chapitre 2. Classes et objets

OS Réseaux et Programmation Système - C5

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

Informatique I. Sciences et Technologies du Vivant (Semestre 1)

Le langage C. Introduction, guide de reference

Programmation en langage C

Programmation système de commandes en C

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

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

Transcription:

Programmation I : Cours d introduction à la programmation Pointeurs Laboratoire d Intelligence Artificielle Faculté I&C Programmation I Pointeurs 1 / 23

Rappel du calendrier Programmation I Pointeurs 2 / 23

Objectifs du cours d aujourd hui Rappels sur les pointeurs : 3 cas d utilisation à ne pas confondre 3 types de «pointeurs» : références (mais voir point suivant) pointeurs «à la C» pointeurs «intelligents» ne pas confondre pointeurs et références!! Programmation I Pointeurs 3 / 23

Les «pointeurs», à quoi ça sert? En programmation, les «pointeurs» servent essentiellement à trois choses : ➀ à permettre à plusieurs portions de code de partager des «objets» (données, fonctions) sans les dupliquer référence ➁ à pouvoir choisir des éléments non connus a priori (au moment de la programmation) généricité ➂ à pouvoir manipuler des objets dont la durée de vie dépasse la portée allocation dynamique (moins important en en raison de la move semantic) Important : Il faut toujours avoir clairement à l esprit pour lequel de ces trois objectifs on utilise un pointeur dans un programme! Programmation I Pointeurs 4 / 23

Les différents «pointeurs» En C++, il existe plusieurs sortes de «pointeurs» : les références totalement gérées en interne par le compilateur. Très sûres, donc ; mais sont fondamentalement différentes des vrais pointeurs. les «pointeurs intelligents» (smart pointers) gérés par le programmeur, mais avec des gardes-fous. Il en existe 3 : unique_ptr, shared_ptr, weak_ptr (dans la bibliothèque memory) les std::functions (dans la bibliothèque functional) pour désigner («pointer sur») des fonctions les «pointeurs à la C» (build-in pointers) les plus puissants (peuvent tout faire) mais les plus «dangeureux» Programmation I Pointeurs 5 / 23

Les différents «pointeurs» lesquels utiliser? utilisation sur des données sur des fonctions référence références (ou pointeurs à la C) nom de la fonction généricité pointeur à la C std::function ou index dans un tableau ou pointeur à la C allocation dynamique smart-pointers surtout unique_ptr (ou pointeurs à la C) «Utilisez des références quand vous pouvez, des pointeurs quand vous devez.» Programmation I Pointeurs 6 / 23

Spécificités des références Une référence : doit absolument être initialisée (vers un objet existant) ; ne peut être liée qu à un seul objet ; ne peut pas être référencée. on ne peut donc pas faire de tableau de références :-( Programmation I Pointeurs 7 / 23

r-value references En, il existe en plus des références vers les valeurs transitoires : les r-value references. Cela n est utile que pour des raisons d optimisation (éviter des copies, move semantics) int&& temp = f(); peu utile en soit, mais très utile pour l( optimisation d)e passage d arguments et de valeur de retour de fonctions : retransmettre plus loin des objets sans les recopier. Exemple : GrosObjet x;... // remplissage de x vector<grosobjet> hangar; /* Je veux mettre x au hangar et n ai plus besoin de x lui-même * * (mais utiliserai la "copie" mise au hangar). */ hangar.push_back(x); // bof.. : DEUX GrosObjets :-( hangar.push_back(move(x)); // beaucoup mieux! // mais x n est plus utilisable ici en tant que tel! Programmation I Pointeurs 8 / 23

Toujours allouer avant d utiliser! Attention! Si on essaye d utiliser (pour la lire ou la modifier) la valeur pointée par un pointeur pour lequel aucune mémoire n a été réservée, une erreur de type Segmentation fault se produira à l exécution. Exemple : int* px; *px=20; //! Erreur : px n a pas été alloué!! cout << *px << endl; Compilation : OK Execution Segmentation fault Conseil : Initialisez toujours vos pointeurs. Utilisez nullptr si vous ne connaissez pas encore la mémoire pointée au moment de l initialisation : int* px(nullptr); Programmation I Pointeurs 9 / 23

Pointeurs & références Déclaration : type* pointeur; Déclaration/Initialisation : type* pointeur(adresse); unique_ptr<type>(new type(valeur)); type& reference(objet); Adresse d une variable : &variable Accès au contenu pointé par un pointeur : *pointeur Allocation mémoire : pointeur = new type; pointeur = new type(valeur); unique_ptr<type>(new type(valeur)); Libération de la zone mémoire allouée : delete pointeur (pour les «pointeurs à la C», obligatoire) pointeur.reset() (pour les «pointeurs intelligents», pas nécessaire) Programmation I Pointeurs 10 / 23

Pointeurs (avancés) Pointeur sur une constante : type const* ptr; Pointeur constant : type* const ptr(adresse); Pointeur sur une fonction : type_retour (*ptrfct)(paramètres...) function<type_retour(paramètres...)> ptrfct Programmation I Pointeurs 11 / 23

Etudes de cas «exercice 0» : listes chaînées réseau d amis : struct Personne qui a d autres Personnes comme amis : 1. combien d amis? 2. comment représenter les amis? faire la fonction ajoute_ami (attention aux pièges : pas de copie de Personnes!) faire la fonction est_ami (attention aux pièges : comparaison d adresses) améliorer la fonction ajoute_ami : pas 2 fois le même (si temps) faire la fonction cherche_amis(distance) Programmation I Pointeurs 12 / 23

Pointeurs const Effets de bords Pointeurs sur fonctions Allocation dynamique de tableaux Les pointeurs sont un vaste sujet, et il y aurait encore beaucoup à dire en plus de ce qui est montré dans la vidéo... Voici quelques thèmes choisis pour ceux souhaitent aller plus loin. Programmation I Pointeurs 13 / 23

Pointeurs const Effets de bords Pointeurs sur fonctions Allocation dynamique de tableaux Pointeurs constants et pointeurs sur des constantes type const* ptr; (ou const type* ptr) déclare un pointeur sur un objet constant de type type : on ne pourra pas modifier la valeur de l objet au travers de ptr (mais on pourra faire pointer ptr vers un autre objet). type* const ptr(&obj); déclare un pointeur constant sur un objet obj de type type : on ne pourra pas faire pointer ptr vers autre chose (mais on pourra modifier la valeur de obj au travers de ptr). Pour résumer : const s applique toujours au type directement précédent, sauf si il est au début, auquel cas il s applique au type directement suivant. Programmation I Pointeurs 14 / 23

Pointeurs const Effets de bords Pointeurs sur fonctions Allocation dynamique de tableaux Exemple : Pointeurs constants et pointeurs sur des constantes int i(2), j(3); int const* p1(&i); int* const p2(&i); cout << i << "," << *p1 << "," << *p2 << endl; // 2,2,2 // *p1 = 5; // erreur de compilation : on ne peut pas // modifier au travers de p1 *p2 = 5; cout << i << "," << *p1 << "," << *p2 << endl; // 5,5,5 p1 = &j; // p2 = &j; // erreur de compilation : on ne peut pas // modifier p2 cout << i << "," << *p1 << "," << *p2 << endl; // 5,3,5 Programmation I Pointeurs 15 / 23

Pointeurs const Effets de bords Pointeurs sur fonctions Allocation dynamique de tableaux Pointeurs et effets de bord Comme un pointeur contient l adresse mémoire d une valeur, si l on passe un pointeur en argument d une fonction, toute modification faite sur cette valeur à l intérieur de la fonction sera répercutée à l extérieur. = effet de bord Exemple (à ne pas suivre : utilisez plutôt le passage par référence) : void swap(int* x, int* y) { int tmp(*x); *x = *y; *y = tmp; } int main() { int x(3),y(2); cout << x << "," << y << endl; // affiche 3,2 swap(&x, &y); cout << x << "," << y << endl; // affiche 2,3 return 0; } Programmation I Pointeurs 16 / 23

Pointeurs const Effets de bords Pointeurs sur fonctions Allocation dynamique de tableaux Pointeurs sur fonctions En C++, on peut en fait pointer sur n importe quel objet. On peut en particulier pointer sur des fonctions. La syntaxe consiste à mettre (*ptr) à la place du nom de la fonction. Par exemple : double f(int i); est une fonction qui a un int comme paramètre et retourne un double comme valeur double (*g)(int i); est un pointeur sur une fonction du même type que ci-dessus. On peut maintenant par exemple faire : puis ensuite : z=g(i); g=f; Note : pas besoin du & ni du * dans l utilisation des pointeurs de fonctions. Programmation I Pointeurs 17 / 23

Pointeurs const Effets de bords Pointeurs sur fonctions Allocation dynamique de tableaux Pointeurs sur fonctions en généralise la notion de «pointeur sur fonction» au travers du type function de la bibliothèque functional. Exemple : #include <functional>... function<double(double)> f;... double g(double x) { return x*x; }... f = g;... z = f(a + b); Programmation I Pointeurs 18 / 23

Pointeurs const Effets de bords Pointeurs sur fonctions Allocation dynamique de tableaux Pointeurs sur fonctions, exemple Vous souvenez vous de la fin de la série 5? Comment faire pour ne pas recompiler le programme pour chaque nouvelle fonction? Supposons que vous ayez préprogrammé 5 fonctions : double f1(double x);... double f5(double x); et vous donnez le choix à l utilisateur : do { cout << "De quelle fonction voulez-vous calculer " << "l intégrale [1-5]? "; cin >> rep; } while ((rep < 1) (rep > 5)) Comment manipuler de façon générique la réponse de l utilisateur? avec un pointeur sur la fonction correspondante. Programmation I Pointeurs 19 / 23

Pointeurs const Effets de bords Pointeurs sur fonctions Allocation dynamique de tableaux Le programme complet (C++98) 1/2 #include <iostream> #include <cmath> double f1(double x) { return x*x; } double f4(double x) { return sqrt(exp(x)); } double f5(double x) { return log(1.0+sin(x)); } /* Fonction est un nouveau type : pointeur sur des fonctions * * ayant un double en paramètre et retournant un double */ typedef double (*Fonction)(double); Fonction demander_fonction() { int rep; Fonction choisie; do { cout << "De quelle fonction voulez-vous calculer " << "l intégrale [1-5]? "; cin >> rep; } while ((rep < 1) (rep > 5)); switch (rep) { case 1: choisie = f1 ; break ; case 2: choisie = sin ; break ; Programmation I Pointeurs 20 / 23

Pointeurs const Effets de bords Pointeurs sur fonctions Allocation dynamique de tableaux Le programme complet (C++98) 2/2 case 3: choisie = exp ; break ; case 4: choisie = f4 ; break ; case 5: choisie = f5 ; break ; } return choisie; } double demander_nombre() {... } double integre(fonction f, double a, double b) {...f(a)... } int main () { double a(demander_nombre()); double b(demander_nombre()); Fonction choix(demander_fonction()); cout.precision(12); cout << "Integrale entre " << a << " et " << b << " :" << endl; cout << integre(choix, a, b) << endl; return 0; } Note : ce programme peut encore être amélioré, notamment en utilisant des tableaux... Programmation I Pointeurs 21 / 23

Pointeurs const Effets de bords Pointeurs sur fonctions Allocation dynamique de tableaux Le programme complet ( ) Il suffit de remplacer typedef double (*Fonction)(double); par typedef function<double(double)> Fonction; Reste cependant une subtilité (avancée!) : certaines fonctions de la librairie standard ont plusieurs protoypes (surcharge) et l affectation d une function est dans ce cas ambigue. Par exemple, l affectation du cas 2 : choisie = sin; provoque une erreur (d ambiguité) du compilateur. On est alors obligé de désambiguiser que quel sin il s agit. Cela se fait par : choisie = (double(*)(double)) sin; Programmation I Pointeurs 22 / 23

Pointeurs const Effets de bords Pointeurs sur fonctions Allocation dynamique de tableaux Allocation dynamique de tableaux «statiques» Si l on souhaite allouer dynamiquement un tableau statique, on peut faire pointeur = new type[taille]; (puisque type[taille] est en effet un type C++ en tant que tel). Exemple :... double* tab; unsigned int taille_tab(j+5); tab = new double[taille_tab];... tab[i]... Note : il vaut bien sûr mieux utiliser un tableau dynamique! vector<double> tab(j+5); Pour détruire un tableau alloué de la sorte il faut utiliser delete[] pointeur; Exemple : delete[] tab; Programmation I Pointeurs 23 / 23