erreur de segmentation
Répondre à la discussion
Affichage des résultats 1 à 17 sur 17

erreur de segmentation



  1. #1
    invite75c2964e

    erreur de segmentation


    ------

    Bonsoir à tous,

    dans le code suivant j'essaye de trouvé les élément manquants dans un tableau en utilisant hash table, mais quand j'execute mon code ça affiche une erreur de segmentation (ligne d'erreur : hash[arr[i]]++),est ce Que vous pouvez m(aider a corriger cette erreur.

    Code:
    #include<stdio.h>
    int max_element(int arr[], int n )
    {
        int max=0;
        for(int i=0;i<n;i++)
            if(max<arr[i])
                max=arr[i];
        return max;
    }
    void missing_element_hash(int arr[], int n )
    {
        int hash_size = max_element(arr,n);
        int hash[]={0};
        for(int i=0;i<n;i++)
                hash[arr[i]]++;
        for (int i=1;i<hash_size;i++)
            if(hash[i]==0)
                printf("missing element is %d\n",i);
    }
    
    int main()
    {
        int arr1[] = {1,4,5,6,8,9,10};
        int n1 = sizeof(arr1)/sizeof(arr1[0]);
        missing_element_hash(arr1,n1);
        return 0;
    }

    -----

  2. #2
    pm42

    Re : erreur de segmentation

    Tu as écrit : int hash[]={0};

    Donc hash est un tableau à 1 élément. Puis tu essaies d'accéder à ses indices contenu dans arr donc 1, 4, etc. Aucun n'est valide.

  3. #3
    invite75c2964e

    Re : erreur de segmentation

    int hash[] = {0}; initialise les element de hash à 0, sa taille est le plus grand nombre contenu dans arr,donc hash est un tableau de 10 elements.

  4. #4
    pm42

    Re : erreur de segmentation

    Citation Envoyé par Leond95 Voir le message
    int hash[] = {0}; initialise les element de hash à 0, sa taille est le plus grand nombre contenu dans arr,donc hash est un tableau de 10 elements.
    C'est bien de poser une question parce qu'on n'arrive pas à faire quelque chose puis d'expliquer à celui qui vous a répondu pour dire un truc massivement faux.

    On se demande comment int hash[] = {0} pourrait donner un tableau de la taille du plus grand élément de arr, hash_size sans jamais y faire référence.

  5. A voir en vidéo sur Futura
  6. #5
    invite7a0a8d2e

    Re : erreur de segmentation

    Citation Envoyé par Leond95 Voir le message
    sa taille est le plus grand nombre contenu dans arr,donc hash est un tableau de 10 elements.
    C'est vous qui avez décidé que sa taille devra être, effectivement, le plus grand nombre contenu dans arr.
    Mais hash_size n'est qu'une variable comme tant d'autres, qui ne présente en soi aucun lien avec l'autre variable hash.
    Ce n'est pas parce-qu'on a ajouté "_size" à "hash" que ça signifie quoi que ce soit.
    Vous auriez pu nommer "hash_size" autrement comme par exemple "toto", ça aurait fait très exactement la même chose.

  7. #6
    Jack
    Modérateur

    Re : erreur de segmentation

    En gros, ce que tout le monde essaie de te faire comprendre, c'est qu'avec
    Code:
    int hash[hash_size] = {0};
    ça aurait des chances de mieux fonctionner.

  8. #7
    pm42

    Re : erreur de segmentation

    Citation Envoyé par Jack Voir le message
    En gros, ce que tout le monde essaie de te faire comprendre, c'est qu'avec
    Code:
    int hash[hash_size] = {0};
    ça aurait des chances de mieux fonctionner.
    Ou plus exactement une variante parce que là, on essaie de mettre un tableau de taille 1 dans un tableau de taille hash_size et le compilo n'est pas content. En tout cas, le gcc que j'utilise.

    Je donnerais bien le code correct mais vu que le primo-posteur semble connaitre le C mieux que moi, j'ai peur de faire une erreur Et puis cela dépend de la norme, de l'utilisation ou non d'extension gnu, etc même s'il y a des solutions 100% portables.

  9. #8
    Jack
    Modérateur

    Re : erreur de segmentation

    Citation Envoyé par pm42 Voir le message
    Ou plus exactement une variante parce que là, on essaie de mettre un tableau de taille 1 dans un tableau de taille hash_size
    Où vois-tu un tableau de taille 1?

  10. #9
    pm42

    Re : erreur de segmentation

    Citation Envoyé par Jack Voir le message
    Où vois-tu un tableau de taille 1?
    {0} est un tableau de taille 1.
    Ceci dit, l'erreur exacte que j'ai est différente : c'est un message sur le tableau de taille variable qui ne peut pas être initialisé de cette façon.
    Si je met hash de taille fixe par contre, cela fonctionne mais seul son 1er élément est initialisé.

    Donc idéalement, il faudrait faire :
    Code:
    int hash[hash_size];
    puis l'initialiser avec un memset ou une boucle.

    Après, on tombe sur le problème que les tableaux de taille variable sont supportés en C99 mais optionnel en C11, détestés par Linus Thorvald mais pour du code système, etc.

  11. #10
    Jack
    Modérateur

    Re : erreur de segmentation

    Citation Envoyé par pm42 Voir le message
    {0} est un tableau de taille 1.
    Non, c'est la syntaxe permettant d'initialiser tout le tableau à 0.

    Ceci dit, l'erreur exacte que j'ai est différente : c'est un message sur le tableau de taille variable qui ne peut pas être initialisé de cette façon.
    en effet, les VLA ne sont pas forcément gérés de base par les compilateurs C. Je me demande même s'ils ne sont pas susceptibles de disparaitre à terme (à vérifier).
    Dernière modification par Jack ; 12/02/2021 à 10h25.

  12. #11
    pm42

    Re : erreur de segmentation

    Citation Envoyé par Jack Voir le message
    Non, c'est la syntaxe permettant d'initialiser tout le tableau à 0.
    Cela marche peut-être mais je veux bien la référence.
    Parce que si j'écris :
    Code:
    #include<stdio.h>
    
    #define S 10
    
    int main()
    {
        int foo[S] = { 42 };
        for(int i = 0; i<S; i++) printf("%d\n", foo[i]);
    }
    cela m'affiche un 42 et 9 zéros (clang sur Mac et gcc 7.5 sur Linux).
    De ce que je lis, un tableau d'int va être initialisé à 0 s'il est global ou static dans une fonction mais pas autrement.
    De plus, on ne peut pas initialiser un VLA de cette façon (là encore, sur les compilos cités).

  13. #12
    invite7a0a8d2e

    Re : erreur de segmentation

    Citation Envoyé par Jack Voir le message
    en effet, les VLA ne sont pas forcément gérés de base par les compilateurs C. Je me demande même s'ils ne sont pas susceptibles de disparaitre à terme (à vérifier).
    VLA le vilain !
    Very Large Array ?
    Bon j'ai trouvé : Variable Length Array
    Citation Envoyé par WIkipedia
    In computer programming, a variable-length array (VLA), also called variable-sized or runtime-sized, is an array data structure whose length is determined at run time (instead of at compile time).[1] In C, the VLA is said to have a variably modified type that depends on a value (see Dependent type).
    https://en.wikipedia.org/wiki/Variable-length_array

  14. #13
    Jack
    Modérateur

    Re : erreur de segmentation

    Citation Envoyé par pm42 Voir le message
    Cela marche peut-être mais je veux bien la référence.
    Parce que si j'écris :
    Code:
    #include<stdio.h>
    
    #define S 10
    
    int main()
    {
        int foo[S] = { 42 };
        for(int i = 0; i<S; i++) printf("%d\n", foo[i]);
    }
    cela m'affiche un 42 et 9 zéros (clang sur Mac et gcc 7.5 sur Linux).
    .
    Ca ne marche qu'avec 0.
    De plus, on ne peut pas initialiser un VLA de cette façon (là encore, sur les compilos cités)
    Avec les VLA, je ne sais pas. Je suis plutôt C++ et les VLA n'y existent pas. Du coup, je ne savais pas que ce n'était pas possible en C.

  15. #14
    Jack
    Modérateur

    Re : erreur de segmentation

    il n'y a d'ailleurs pas obligation de mettre le 0 entre accolades
    Code:
    #include<stdio.h>
    #define S 10
    
    int main(){
        int foo[S] = {};
        for(int i = 0; i<S; i++)
              printf("%d\n", foo[i]); 
    }
    va afficher dix 0
    Dernière modification par Jack ; 12/02/2021 à 10h55.

  16. #15
    pm42

    Re : erreur de segmentation

    Citation Envoyé par Jack Voir le message
    va afficher dix 0
    Oui, ça marche à cause de l'initialisation à 0 : https://en.cppreference.com/w/cpp/la...initialization

  17. #16
    Jack
    Modérateur

    Re : erreur de segmentation

    Faut juste faire gaffe avec la doc car les différences entre C et C++ peuvent être subtiles.

    Pour le C, pas mal d'info ici.
    Dernière modification par Jack ; 12/02/2021 à 11h41.

  18. #17
    pm42

    Re : erreur de segmentation

    Citation Envoyé par Jack Voir le message
    Faut juste faire gaffe avec la doc car les différences entre C et C++ peuvent être subtiles.
    Oui et pas mal de compilos C sont construits sur des compilos C++ et avec les différentes normes, c'est parfois difficile d'être sur.

    C'est aussi pour ça qu'en programmation pro, ceinture et bretelles, j'ai tendance à préférer les initialisations explicites tout le temps parce que cela rend le code plus immédiat à comprendre notamment par quelqu'un qui ne connaît par coeur les valeurs par défaut.
    Pour un entier, que ce soit 0 est logique. Mais est ce que le langage va mettre les booléens à false ou à true ?
    Est ce que cela dépend du compilo, de la norme ? Et si on programme dans différents langages ?

Discussions similaires

  1. erreur de segmentation
    Par cosmoff dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 17/01/2019, 22h23
  2. Fortran : erreur de segmentation.
    Par invite93ac6dc9 dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 18/12/2012, 09h48
  3. Erreur de segmentation (séries de Fourier)
    Par invitee495456e dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 03/12/2011, 08h47
  4. Erreur de segmentation sous fedora
    Par invite70eda27f dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 26/02/2008, 22h02
  5. c++:erreur de segmentation!
    Par invitef666d0fa dans le forum Logiciel - Software - Open Source
    Réponses: 6
    Dernier message: 06/12/2006, 19h36