| – |
erreur de compilation ou d'édition de liens
|
| – |
erreur d'exécution
|
gcc -o :
gcc -o essai essai.c pour le programme
suivant :#include <stdio.h>
int main () {
floatt f ;
return 0 ;
}
essai.c : 3 : 'floatt' undeclared (first use in this
function)
#include <stdio.h>
int main () {
float f=1/0;
return 0 ;
}
./essai), l'ordinateur affiche un message du type : Floating point exception. En effet, une division par zéro est interdite.
#include <stdio.h>
int main () {
printf ("Je suis ici") ;
while (1)
;
return 0 ;
}
printf() est conservé dans un buffer de ligne jusqu'à réception d'un \n ou exécution d'un fflush().\n) :#include <stdio.h>
int main () {
int i ;
for (i=0 ; i<100 ; i++)
printf("i=%d",i) ;
while (1)
;
return 0 ;
}
printf) dans le programme nous permettra de localiser le bug.#include <stdio.h>
int main () {
int i ;
printf("1) Je suis ici\n") ; /* 1 er mouchard */
for (i=0 ; i<100 ; i++)
printf("i=%d",i) ;
printf("2) Je suis ici\n") ; /* 2 eme mouchard */
while (1)
;
return 0 ;
}
#include <stdio.h>
int main () {
int i,j;
i=0;
j=0;
printf("1) Je suis ici\n") ;
if ((i==0) && (i=j)) {
printf("2) Je suis ici\n");
...
}
return 0 ;
}
2) Je suis
ici or il n'en est rien ? ! Vous en êtes à invoquer un bug dans le compilateur ? ! L'ordinateur ne fait que ce que vous lui demandez. Vous allez donc affiner votre traçabilité en plaçant des
mouchards pour voir précisément le contenu des variables.#include <stdio.h>
int main () {
int i,j;
i=0;
j=0;
printf("1°) Je suis ici\n");
printf("i=%d j=%d\n",i,j);
if ((i==0) && (i=j)) {
/* (i=j) => i vaudra 0, et 0 est identique à faux !!! */
printf("2°) Je suis ici\n");
...
}
return 0 ;
}
#include <stdio.h>
int main () {
int i, somme;
for (i=0 ; i<10 ; i++);
printf ("i=%d\n",i) ;
somme += i;
printf("La moyenne vaut:%d",somme/i) ;
return 0 ;
}
i=0 i=1 ... i=9 La moyenne vaut: 4.50000
#include <stdio.h>
int main () {
int i=0;
scanf("%d",i);
return 0 ;
}
#include <stdio.h>
int main () {
int i=0;
printf("1°) Je suis ici\n") ;
scanf("%d",i);
printf("2°) Je suis ici\n");
return 0 ;
}
scanf("%d",i) car seul le message « 1°) Je suis ici » s'affiche et pas le message « 2°) Je suis ici »3.0… le scanf va tenter de stocker ce que vous venez d'entrer au clavier à l'adresse mémoire 0 (NULL) ! Cette
dernière est réservée au système d'exploitation, d'où l'erreur…#include <stdio.h>
#define TAILLE 10
int main () {
int tab[TAILLE];
tab[TAILLE+10]=100;
return 0 ;
}
#include <stdio.h>
#include <string.h>
int main () {
int * p=NULL;
*p=123;
printf("\n je suis ici...\n");
}
ddd.
| – |
gcc -o essai essai.c -g |
| – |
ddd essai |
| – |
fermez les petites fenêtres « parasites » qui apparaissent au lancement de
ddd |
| – |
cliquez sur le bouton run (il faut parfois chercher un peu dans les menus)…
|
-g de la ligne de compilation permet de compiler le
programme en y incluant les informations supplémentaires utiles au débogage.p=NULL ;, vous placez donc la valeur
0 dans cette variable. Ceci signifie que p pointe sur un élément mémoire qui n'est pas accessible par votre programme en écriture.
Or, vous faites *p=123 ; qui revient à vouloir écrire la valeur 123 à l'adresse NULL.ddd vous indique alors quelle ligne a provoqué
l'erreur de segmentation. Sur un programme de plusieurs centaines, voire plusieurs milliers de lignes, cette aide est particulièrement appréciable.
ddd…
chaine à l'envers, et ce, caractère par caractère :#include <stdio.h>
#include <string.h>
int main () {
int i;
char chaine[]="! éuggubéd tse emmargorp el";
for (i=strlen(chaine); i =! 0; i--)
printf("%s",chaine[i]) ;
return 0 ;
}
#include <stdio.h>
int main () {
int i;
int i1,i2 ;
char c1,c2;
printf("1) Entrez un nombre: ");
scanf("%d",&i1);
printf("2) Entrez un nombre: ");
scanf("%d",&i2);
printf("1) Entrez une lettre: ");
scanf("%c",&c1);
printf("2) Entrez une lettre: ");
scanf("%c",&c2);
printf("1) J'ai récupéré lettre 1:%d\n",(int)c1);
// renverra 10 c.à.d le code ascii de '\n'
printf("2) J'ai récupéré lettre 2:%d\n",(int)c2);
}
\n subsiste du premier caractère et pollue la
variable c2. En effet, quand vous faites un :
scanf("%c",&c1);
\n restera de côté (pour l'instant).gets(chaine) à la place de chaque scanf de la façon suivante./* ===== Version non corrigée ===== */
int i;
char c;
printf("Entrez un caractère:");
scanf("%c",&c);
printf("Entrez un chiffre:");
scanf("%d",&i);
/* ===== Version corrigée ===== */
int i;
char c;
char chaine[100];
printf("Entrez un caractère:");
gets(chaine);
c=chaine[0];
printf("Entrez un chiffre:");
gets(chaine);
sscanf(chaine,"%d",&i) ;
#include <stdio.h>
#include <string.h>
int main () {
int i;
char chaine[]="! éuggubéd tse emmargorp el";
for (i=strlen(chaine); i != 0; i--)
printf("%c",chaine[i]) ;
return 0 ;
}
| 1. |
on tente de le reproduire à tous les coups et on note la séquence,
|
| 2. |
on cherche à isoler le plus précisément possible l'endroit où le problème est apparu en injectant des mouchards (trace),
|
| 3. |
dans le cas d'une erreur de segmentation, on tente d'utiliser un debugger.
|
ddd :| – |
Compilez le programme avec l'option
‐g selon : gcc -o programme programme.c -g |
| – |
Exécutez :
ddd programme |
| One minute, please... |
Fermer |