Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2182 connectés 

  FORUM HardWare.fr
  Programmation
  C

  erreur de segmentation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

erreur de segmentation

n°1112127
shikra
life is short,drink faster!!!
Posté le 08-06-2005 à 08:01:48  profilanswer
 

salut a tous,
 
je travaille sous anjuta.
lorsque je lance mon programme avec ma console:  ./genpasswd -l 12
il me met:   Segmentation fault :??:    :fou:  
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! :jap:  
 

Code :
  1. #include <signal.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. #include <stdio.h>
  5. main (int argc,char *argv[])
  6. {
  7. int aflag=0,bflag=0,index,c;
  8. char *cvalue=NULL;
  9. opterr=0;
  10. void fonction_parametre(void);
  11. while ((c=getopt (argc,argv,"-l:" ))!=-1)
  12. switch (c)
  13. {
  14.  case 'l':
  15.   aflag=1;
  16.   break;
  17.  case '?':
  18.   if (isprint (optopt))
  19.   {
  20.    fprintf (stderr,"Unknown option '-%c'.\n",optopt);
  21.   }
  22.   else
  23.   {
  24.    fprintf (stderr,"Unknown option character '\\x%x'.\n",optopt);
  25.   }
  26.  return 1;
  27. }
  28. fonction_parametre();
  29. return 0;
  30. }
  31. void fonction_parametre (void)
  32. {
  33. int i;
  34. int argc;
  35. char *argv;
  36. short zero=48;
  37. short Z=90;
  38. short a=97;
  39. short z=122;
  40. srandom(getpid());
  41.  if (argc==3)
  42.  {
  43.   printf("Le programme a choisi les nombres aleatoires suivants compris entre %c et %c et entre %c et %c : \n",zero,Z,a,z);
  44.   for (i=0;i<atoi(argv [2]);i++)
  45.   {
  46.    printf("%c",(48+(random() % 74)));
  47.   }
  48.   printf("\n\n" );
  49.  }
  50.  else if (argc<3)
  51.  {
  52.   printf("Le programme a choisi les nombres aleatoires suivants compris entre %c et %c et entre %c et %c : \n",zero,Z,a,z);
  53.   for (i=0;i<10;i++)
  54.   {
  55.    printf("%c",(48+(random() % 74)));
  56.   }
  57.   printf("\n\n" );
  58.  }
  59.  else
  60.  {
  61.   printf ("Ne peut execute le programme car parametres inconnues" );
  62.   printf("\n\n" );
  63.  }
  64. }

mood
Publicité
Posté le 08-06-2005 à 08:01:48  profilanswer
 

n°1112135
boulax
Inserer phrase hype en anglais
Posté le 08-06-2005 à 08:24:11  profilanswer
 

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ù...


---------------
Posté depuis des chiottes, sales. Me gusta.
n°1112142
Emmanuel D​elahaye
C is a sharp tool
Posté le 08-06-2005 à 08:40:03  profilanswer
 

shikra a écrit :


alor que quand je compile et construit mon programme je n'ai aucune erreur


Soit tu n'as pas posté le bon code, soit ton compilateur est mal réglé...


../main.c:18: warning: return type defaults to `int'
 
../main.c: In function `main_':
 
../main.c:22: warning: nested extern declaration of `fonction_parametre'
../main.c:32: warning: implicit declaration of function `isprint'
../main.c:32: warning: nested extern declaration of `isprint'
../main.c:19: warning: unused variable `bflag'
../main.c:19: warning: unused variable `index'
../main.c:20: warning: unused variable `cvalue'
 
../main.c: In function `fonction_parametre':
../main.c:55: warning: implicit declaration of function `srandom'
../main.c:55: warning: nested extern declaration of `srandom'
 
../main.c:59: warning: implicit declaration of function `atoi'
 
../main.c:59: warning: nested extern declaration of `atoi'
../main.c:61: warning: implicit declaration of function `random'
../main.c:61: warning: nested extern declaration of `random'
../main.c:70: warning: nested extern declaration of `random'
../main.c:61: warning: redundant redeclaration of 'random'
../main.c:61: warning: previous implicit declaration of 'random' was here
 
../main.c:49: warning: 'argc' might be used uninitialized in this function
../main.c:50: warning: 'argv' might be used uninitialized in this function
 


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.


#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
 
#include <stdlib.h>
#include <ctype.h>
 
#define srandom(a) srand((unsigned)a)
#define random() rand()
 
void fonction_parametre (int argc, char **argv)
{
   int i;
   short zero = 48;
   short Z = 90;
   short a = 97;
   short z = 122;
   srandom (getpid ());
   if (argc == 3)
   {
      printf ("Le programme a choisi les nombres aleatoires suivants compris entre %c et %c et entre %c et %c : \n", zero, Z, a, z);
      for (i = 0; i < atoi (argv[2]); i++)
      {
         printf ("%c", (48 + (random () % 74)));
      }
      printf ("\n\n" );
   }
   else if (argc < 3)
   {
      printf ("Le programme a choisi les nombres aleatoires suivants compris entre %c et %c et entre %c et %c : \n", zero, Z, a, z);
      for (i = 0; i < 10; i++)
      {
         printf ("%c", (48 + (random () % 74)));
      }
      printf ("\n\n" );
   }
   else
   {
      printf ("Ne peut execute le programme car parametres inconnues" );
      printf ("\n\n" );
   }
}
 
int main (int argc, char *argv[])
{
   int aflag = 0, c;
   opterr = 0;
 
   while ((c = getopt (argc, argv, "-l:" )) != -1)
   {
      switch (c)
      {
      case 'l':
         aflag = 1;
         break;
 
      case '?':
         if (isprint (optopt))
         {
            fprintf (stderr, "Unknown option '-%c'.\n", optopt);
         }
         else
         {
            fprintf (stderr, "Unknown option character '\\x%x'.\n", optopt);
         }
         return 1;
      }
   }
   fonction_parametre (argc, argv);
   return 0;
}



Message édité par Emmanuel Delahaye le 08-06-2005 à 08:49:37

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1112143
chrisbk
-
Posté le 08-06-2005 à 08:42:33  profilanswer
 

ah oué, quand meme [:petrus75]

n°1112147
shikra
life is short,drink faster!!!
Posté le 08-06-2005 à 08:52:22  profilanswer
 

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

n°1112154
chrisbk
-
Posté le 08-06-2005 à 09:02:50  profilanswer
 

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

n°1112174
Elmoricq
Modérateur
Posté le 08-06-2005 à 09:26:14  profilanswer
 

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 ?

n°1112297
shikra
life is short,drink faster!!!
Posté le 08-06-2005 à 10:44:26  profilanswer
 

oui j'utilise gcc et je n'ai rien desactivé.
c'est ca que je ne comprend pas! :pfff:

n°1112315
manatane
En vous remerciant, bonsoir
Posté le 08-06-2005 à 10:57:36  profilanswer
 

shikra a écrit :

oui j'utilise gcc et je n'ai rien desactivé.
c'est ca que je ne comprend pas! :pfff:


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)).


Message édité par manatane le 08-06-2005 à 10:58:18
n°1112321
Elmoricq
Modérateur
Posté le 08-06-2005 à 11:01:23  profilanswer
 

Personnellement, je compile avec "-W -Wall -ansi -pedantic -O2"
 
Ca détecte pas mal d'éventuels problèmes.

mood
Publicité
Posté le 08-06-2005 à 11:01:23  profilanswer
 

n°1112393
shikra
life is short,drink faster!!!
Posté le 08-06-2005 à 11:37:44  profilanswer
 

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[:aaah]
 
[:azka]

n°1112409
Elmoricq
Modérateur
Posté le 08-06-2005 à 11:44:52  profilanswer
 

J'espère qu'on t'a converti à l'usage du paramétrage strict du compilateur. ;)
 

Code :
  1. ../main.c:18: warning: return type defaults to `int'
  2. ../main.c: In function `main_':
  3. ../main.c:22: warning: nested extern declaration of `fonction_parametre'


 
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 :
  1. ../main.c:32: warning: implicit declaration of function `isprint'
  2. ../main.c:32: warning: nested extern declaration of `isprint'


 
isprint() est dans ctype.h, il faut écrire le #include correspondant.
 

Code :
  1. ../main.c:19: warning: unused variable `bflag'
  2. ../main.c:19: warning: unused variable `index'
  3. ../main.c:20: warning: unused variable `cvalue'


 
Variables définies, mais non utilisées (= inutiles).
 

Code :
  1. ../main.c: In function `fonction_parametre':
  2. ../main.c:55: warning: implicit declaration of function `srandom'
  3. ../main.c:55: warning: nested extern declaration of `srandom'
  4. ../main.c:59: warning: implicit declaration of function `atoi'
  5. ../main.c:59: warning: nested extern declaration of `atoi'
  6. ../main.c:61: warning: implicit declaration of function `random'
  7. ../main.c:61: warning: nested extern declaration of `random'
  8. ../main.c:70: warning: nested extern declaration of `random'
  9. ../main.c:61: warning: redundant redeclaration of 'random'
  10. ../main.c:61: warning: previous implicit declaration of 'random' was here

 
 
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 :
  1. ../main.c:49: warning: 'argc' might be used uninitialized in this function
  2. ../main.c:50: warning: 'argv' might be used uninitialized in this function


 
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)


Message édité par Elmoricq le 08-06-2005 à 11:48:55
n°1112421
chrisbk
-
Posté le 08-06-2005 à 11:50:03  profilanswer
 

(Saviez vous que le C est un langage de satan ?)
 

n°1112429
shikra
life is short,drink faster!!!
Posté le 08-06-2005 à 11:52:32  profilanswer
 

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[:aaah]
 
[:azka]

n°1112439
shikra
life is short,drink faster!!!
Posté le 08-06-2005 à 11:55:27  profilanswer
 

euh la g reposter le meme message g sait pas pourquoi dsl

n°1112455
Emmanuel D​elahaye
C is a sharp tool
Posté le 08-06-2005 à 12:00:26  profilanswer
 

shikra a écrit :

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


Compare avec le code que j'ai donné. Les problèmes sont corrigés...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1112465
shikra
life is short,drink faster!!!
Posté le 08-06-2005 à 12:04:42  profilanswer
 

oui merci emmanuel ca fonctionne maintenant!!
merci a tous en tout cas de votre aide rapide et efficace![:and garfunkel]
 
ji vais a plus   [:ato76]

n°1171252
Profil sup​primé
Posté le 06-08-2005 à 11:47:57  answer
 

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;
}

n°1171253
mcjoedassi​n
Posté le 06-08-2005 à 11:56:17  profilanswer
 

ca marche tres bien pour moi
donne un exemple d'une utilisation foireuse ?

n°1171257
Profil sup​primé
Posté le 06-08-2005 à 12:05:55  answer
 

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;
}
 

n°1171259
mcjoedassi​n
Posté le 06-08-2005 à 12:11:10  profilanswer
 

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

n°1171261
Profil sup​primé
Posté le 06-08-2005 à 12:16:24  answer
 

mcjoedassin a écrit :

ca marche tres bien pour moi
donne un exemple d'une utilisation foireuse ?


 
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?

n°1171264
Profil sup​primé
Posté le 06-08-2005 à 12:23:37  answer
 

mcjoedassin a écrit :

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


 
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.

n°1171266
mcjoedassi​n
Posté le 06-08-2005 à 12:26:35  profilanswer
 

lol
démerde toi :D

n°1171358
theshockwa​ve
I work at a firm named Koslow
Posté le 06-08-2005 à 19:35:18  profilanswer
 

(re)lis la charte ...


Message édité par theshockwave le 06-08-2005 à 19:35:35
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  erreur de segmentation

 

Sujets relatifs
Erreur sous postgres "TABLE not found"erreur de segmentation pourtant simple
problème d'erreur de segmentationErreur de segmentation
Erreur de segmentation - appel strsepErreur de segmentation :/
erreur de segmentationErreur de Segmentation
Erreur de segmentation suite au passage à SuSE 8.1question en c: (random et erreur de segmentation).. aidez moi :-)
Plus de sujets relatifs à : erreur de segmentation


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR