2ème partie de cours: 23.fév.10 Cours 1 20.avr.10 TEST 24.fév.10 TP1 21.avr.10 miniprojet 26.fév.10 TP réserve 23.avr.10 miniprojet 2.mars.10 Cours 2 27.avr.10 Présentation miniprojet 3.mars.10 TP2 28.avr.10 Présentation miniprojet 5.mars.10 TP réserve 30.avr.10 Présentation miniprojet 9.mars.10 Cours 3 4.mai.10 Cours C++ 1 10.mars.10 TP 5.mai.10 TP 12.mars.10 TP réserve 7.mai.10 TP réserve 16.mars.10 Cours 4 11.mai.10 Cours C++ 2 17.mars.10 TP 12.mai.10 TP 19.mars.10 TP réserve jeudi ascension 23.mars.10 Cours 5 14.mai.10-24.mars.10 TP 18.mai.10 Cours C++ 3 26.mars.10 TP réserve 19.mai.10 TP 30.mars.10 Cours 6 21.mai.10 TP réserve 31.mars.10 TP 25.mai.10 Cours C++ 4 2.avr.10 Vacances de Pâques > 11.4 26.mai.10 TP 13.avr.10 Test à blanc 28.mai.10 TP réserve / test à blanc 14.avr.10 miniprojet 29.mai.10 Festival de robotique 16.avr.10 miniprojet 1.juin.10 TEST Introduction au C++ Francesco Mondada Laboratoire de systèmes robotiques IMT - STI - EPFL
But du cours: Aborder un language orienté objet: le C++ ce qui implique la compréhension de: concept d objet et de classes une série de concepts liés à la gestion des classes des améliorations du C et d un point de vue plus global: motivation du C++: quand et pourquoi l utiliser contrôle d un système réel depuis un PC Exemples: 1) Programmation du logiciel embarqué dans une souris d ordinateur (processeur 8 bits, quelques kbytes de mémoire) 2) Programmation d un traitement de données pour l analyse de la trajectoire d un robot afin d en déduire les erreurs de position et affiner le régulateur 3) Programmation d une interface utilisateur pour piloter un robot à travers d informations visuelles et sensorielles 4) Programmation d un simulateur de robots mobiles
Structure du cours: 1. Cours C++ But: assimiler les concepts principaux du C++ Période: 4 semaines 2. TP de C++ pur But: comprendre le C++ Période: 2 semaines 3. TP de C++ interface graphique But: appliquer le C++ aux interfaces graphiques Période: 2 semaines Contrôle: test Fonctionnement du cours: Cette partie du cours se base sur: Un livre sur le C++: Claude Delannoy, "Apprendre le C++", Eyrolles, "Best of", ISBN 978-2-212-12414-9, Paris, 2008, disponible à la librairie "la fontaine" Le robot e-puck Un résumé d une page fait par deux étudiants Les TP indispensables pour la compréhension Utilisation de Qt Creator (IDE) Utilisation de Qt (interface graphique) Un corrigé du TP fait par 4 étudiants
Passage du C au C++ Par rapport au C: Le C++ est une extension du C qui apporte, entre autres, le concept d objet C++ est conceptuellement plus complet et propre, ce qui permet d écrire du code plus fiable C++ permet d écrire de façon plus compacte C++ est moins supporté pour des processeurs embarqués (dspic est un exemple) Les fonctionalités supplémentaires du C++ se payent parfois par un code plus gros C++ est plus complexe Passage du C au C++ Quelques apports du C++: L orienté objet et les concepts liés La surcharge des fonctions et des opérateurs Les références Les valeurs par défaut pour les paramètres des fonctions Les exceptions
Le concept d objet Données et fonctions en C: Main Données Fonctions Le concept d objet Données et fonctions en C: Main Données A Données B Fonctions A Fonctions B
Le concept d objet Encapsulation des données et des fonctions en C++: Main Fonctions Données Le concept d objet Encapsulation des données et des fonctions en C++: Données B Fonctions B Main Fonctions A Données A
Le concept d objet Exemple en C: struct Complex float r; /*real part*/ float i; /*imag part*/ ; struct Complex C_conj (struct Complex a) struct Complex result; result.r = a.r; result.i = -a.i; return(result); struct Complex C_add (struct Complex a, struct Complex b) struct Complex result; result.r = a.r + b.r; result.i = a.i + b.i; return(result); struct Complex C_sub (struct Complex a, struct Complex b) struct Complex result; result.r = a.r - b.r; result.i = a.i - b.i; return(result); Le concept d objet Exemple en C: main() struct Complex z1, z2, z3; z1.r = 0.0; z1.i = 0.5 z2.r = 0.0; z2.i = 3; z3 = C_add (z1, z2);
Le concept d objet Exemple en C++: #include <iostream> class Complex double real; double imaginary; Complex(double r,double i) real=r; imaginary=i; double GetReal() const return real; double GetImaginary() const return imaginary; Complex operator+(const Complex &z) return Complex(GetReal()+z.GetReal(), GetImaginary()+z.GetImaginary()); ; int main() Complex u = Complex(0,1); Complex v = Complex(1,0); Complex z = u+v; cout << "real = " << z.getreal() << ", imaginary = " << z.getimaginary() << endl; return 0; Quelques informations utiles: (ch. 5, p.63) En C++ les entrèes - sorties sont gérées par des streams - flots. C++: C: #include <iostream> #include <stdio.h> std::cout << Hello world\n ; printf( Hello world\n ); Pour comprendre ceci on ne va pas aborder la surcharge des opérateurs. Pour information, les opérateurs (+, <, >,... ), en C, sont réservés à des types prédéfinis. En C++ l utilisateur peut utiliser ces opérateurs pour ses propres classes. Dans le cas ci-dessus, l object std::cout, de type std::ostream, comporte un opérateur << qui prend des valeurs et les envoyes sur la sortie standard.
Classes, objets, private/public Francesco Mondada Laboratoire de systèmes robotiques IPR - STI - EPFL Introduction Le concept d object permet: De maintenir ensemble les méthodes et les données unies logiquement. D encapsuler les données. Ceci permet de limiter l accès à certaines données. Par ce mécanisme seulement les méthodes propres à l objet peuvent accéder à ses données privées. Ce filtrage garantit une meilleure stabilité des données. De dissocier la définition de l implémentation, de particulariser l implémentation, grâce l héritage et au polymorphisme.
Déclaration d une classe Nom de la classe int position_x,position_y; double angle; void ResetPos(); ; int status; void PlaceRobot(int xinit,int yinit) position_x = xinit; position_y = yinit; Données/méthodes privées (accès interne) // in mm // in rad Données/méthodes publiques (accès depuis l externe) Déclaration de données membres int position_x,position_y; // in mm double angle; /* in rad */ ; int status; Données privées (accès interne) Données publiques (accès depuis l externe) PS: en C il n y a pas de données privées struct en C++ = Classe avec tous les membres publics
Déclaration de méthodes int position_x,position_y; // in mm void ResetPos(); void PlaceRobot(int xinit,int yinit) position_x = xinit; position_y = yinit; ; Méthodes privées (accès interne) Méthodes publiques (accès depuis l externe) Implémentation de méthodes int position_x,position_y; double angle; void ResetPos(); ; int status; void PlaceRobot(int xinit,int yinit) position_x = xinit; position_y = yinit; void Robot::ResetPos() position_x = position_y = 0; // in mm // in rad
Variables objets: int main() Robot epuck1; // objet epuck1 déclarations static Robot epuck2; Robot epucks[10]; Robot *epuckptr; // objet statique // tableau avec 10 objets // pointeur sur un objet robot Accès aux données membres: int position_x,position_y; // in mm int status; void PlaceRobot(int xinit,int yinit) position_x = xinit; position_y = yinit; ; int main() Robot epuck; Robot *epuckptr; // objet epuck // pointeur sur un objet robot if(epuck.status == 1). epuckptr = &epuck; if(epuckptr->status == 1). if((*epuckptr).status == 1).
Accès aux méthodes: int position_x,position_y; // in mm int status; void PlaceRobot(int xinit,int yinit) position_x = xinit; position_y = yinit; ; int main() Robot epuck; Robot *epuckptr; // objet epuck // pointeur sur un objet robot epuck.placerobot(0,0); epuckptr = &epuck; epuckptr->placerobot(0,0); Accès aux méthodes: int position_x,position_y; // in mm void ResetPosX() position_x=0; int status; void PlaceRobot(int xinit,int yinit); ; void Robot::PlaceRobot(int xinit,int yinit) if(xinit==0) ResetPosX(); else position_x = xinit;
Mot clé this Francesco Mondada Laboratoire de systèmes robotiques IPR - STI - EPFL Le mot clé this, dans un fonction membre, désigne un pointeur sur l objet appelant: int position_x,position_y; int status; // in mm ; void PlaceRobot(int xinit,int yinit) this->position_x = xinit; this->position_y = yinit;
TP de cette semaine Utilisation de Qt Creator Création d un projet simple Outils de debug Définition d une classe pour gérer le robot par bluetooth Petite démo de déplacement