Académique Documents
Professionnel Documents
Culture Documents
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
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.
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.
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.
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
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
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