erreur de segmentation - C - Programmation
Marsh Posté le 08-06-2005 à 08:24:11
Compilation et exécution, c'est deux choses différentes. Rien ne garantie qu'un programme compilé s'exécutera bien.
Il y a donc forcément un problème dans ton programme. A toi de trouver où...
Marsh Posté le 08-06-2005 à 08:40:03
shikra a écrit : |
Soit tu n'as pas posté le bon code, soit ton compilateur est mal réglé...
|
Ceci compile et ne plante pas avec "./genpasswd -l 12". J'ai pas testé les autes cas. Pose des questions si tu ne comprends pas.
|
Marsh Posté le 08-06-2005 à 08:52:22
desole g vien de retester aucun probleme lorsque je compile mais probbleme quand j'execute ce le programme:
segmentation default.
et le compilateur est bien regle puisque j'ai fait dautre programme dessus sans probleme et que ca tourne normal depuis kelke année deja
Marsh Posté le 08-06-2005 à 09:02:50
bin ca m'etonne pas que ca plante vu le nombre de warning que ca te ponds....tu utilises des variables non initialisées, par exemple
Marsh Posté le 08-06-2005 à 09:26:14
shikra a écrit : et le compilateur est bien regle puisque j'ai fait dautre programme dessus sans probleme et que ca tourne normal depuis kelke année deja |
Non, il n'est pas bien réglé, en tout cas il n'est pas suffisament strict.
Pour prendre un cas extrême, si tu compiles en désactivant tous les warnings, ça va bien compiler, mais merci les surprises.
Tu utilises quel compilateur ? gcc ?
Marsh Posté le 08-06-2005 à 10:44:26
oui j'utilise gcc et je n'ai rien desactivé.
c'est ca que je ne comprend pas!
Marsh Posté le 08-06-2005 à 10:57:36
shikra a écrit : oui j'utilise gcc et je n'ai rien desactivé. |
il faut activer
gcc -Wall -o programme programme.c |
et de manière générale il faut toujours faire en sorte d'avoir les extras warning (-Wall pour gcc et il me semble /Wall pour le cl.exe de MS et -w pour bcc32 de borland (je suis pas sur non plus)).
Marsh Posté le 08-06-2005 à 11:01:23
Personnellement, je compile avec "-W -Wall -ansi -pedantic -O2"
Ca détecte pas mal d'éventuels problèmes.
Marsh Posté le 08-06-2005 à 11:37:44
effectivement je retrouve les memes erreurs que Emmanuel Delahaye!
Mais pourquoi
De quoi s'agit-il
et j'arrive pas a les corriger!!
desole de vous faire perdre du temps mais la ya luttage pour moi
Marsh Posté le 08-06-2005 à 11:44:52
J'espère qu'on t'a converti à l'usage du paramétrage strict du compilateur.
Code :
|
Utilisation d'une fonction non encore déclarée. Il faut qu'elle soit déclarée avant que tu ne l'appelles, le compilateur étant linéaire (il lit de haut en bas, s'il trouve un appel d'une fonction dont la déclaration se situe plus loin, il ne la connait pas encore, et donc il estime qu'elle retourne 'int' par défaut)
Code :
|
isprint() est dans ctype.h, il faut écrire le #include correspondant.
Code :
|
Variables définies, mais non utilisées (= inutiles).
Code :
|
srandom(), atoi() et random() sont déclarées dans stdlib.h
Il manque le #include qui correspond, et donc le compilateur ne les connait pas.
Attention pour srandom() et random() : il s'agit de fonctions POSIX (norme P2001), il vaut mieux utiliser srand() et rand(), comme l'a montré Emmanuel.
Code :
|
argc et argv sont définies mais non initialisées (il y a n'importe quoi dedans).
Ces deux variables sont initialisées dans main(), elles sont donc locales à cette fonction et inconnues ailleurs dans le programme.
Pour que fonction_parametre() les connaisse, il faut les lui passer en paramètre (regarde le code que Emmanuel a posté pour exemple)
Marsh Posté le 08-06-2005 à 11:52:32
effectivement je retrouve les memes erreurs que Emmanuel Delahaye!
Mais pourquoi
De quoi s'agit-il
et j'arrive pas a les corriger!!
desole de vous faire perdre du temps mais la ya luttage pour moi
Marsh Posté le 08-06-2005 à 11:55:27
euh la g reposter le meme message g sait pas pourquoi dsl
Marsh Posté le 08-06-2005 à 12:00:26
shikra a écrit : effectivement je retrouve les memes erreurs que Emmanuel Delahaye! |
Compare avec le code que j'ai donné. Les problèmes sont corrigés...
Marsh Posté le 08-06-2005 à 12:04:42
oui merci emmanuel ca fonctionne maintenant!!
merci a tous en tout cas de votre aide rapide et efficace!
ji vais a plus
Marsh Posté le 06-08-2005 à 11:47:57
Salut,j'ai écrit ce programme mais je ne trouve pas pourquoi j'ai une erreur de segmentation.
Merci a ceux qui m'aideront.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void bubbleSort(char **tab,int (*cmp)(void *,void *)){
char **p1,**p2;
for(p1=tab; *p1!=NULL; ++p1)
for(p2=p1+1; *p2!=NULL; ++p2)
if((*cmp)(*p1,*p2)>0){
char buf[BUFSIZ];/*Suppose assez grand*/
strcpy(buf,*p1);
strcpy(*p1,*p2);
strcpy(*p2,buf);
}
}
void printTable(FILE *fdo, char **tab){
for( ; *tab!=NULL; ++tab)
fprintf(fdo, "%s\n", *tab);
}
int main (int argc, char * argv[]){
char **t;
unsigned int i,l;
if((t=(char **)malloc(sizeof(char *)*argc))==NULL){
fprintf(stderr,"Error in memory allocation\n" );
return EXIT_FAILURE;
}
l=(unsigned int)argc-1U;
for(i=0; i<l; ++i){
if((t[i]=(char*)malloc(strlen(argv[i+1])+1))==NULL){
fprintf(stderr,"Error in memory allocation\n" );
return EXIT_FAILURE;
}
strcpy(t[i],argv[i+1]);
}
t[l]=NULL;
printTable(stdout, t);
bubbleSort(t, (int (*)(void *,void *)) &strcmp);
printTable(stdout, t);
return EXIT_SUCCESS;
}
Marsh Posté le 06-08-2005 à 11:56:17
ca marche tres bien pour moi
donne un exemple d'une utilisation foireuse ?
Marsh Posté le 06-08-2005 à 12:05:55
Salut,je voudrais savoir que fait ce programme et s'il est portable.
De plus j'aimerais savoir ce qu'il ce passe si la saisie et incorrecte et comment détecter au niveau du shell si cette saisie était correcte ou non.
Merci a ceux qui répondront.
#include<stdio.h>
#include<stdlib.h>
int g(unsigned int n,char *res){
if(n>9) return 1;
*res = '0'+n;
return 0;
}
int f(unsigned int n, char *s, size_t *l){
char c; size_t cl=*l;
if(n==0)
return 0;
g(n%10U, s);
c=*s;
++*l;
f(n/10U, s+1, l);
if(cl<*l/2){
*s=s[*l-cl-1-cl];
s[*l-cl-1-cl]=c;
}
return 0;
}
int main (void){
unsigned int n;
char buf[BUFSIZ];/*Suppose assez grand*/
size_t l=0;
printf("Entrez un nombre:" );
if (scanf("%u",&n)==1){
if(n!=0)
f(n,buf,&l);
else{
buf[0]='0';
++l;
}
buf[l]='\0';
fprintf(stdout,"%s %u\n",buf,l);
return EXIT_SUCCESS;
}
else return EXIT_FAILURE;
}
Marsh Posté le 06-08-2005 à 12:11:10
Teste,
oui il est portable à première vue
ah première vue un segfault
la verif ne se fait pas au niveau du shell. Il faut vérifier toi même ce que rentre l'utilisateur et ici notamment le nombre de nombres qu'il rentre
Marsh Posté le 06-08-2005 à 12:16:24
mcjoedassin a écrit : ca marche tres bien pour moi |
La je suis chez un pote qui n a pas le C mais c'est bizarre car mon programme ne compile pas donc je ne peux pas l'utiliser.
Peux-tu faire un essai?
Marsh Posté le 06-08-2005 à 12:23:37
mcjoedassin a écrit : Teste, |
J'ai recuperé la source sur le net et les questions posées sur ce programme était les suivantes?
Que fait le programme suivant?
Est-il portable(justifiez votre réponse)?
Que se passe t-il si la saisie n'est pas correcte?
Comment détectez ,au niveau du shell,si cette saisie était correcte ou non(donnez un petit exemple,en shell)?
Comme je ne sais pas comment répondre,je sollicite de l'aide.
Marsh Posté le 06-08-2005 à 19:35:18
(re)lis la charte ...
Marsh Posté le 08-06-2005 à 08:01:48
salut a tous,
je travaille sous anjuta.
lorsque je lance mon programme avec ma console: ./genpasswd -l 12
il me met: Segmentation fault
alor que quand je compile et construit mon programme je n'ai aucune erreur
si quelqu'un sait mon erreur et pouvait maider je lui en serai reconaissan!