Exercice 2.0 : mon premier programme C++
Les codes sources des programmes C++ sont, à l'instar de la plupart des langages de programmation, de simples fichiers texte. N'importe quel éditeur de textes (Emacs ou Geany par exemple) permet donc d'écrire un programme en C++.
Le but de cet exercice est justement de vous rappeler, pas à pas, à
- éditer et compiler un programme C++ au moyen d'un éditeur comme Emacs ou Geany (vous pouvez faire des manipulations analogues dans tous les éditeurs) ;
- corriger les erreurs de compilation.
Étape 1 : Éditer un programme
Pour ouvrir un nouveau fichier dans Geany, utilisez File -> New puis sauvegardez immédiatement avec une extension comme .cc pour bénéficier de la mise en évidence syntaxique. Faites le par exemple pour le fichier ~myfiles/cpp/serie1/salut.cc Dans Emacs, l'ouverture (= création) du fichier ~myfiles/cpp/serie1/salut.cc se fait par le raccourci
C-x C-f ou par le menu File -> Open
File....
Note :
- Lorsque vous ouvrez un fichier dont le nom finit par .cc, Emacs/Geany passe automatiquement en mode C++, (Emacs affiche qu'il est dans ce mode dans la barre horizontale au bas de la fenêtre d'édition).
- Emacs crée automatiquement les fichiers qu'on lui demande de sauvegarder lorsque ceux-ci n'existent pas encore.
Cela devrait ressembler à quelque chose comme cela :


Deux constatations :
- Certains mots apparaissent colorés (si ce n'est pas le
cas, essayez d'obtenir ce résultat en vous servant du menu
indiqué ci-après). Il s'agit de mots ayant des fonctions
syntaxiques particulières, et leur couleur peut améliorer
la lisibilité des programmes. Pour accentuer cet effet, ou le
remplacer par des effets noir&blanc (caractères italiques,
gras...), vous pouvez, dans Emacs, aller jouer avec le menu : Options ->
Syntax Highlighting.
(Vous obtiendrez une coloration différentes de celle indiquée sur la figure ci-dessus si vous n'avez pas copié les fichiers de configuration d'Emacs comme indiqué dans la mini-référence Environnement Unix) - Dans Emacs, lorsque vous appuyez sur la touche TAB,
la ligne sur laquelle se trouve le curseur est indentée
automatiquement, c'est-à-dire que des espaces sont
ajoutés ou supprimés en début de ligne, de
façon à rendre le programme plus lisible. Cette
indentation automatique peut être très utile pour
déceler des erreurs de syntaxe : effacez par exemple le
«;» de l'avant-dernière ligne du programme,
puis placez-vous sur la dernière ligne et pressez la touche TAB. La position de l'accolade («}»)
doit vous faire comprendre qu'il y a une erreur dans la ligne
précédente.
Ce mode d'indentation n'existe pas dans Geany, ce qui est parmi ses plus grand défauts!) Sauvegardez le programme (C-x C-s ou via le menu File -> Save (current buffer) dans Emacs ou File > Save dans Geany).
Annexe : structure du programme
- La première ligne (#include <iostream>) ordonne au compilateur de lire (et d'inclure) le contenu de la bibliothèque iostream avant de compiler le programme. Cette bibliothèque contient des définitions de commandes (et/ou variables) utilisées dans la suite du programme. Dans notre cas, il s'agit de la définition de cout, de la constante endl et du fonctionnement de l'opérateur <<.
- La seconde ligne est nécessaire pour indiquer au programme que vous allez utiliser les fonctions de la bibliothèque standard (std). Nous verrons plus tard dans le cours le rôle et l'utilisation de ces éléments appelés «espaces de noms» (namespaces).
- La cinquième ligne (en comptant les lignes vides) indique le début du programme. Les instructions comprises entre l'accolade ouvrante { et l'accolade fermante associée } constituent la définition du programme principal (la fonction main), c'est-à-dire les instructions qui seront effectivement exécutées au lancement du programme (c'est-à-dire à l'invocation de la fonction main).
- La sixième ligne affiche «Bonjour tout le monde !» à l'écran, suivi d'un retour à la ligne (endl).
Étape 2 : compiler le programme
Avant d'être exécuté, un programme C++ doit être compilé : le fichier texte contenant le code source doit être traduit en langage machine. On effectue cette opération à l'aide d'une commande de compilation (c.f. la mini-référence premiers pas en C++), qui peut être tapée dans une fenêtre Terminal, ou obtenue depuis Emacs ou GEany, comme nous vous le proposons dans cet exercice :- Compilation/Exécution avec Emacs : avec la souris, cliquez sur le bouton Compile de Emacs.
Le message suivant doit apparaître, dans une boîte de
dialogue
ou dans la ligne de commande au bas d'Emacs (mini-buffer) :
Compile: make -k.
(Si vous avez suivi les instructions de la mini-référence Environnement Unix en ce qui concerne la configuration de Emacs, vous devriez obtenir le message suivant : «c++ -g salut.cc -o salut», il n'est pas nécessaire dans ce cas de modifier la commande de compilation comme indiqué ci-après) Dans la boîte de dialogue, cliquez sur Edit command. Dans le mini-buffer (au bas de la fenêtre Emacs), remplacez « make -k » par « c++ salut.cc -o salut » puis pressez la touche Return. Remarquez que cette opération n'est nécessaire que lors de la première compilation de votre programme.Si vous n'avez pas sauvegardé le fichier, Emacs vous demande alors l'autorisation de le faire maintenant (appuyez sur y pour confirmer).
La fenêtre se sépare en deux, et le buffer du dessous montre les messages de compilation. Attendez jusqu'à voir apparaître un message indiquant la fin de la compilation.
Si le buffer de compilation n'apparaît pas, ou qu'il disparaît à la suite de manipulations, affichez-le en le sélectionnant dans le menu Buffers. On rappelle aussi (voir la mini-référence sur l'environnement Unix) que l'on peut séparer une fenêtre en deux buffers en tapant C-x 2 (tandis que C-x 1 à l'effet inverse).
Si la compilation s'est déroulée sans problème (elle se termine avec le message «Compilation finished at ...»), testez votre programme : en utilisant un terminal, déplacez-vous (cd) si besoin est dans le répertoire ~/cpp/serie1 et lancez votre programme en tapant (suivi de Return)
salut
Le message «Bonjour tout le monde !» devrait alors apparaître. -
Compilation/Exécution avec Geany : Build > Build (ou F9). N'utilisez pas Compile qui ne génère pas un exécutable mais juste un fichier objet.
A noter que vous pouvez changer le compilateur utilisé avec Build >Set Includes and Arguments et en modifiant par exemple c++ en g++4.7 dans le champ Build. Si la compilation se passe bien vous verrez apparaitre dans la fenêtre au dessous de la fenêtre d'édition le message :
Compilation finished successfully
Pour exécuter : Build > Execute
Étape 3 : erreurs de compilation
Nous allons maintenant nous intéresser à la correction des erreurs d'un programme, en tout cas celle que le compilateur peut détecter.Cela vous arrivera souvent, et le compilateur C++ est assez fort pour trouver des erreurs. Apprenez donc à les comprendre et si vous avez du mal, n'hésitez pas à poster des questions sur le forum du cours !
Il existe divers types d'erreurs : - Les erreurs de syntaxe : le programme est mal
écrit et le compilateur ne le comprend pas.
Ces erreurs sont relativement faciles à trouver, car le compilateur signale toujours le problème, en indiquant souvent l'endroit de l'erreur. - Les erreurs d'implémentation : la syntaxe du programme est correcte (il compile), mais ce qu'il fait est erroné (par exemple une division par zéro se produit, ou une variable n'a pas été initialisée correctement). Ce type d'erreurs ne se détecte que lors des tests du programme (soit par un arrêt intempestif (cas de la division par zéro), soit par des résultats erronés (cas de la mauvaise initialisation).
- Les erreurs d'algorithme : l'algorithme
implémenté ne fait pas ce que l'on croit (ce qu'il
devrait)
Ce type d'erreur est en fait assez proche du précédent. Cependant, c'est plus la méthode globale qui est erronée, alors que dans le cas précédent, l'erreur provient le plus souvent d'une étourderie ou d'un manque de précision dans une des étapes du codage de l'algorithme. - Les erreurs de conception : ici c'est carrément l'approche du problème qui est erronée, souvent en raison d'hypothèses trop fortes ou d'hypothèse non explicitées.
Les erreurs d'implémentation et d'algorithme seront étudiées plus tard dans le cours, d'un point de vue pratique (avec la mise en oeuvre de procédures de déverminage - i.e. utilisation de débogueur et de tests logiciels) plutôt que théorique (il existe en effet un certain nombre de tests formels, mais ce genre de technique est trop complexe pour être abordée dans ce cours d'introduction).
Finalement, les erreurs de conceptions relèvent elles du domaine de l'ingénierie informatique (le «génie logiciel»), et ne seront elles non plus pas traitées dans ce cours.Pour commencer, introduisez volontairement une erreur de syntaxe dans votre programme (supprimez par exemple la dernière accolade ou le dernier point-virgule).
Relancez ensuite la compilation. Vous devriez obtenir un message indiquant le fichier où se trouve l'erreur (salut.cc), la ligne concernée, ainsi que le type d'erreur:
Par exemple, s'il manque la dernière accolade, le compilateur vous indiquera le message suivant :
salut.cc:10: error: parse error at end of input
...
Compilation exited abnormally with code 1 at ...Pour Emacs, cliquez avec le bouton du milieu de la souris sur le message d'erreur : dans le buffer du programme, Emacs positionnera alors le curseur sur le fichier et la ligne concernés. Vous pouvez passer d'une erreur à la suivante au moyen de la combinaison de touches C-x ` (c'est-à-dire la touche "Control" et la touche "x" en même temps, puis ensuite la touche `, c'est-à-dire l'accent grave (backquote), ou en cliquant avec le bouton droit dans la fenêtre de compilation.
Corrigez l'erreur, et relancez la compilation (pour cela, il vous suffit de faire un clic droit dans la fenêtre de compilation, et de sélectionner Recompile dans le menu «popup» qui apparaît).
Pour Geany, cliquez sur le message d'erreur avec le bouton droit de la souris et vous obtiendrez une flèche à l'endroit ou l'erreur se situe.
Dernière mise à jour : $Date: 2005/11/07 09:23:37 $ ($Revision: 1.3 $)