Partage
  • Partager sur Facebook
  • Partager sur Twitter

Segmentation fault au niveau de l'exécution

    23 juin 2018 à 15:34:21

    Ce programme permet de stocker N (N<=10000) valeurs {nom(key),telephone(value)} tapées par l'utilisateur dans une structure dictionnaire que j'ai nommé Key_Value, le nombre N est le premier nombre dans l'input après l'utilisateur tape des noms et on teste si ils existent ou pas dans le dictionnaire .

    J'ai pas de problème au niveau de la compilation mais au niveau de l'execution on m'affiche l'erreur segmentation fault.

    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #include <stdlib.h>
    
    typedef struct Key_Value
    {
        long value;
        char key[10001];
    }Key_Value;
    
    
    void recherche(Key_Value tab[],char Value[10001],long N)
    {
        int i,true;
        true=1;
        for (i=0;i<N;i++)
        {
            if(strcmp(Value,(tab[i].key))==0)
            {   
                printf("%s=%ld\n",tab[i].key,tab[i].value);            
                true=0;
                break;
            }
        }
        if (true==1)
            printf("Not found\n");
    }
    
    
    int main() {
        int i;
        long N;
        scanf("%ld",&N);
        Key_Value tab[N+1];
        for(i=0;i<N;i++)
        {
            scanf("%s",tab[i].key);
            scanf("%ld",&tab[i].value);
        }
        char querry[10001];
        while(!feof(stdin))
        {
            scanf("%s",querry);
            recherche(tab,querry,N);
        }
        return 0;
        
    }

    Est-ce que quelqu'un peut m'aider à détecter la source d'erreur.

    • Partager sur Facebook
    • Partager sur Twitter
      23 juin 2018 à 16:00:35

      Utilises malloc() sur tab.
      • Partager sur Facebook
      • Partager sur Twitter
        23 juin 2018 à 17:02:07

        j'ai utilisé malloc et j'ai toujours le meme probleme de segmentation
        #include <stdio.h>
        #include <string.h>
        #include <math.h>
        #include <stdlib.h>
        
        typedef struct Key_Value
        {
        	long value;
        	char key[10001];
        }Key_Value;
        
        
        void recherche(Key_Value* tab, char Value[10001], long N)
        {
        	int i, t;
        	t = 1;
        	for (i = 0; i<N; i++)
        	{
        		if (strcmp(Value, (tab[i].key)) == 0)
        		{
        			printf("%s=%ld\n", tab[i].key, tab[i].value);
        			t = 0;
        			break;
        		}
        	}
        	if (t == 1)
        		printf("Not found\n");
        }
        
        
        int main() {
        	long i;
        	long N;
        	scanf("%ld", &N);
        	Key_Value* tab;
        	tab = (Key_Value*)malloc(N * sizeof(Key_Value));
        	for (i = 0; i<N; i++)
        	{
        		scanf("%s", tab[i].key);
        		scanf("%ld", &tab[i].value);
        	}
        	char querry[10001];
        	while (!feof(stdin))
        	{
        		scanf("%s", querry);
        		recherche(tab, querry, N);
        	}
        	return 0;
        
        }
        je rencontre ce probleme à l'execution à chaque fois que le N=100000 mais pour les valeurs petites je ne rencontre pas ce problème et le programme fonctionne correctement.
        • Partager sur Facebook
        • Partager sur Twitter
          23 juin 2018 à 23:03:30

          F.B a écrit:

          J'ai pas de problème au niveau de la compilation mais au niveau de l'execution on m'affiche l'erreur segmentation fault.

          Oui, c'est ce qu'on appelle un bug. ;-)

          Vérifies que malloc ne retourne pas NULL.

          • Partager sur Facebook
          • Partager sur Twitter
            24 juin 2018 à 0:02:32

            Tu saisies bien une valeur numérique pour ton premier scanf (pour N) ?
            • Partager sur Facebook
            • Partager sur Twitter
              24 juin 2018 à 5:30:48

              À tout hasard, « &tab[i].value » (ligne 40) signifie-t-il « (&tab[i]).value » ou « &(tab[i].value) » ? (Je ne sais jamais, alors c'est peut-être une erreur... ou pas.)

              -
              Edité par robun 24 juin 2018 à 5:31:19

              • Partager sur Facebook
              • Partager sur Twitter
                24 juin 2018 à 10:27:57

                robun a écrit:

                À tout hasard, « &tab[i].value » (ligne 40) signifie-t-il « (&tab[i]).value » ou « &(tab[i].value) » ? (Je ne sais jamais, alors c'est peut-être une erreur... ou pas.)

                (&tab[i]).value  ne compile pas ! son code est syntaxiquement correct.



                • Partager sur Facebook
                • Partager sur Twitter
                  24 juin 2018 à 11:22:12

                  Salut ! J'ai testé ton code et je vois pas de problème pour des petits nombres (j'ai quand meme changé 2-3 trucs)

                  Pas la peine d'utiliser des long pour N et i vu que tu monte que jusqu'à 10000 valeurs. D'ailleurs comment tu fais pour rentrer au clavier 10 000 valeurs * 2 ca doit te prendre un temps monstre !!

                  Après je pense que tu peux meme simplifier ton code en utilisant une allocation dynamique pour pas avoir à connaître dès le départ ton nombre de valeurs {nom(key),telephone(value)}

                  Si t'utilise un malloc, faut pas que t'oublie de faire son free aussi :D et dernière question, ta clef a besoin d'être aussi grande ? (10000 caractères, ca fait beaucoup je trouve(mon opinion personnelle), mais c'est toi qui juges)

                  #include <stdio.h>
                  #include <string.h>
                  #include <math.h>
                  #include <stdlib.h>
                  #include <crtdbg.h>
                   
                  typedef struct Key_Value
                  {
                      long value;
                      char key[10001];
                  }Key_Value;
                   
                   
                  void recherche(Key_Value* tab, char Value[10001], long N)
                  {
                    int i, t;
                    t = 1;
                    for (i = 0; i<N; i++)
                    {
                      if (strcmp(Value, (tab[i].key)) == 0)
                      {
                        printf("%s=%ld\n", tab[i].key, tab[i].value);
                        t = 0;
                        break;
                      }
                    }
                    if (t == 1)
                      printf("Not found\n");
                  }
                   
                   
                  int main() {
                    int i;
                    int N;
                  	char querry[10001];
                  	printf("N?\n");
                    scanf("%ld", &N);
                  
                    Key_Value * tab;
                  
                    tab = (Key_Value*)malloc(N * sizeof(Key_Value));
                  
                    for (i = 0; i<N; i++)
                    {
                      scanf("%s", tab[i].key);
                      scanf("%ld", &tab[i].value);
                    }
                  
                    
                  
                    while (!feof(stdin))
                    {
                  		printf("Clef?\n");
                      scanf("%s", querry);
                      recherche(tab, querry, N);
                    }
                  
                  	free(tab);
                  	printf("Memory leaks : %s\n",_CrtDumpMemoryLeaks()?"YES":"NO");
                    return 0;
                  }



                  • Partager sur Facebook
                  • Partager sur Twitter
                  salut
                    27 juin 2018 à 12:17:46

                    le nombre max 10000 est imposé par l'énoncé du problème que j'essaie de résoudre et puis c'est le site qui a testé avec 10000 valeurs donc j'ai eu l'erreur segmentation fault.

                    Et merci beaucoup pour toutes vos réponses.

                    J'ai une autre question lorsque je mets "tab" comme paramètres de la fonction recherche est-ce que le programme utilise du 'Stack memory' ou du 'heap memory' ??

                    parce que j'ai lu qu'on ne peut pas utiliser beaucoup de stack memory sinon on aura une erreur. Donc je pense que peut être c'est la source du problème lorsque on entre 10000 valeurs 

                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 juin 2018 à 13:11:21

                      10000 éléments de 10000 octets, ça fait 100 Mo. Ça ne tient clairement pas dans la pile. Et sur un système très sévèrement limité en mémoire, ça ne tient pas non plus sur le tas.
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Segmentation fault au niveau de l'exécution

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown