erreur de segmentation

erreur de segmentation - C - Programmation

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 :??:    :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. }

Reply

Marsh Posté le 08-06-2005 à 08:01:48   

Reply

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


---------------
Posté depuis des chiottes, sales. Me gusta.
Reply

Marsh Posté le 08-06-2005 à 08:40:03    

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/
Reply

Marsh Posté le 08-06-2005 à 08:42:33    

ah oué, quand meme [:petrus75]

Reply

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

Reply

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

Reply

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 ?

Reply

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! :pfff:

Reply

Marsh Posté le 08-06-2005 à 10:57:36    

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
Reply

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.

Reply

Marsh Posté le 08-06-2005 à 11:01:23   

Reply

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

Reply

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 :
  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
Reply

Marsh Posté le 08-06-2005 à 11:50:03    

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

Reply

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

Reply

Marsh Posté le 08-06-2005 à 11:55:27    

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

Reply

Marsh Posté le 08-06-2005 à 12:00:26    

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/
Reply

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![:and garfunkel]
 
ji vais a plus   [:ato76]

Reply

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

Reply

Marsh Posté le 06-08-2005 à 11:56:17    

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

Reply

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

Reply

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

Reply

Marsh Posté le 06-08-2005 à 12:16:24    

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?

Reply

Marsh Posté le 06-08-2005 à 12:23:37    

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.

Reply

Marsh Posté le 06-08-2005 à 12:26:35    

lol
démerde toi :D

Reply

Marsh Posté le 06-08-2005 à 19:35:18    

(re)lis la charte ...


Message édité par theshockwave le 06-08-2005 à 19:35:35
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed