Vous êtes sur la page 1sur 7

1AB

Langage C

2013-2014

Correction derreurs
Introduction
Il existe deux types derreurs quil faut savoir corriger. Le premier type concerne les erreurs syntaxiques qui sont apparentes la compilation et quil faut corriger si on veut produire un programme excutable. Le deuxime type derreur concerne les erreurs algorithmiques. En effet, un algorithme est correct si, pour chaque instance en entre, il se termine en produisant la bonne sortie. Or il est difficile de dtecter ce type derreur puisquon ne peut pas a priori interrompre un programme pour situer linstruction errone. En ralit, il existe un outil permettant de faire une vrification pas pas du programme : le debugger. Lobjectif de ce TD est de vous aider comprendre et corriger en premier vos erreurs syntaxiques, puis vos erreurs algorithmiques.

1/7

1AB A. Erreurs syntaxiques

Langage C

2013-2014

Les erreurs syntaxiques sont faciles corriger. En effet, tant quil en subsiste, le programme ne compile pas (non gnration du fichier objet). Certaines erreurs gnrent des warnings seulement, et le programme compile quand mme sauf si une option particulire len empche. Nous allons voir dans un premier temps quelles sont les erreurs les plus frquentes, quil vous faudra donc savoir corriger, et quelles options du compilateur gcc obligent un code irrprochable. A.I. Erreurs frquentes Dans cette partie, un fichier source comportant des erreurs vous est fourni, et votre objectif consiste le faire compiler. Il vous est demand de crer un fichier texte rapportant les erreurs rencontres et de le complter au fur et mesure des sances (TOUTES les sances). Cest un bon moyen de ne pas rpter les erreurs, ou en tout cas, de savoir les lire et les corriger. Do it 1 : Crer un fichier de compte-rendu derreurs syntaxiques.
Lancer Geany et sauvegarder dans un rpertoire prdfini par vos soins le fichier au nom de SYNTAXERROR.txt. Le fichier sera remplir avec le format dfini sur la figure 1.

Figure 1 : Format du fichier d'erreurs

Tip 1 : Votre perspicacit lgendaire vous montre que chaque solution commence par un verbe linfinitif. Veiller ce que ce soit toujours le cas. Do it 2 : Corriger les erreurs syntaxiques.
Tlcharger le fichier syntaxi.c sur Moodle et lenregistrer dans votre rpertoire. Louvrir sous Geany et compiler avec gcc.

Lerreur qui devrait vous apparatre est prsente la figure 2.

Figure 2 : Erreur de syntaxe

2/7

1AB

Langage C

2013-2014

Premire constatation : les langages de programmation sont gnialissimes car les seuls vous faire travailler plusieurs langues (utiles qui plus est) la fois : le langage de programmation lui-mme, le franais ( travers les commentaires quon vous oblige taper) et langlais ici dans les erreurs syntaxiques. Franchement ceux/celles qui nont pas le TOEIC le font exprs ! Gnralement, lerreur se situe la ligne indique par le compilateur. Ici, elle indique la ligne 10. La nature du problme est de type erreur , le fichier ne peut donc pas gnrer de fichier objet. Lexplication de lerreur indique quil manque une virgule ou un point-virgule avant for. Cette erreur est de loin la plus courante, mais galement la plus tratre. En effet, lerreur est pointe sur la ligne 10, mais en ralit elle concerne linstruction prcdente, puisque lexplication indique que le problme se trouve avant le for. Ainsi, il manque effectivement un point-virgule qui termine les instructions en langage C la ligne 9 aprs la dclaration et linitialisation de la variable somme. Do it 3 : Corriger les erreurs syntaxiques (2).
Copier lerreur que vous allez corriger dans Slectionner les lignes directement de la console et SYNTAXERROR.txt. coller dans le fichier derreurs. Ecrire comme solution : Mettre un point-virgule linstruction prcdente. Corriger lerreur choisie et noter ce qui a t fait dans Mettre un point virgule la fin de la dclaration de la le fichier SYNTAXERROR.txt. variable somme . Sauvegarder et compiler le fichier nouveau.

Question 1 : Trois autres erreurs apparaissent. Les corriger et ne pas oublier de les copier et dindiquer les solutions. Un indice pour vous : les deux premires concernent lintrieur des parenthses de la boucle for, et la troisime concerne une accolade non referme. La dernire erreur intitule expected declaration or statement at end of input est la deuxime erreur la plus souvent commise aprs loubli des points-virgules. Elle concerne loubli daccolade, cest--dire quon a ouvert un bloc dinstructions, mais quon a oubli de la refermer. Tip 2 : Il est fortement conseill lorsque vous ouvrez un bloc laide dune accolade, de commencer par la refermer et ensuite de taper vos instructions lintrieur. Ainsi vous viterez autant que possible cette erreur. Do it 4 : Corriger les erreurs syntaxiques (3).
Sauvegarder et compiler le fichier nouveau.

Encore une erreur ! Cette fois-ci, le compilateur indique undefined reference to prinf . Mme sans le TOEIC, et en faisant beaucoup de franglais, on comprend indfini rfrence prinf . Sans sortir tout nu de son bain, on comprend que prinf nest pas compris en langage C et que la fonction quon souhaite utiliser est printf ! Do it 5 : Corriger les erreurs syntaxiques (4 et fin ?).
Corriger la coquille. Compiler le fichier nouveau. Un autre problme apparat, mais cest seulement un warning . Regarder la liste des fichiers de votre rpertoire. Excuter le programme gnr.

Tip 3 : Ainsi, lorsque le compilateur gnre un warning , cela ne lempche pas de produire le fichier objet. Du moins, jusquau prochain paragraphe

3/7

1AB
A.II. Options du compilateur

Langage C

2013-2014

Corsons un peu les choses. Compiler sans options particulires est une premire tape. Mais cela ne vaut que pour le compilateur utilis. En effet, ce dernier permet certains carts (telle que la dclaration de variables aprs les instructions) que ne permettent pas par exemple le compilateur que vous utiliserez en TP de microprocesseurs. Autant dire que plus votre code est irrprochable, et plus grand sera le nombre de compilateurs qui accepteront de compiler sans rechigner. Nous allons passer en revue quelques options que vous devrez utiliser partir de maintenant. Do it 6 : Afficher tous les warnings .
Effacer le fichier objet syntaxi.o. Compiler le fichier syntaxi.c que vous avez corrig gcc syntaxi.c Wall o syntaxi.o prcdemment avec loption Wall.

Tip 4 : Bien veiller respecter les espaces quand il y en a et ne pas en rajouter quand il ny en a pas. En effet, lespace est un sparateur entre les diffrents arguments. En particulier, ne surtout pas mettre despace dans vos noms de fichiers. De mme, les majuscules et minuscules sont diffrencis (Syntaxi.c et syntaxi.c sont deux fichiers diffrents). Question 2 : Que constatez-vous ? Est-ce que le compilateur gnre un fichier .o ? Do it 7 : Transformer tous les warnings en errors .
Effacer le fichier objet syntaxi.o. syntaxi.c Compiler le fichier syntaxi.c que vous avez corrig Gcc syntaxi.o prcdemment avec les options Wall et Werror. Wall Werror o

Question 3 : Que constatez-vous ? Corriger les nouvelles erreurs pour que le fichier .o soit gnr. Pour la non-utilisation de la variable offset , lutiliser lors de laffichage en affichant somme + offset. Tip 5 : Lutilisation de ces deux options permet de vrifier que toutes les variables sont utilises et initialises. Cela vite quelques erreurs algorithmiques possibles. Do it 8 : Compiler en respectant la norme ANSI.
Compiler le fichier syntaxi.c que vous avez corrig gcc syntaxi.c ansi o syntaxi.o prcdemment avec loption ansi.

Question 4 : Que constatez-vous ? Tip 6 : Et si ! Lerreur provient de la ligne de commentaires au dessus de linclusion de la librairie. En effet, la norme ANSI tolre uniquement les commentaires dbutant par /* et finissant par */, la notation // tant un commentaire C++. Do it 9 : Compiler en respectant la norme ISO.
Remplacer le // par /* (en dbut de commenaires) et */ (en fin de commentaires). Compiler le fichier syntaxi.c que vous avez corrig gcc syntaxi.c pedantic o syntaxi.o prcdemment avec loption pedantic.

Question 5 : Que constatez-vous ? Corriger lerreur et recompiler.

DORENAVANT, VOUS COMPILEREZ TOUS VOS PROGRAMMES AVEC LES OPTIONS -Wall Werror ansi -pedantic gcc Wall Werror ansi pedantic nom_fichier.c o nom_fichier.o Vous tenez le bon bout maintenant : si vous arrivez compiler avec ces quatre options, vous aurez dj enlev une trs grande partie des problmes syntaxiques pouvant provenir de la majorit des compilateurs.

4/7

1AB B. Erreurs algorithmiques

Langage C

2013-2014

Les erreurs algorithmiques sont plus insidieuses, car le compilateur ne les dtecte pas. En effet, il nest pas du rle de ce dernier de dire que votre algorithme dtecte le maximum alors que vous cherchiez dtecter le minimum. Pour corriger ces erreurs, la solution la plus approprie est le debugger. Apprendre excuter son programme pas pas est essentiel puisque cest le moyen le plus facile de reprer linstruction errone algorithmiquement parlant. Cette dmarche sera galement celle adopte en VHDL et en microprocesseurs. B.I. Loutil indispensable : le debugger Lobjectif dun debugger est de permettre de regarder ce quil se passe lintrieur dun programme pendant son excution. DDD (Data Display Debugger) est capable de raliser principalement quatre fonctions que sont : - Excuter le programme avec des arguments pouvant affecter son fonctionnement. - Stopper lexcution du programme des endroits prcis (points darrt). - Examiner lenvironnement du programme (contenu des variables) lorsque celui-ci est sur un point darrt. - Changer les instructions dans le programme pour tester les effets sur un bug. Techniquement parlant, DDD nest pas le debugger lui-mme : cest une interface qui peut intgrer diffrents debuggers dont lutilisation se fait exclusivement en lignes de commande comme par exemple gdb. DDD permet den faciliter lutilisation. B.II. Exemple dutilisation

Cette partie permet de prendre les commandes de DDD sur un exemple. B.II.1. Excuter DDD Pour pouvoir invoquer le debugger, il faut rajouter loption g lors de la compilation. Do it 10 : Excuter un programme sous DDD
Tlcharger le fichier algorithmi.c sur Moodle et lenregistrer dans votre rpertoire. Louvrir sous Geany et compiler avec gcc en rajoutant loption -g. Excuter le programme sous DDD. gcc algorithmi.c Wall Werror ansi -pedantic -g o algorithmi.o ddd ./algorithmi.o

B.II.2. Utiliser DDD La figure 3 montre la fentre DDD et indique les zones dintrt.

5/7

1AB

Langage C

2013-2014

Figure 3 : Fentre du debugger

Do it 11 : Apprhender le mode pas--pas.


Placer et dplacer un point darrt. Double-cliquer sur la premire instruction contenue dans la fonction principale (dclaration de la variable i). Un stop apparat symbolisant le point darrt. Cliquer sur le stop et le dplacer en restant appuyer sur le bouton de la souris. Replacer le point darrt sur la premire instruction. Dans la bote outils, cliquer sur Run . Une flche verte apparat sur linstruction qui va tre excute. Dans la bote outils, cliquer une fois sur Step pour excuter linstruction pointe par la flche verte et aller celle daprs. La flche verte se dplace. Continuer jusqu atteindre linstruction situe dans la boucle. Pointer le curseur sur la variable i et le laisser. Il apparat un petit encart jaune avec la valeur actuelle de i. Observer de mme les variables min et tab. Dans la bote outils, cliquer sur step de manire atteindre linstruction printf . A chaque tour de boucle, regarder les valeurs de i et de min. Regarder le rsultat final sur la console du debugger. Finir lexcution du programme en pas pas. La console du debugger indique Program exited normally .

Excuter le programme. Effectuer les premiers pas en mode pas pas.

Lire le contenu des variables.

Aller au bout de lexcution du programme.

6/7

1AB

Langage C

2013-2014

Tip 7 : Il vous appartient de dcider o placer le point darrt. Gnralement, on le place dans un premier temps aprs la dclaration des variables. Ensuite, on le place au dbut des instructions dont on souhaite tester le fonctionnement (si toutes les instructions prsentes avant fonctionnent correctement). Do it 12 : Visualiser le contenu des variables de faon continue.
Excuter le programme nouveau. Afficher de faon continue le contenu des variables. Dans le menu View , cocher la case Data Window. Dans le menu Data , cliquer sur Displays . Une bote de dialogue souvre (Display Editor). Cliquer sur Display . Rentrer le nom de la variable i dans la case prvue et cliquer sur le bouton Display . ATTENTION LE CURSEUR DE LA SOURIS DOIT POINTER LA CASE DE SAISIE POUR QUE VOUS PUISSIEZ RENTRER LE NOM DE LA VARIABLE. Faire de mme pour les variables tab et min . Aller au bout de lexcution du programme en mode pas pas tout en visualisant les changements des contenus des variables chaque pas.

Tip 8 : Le curseur de la souris indique la zone active dans DDD. Si vous souhaitez interagir dans une zone prcise avec le clavier, il faut commencer par pointer la souris cet endroit. Tip 9 : Lorsque vous ajoutez une variable la visualisation, des lignes de commandes apparaissent dans la console du debugger. Il sagit des commandes quon aurait d taper dans gdb pour avoir la mme chose. Question 6 : Avez-vous trouv lerreur algorithmique ? Il serait temps de le faire ! Do it 13 : Corriger lerreur algorithmique.
Corriger directement dans DDD lerreur algorithmique. Faire une excution en mode pas pas tout en visualisant le contenu des variables, en particulier la variable min. Quitter DDD si le rsultat affich est celui escompt. Excuter le programme sans DDD.

On reviendra prochainement sur lutilisation de DDD une premire fois lorsque les fonctions auront t introduites, et une seconde fois avec les pointeurs.

Conclusion
Ce TD a eu pour but de prsenter les divers outils votre disposition pour fournir un code syntaxiquement et algorithmiquement irrprochable. Il vous faut absolument les matriser car cest une dmarche logique et universelle prsente dans tout langage de programmation en allant de lassembleur aux langages objets. Ne pas stonner de payer un th/caf/chocolat au professeur encadrant la prochaine fois que vous lui montrez une erreur syntaxique de type oubli de point-virgule.

7/7

Vous aimerez peut-être aussi