IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Instanciation d'une carte de hachage en C


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Developer
    Inscrit en
    Janvier 2023
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Developer
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2023
    Messages : 15
    Points : 23
    Points
    23
    Par défaut Instanciation d'une carte de hachage en C
    J'essaie d'instancier une carte de hachage en c,

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    //hash Struct
    typedef struct hashMap{
      int** Map;
      int val;
    } hashMap;
    typedef hashMap* mapPtr;
     
     
    // Function to create a hashMap object pointer
    void createHash(mapPtr aHash){
      // Create a hash object
      if(!aHash){
        aHash = calloc(1, sizeof(hashMap));
        int size = (int) pow(10,9);
        // Allocate Memory for 2d array
        aHash->Map = calloc(2, sizeof(int*));
        // Allocate internal memory for the array -> 10^9 blocks
        for(int i = 2; i < 2; i++){
          aHash->Map[i] = calloc(size, sizeof(int));
        }
        for(int i = 0; i < size; i++){
          aHash->Map[0][i] = -1;
          aHash->Map[1][i] = -1;
        }
        // memset(aHash->Map[0], -1, size*sizeof(int));
      }
    }
    mais je reçois toujours une erreur de segmentation, indiquant que j'essaie d'accéder à la mémoire en dehors du tampon.

    Je sais que la méthode memset of ou for loop fonctionnerait, mais aucune ne semble fonctionner.

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Les 2 milliards d'int ne sont jamais alloués. Ligne 18, en partant de 2 on n'est jamais strictement inférieur à 2.

    Est-ce que (int)pow(10,9) vaut 1 milliard? Il faut toujours se méfier des casts, plus simplement size_t size = 1000000000; vaut un milliard.
    As-tu vraiment besoin de 2 milliards d'int ?

    D'autre part, tu ne pourras pas faire le remplissage avec un unique memset(). Il existe plusieurs sortes de tableaux 2D, par exemple int** Map ou int Map[2][1000000000], les 2 gèrent des tableaux 2D mais n'ont pas la même structure. Le second peut être initialisé par memset( aHash->Map, -1, 2*1000000000*sizeof(int) ), mais pas le premier.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par jesse100 Voir le message
    typedef hashMap* mapPtr
    On ne cache jamais une étoile derrière un nom de type, c'est le meilleur moyen de se planter. Et effectivement tu te plantes d'ailleurs immédiatement deux lignes plus bas car ta fonction reçoit un mapPtr aHash (donc un hashMap* aHash) et va modifier aHash (donc variable locale à la fonction). Au final, t'as alloué une zone et stockée ça dans un pointeur perdu en fin de fonction.

    Citation Envoyé par jesse100 Voir le message
    Je sais que la méthode memset of ou for loop fonctionnerait, mais aucune ne semble fonctionner.
    Donc ça fonctionnerait mais ça ne fonctionne pas. Ben oui, les fonctions ne fonctionnent que quand elles sont utilisées correctement.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Installation d'une carte réseau
    Par sekiryou dans le forum Matériel
    Réponses: 7
    Dernier message: 11/10/2004, 01h42
  2. Problème avec une carte Sound Blaster Live
    Par zogstrip dans le forum Matériel
    Réponses: 4
    Dernier message: 25/09/2004, 20h43
  3. Problème d'installation de driver pour une carte réseaux
    Par black is beautiful dans le forum Matériel
    Réponses: 3
    Dernier message: 19/07/2004, 21h33
  4. Capture video depuis une carte DC30+
    Par Ertai dans le forum MFC
    Réponses: 2
    Dernier message: 19/02/2004, 15h19
  5. Accès au port 700h pour une carte d'interface
    Par haypo dans le forum Matériel
    Réponses: 3
    Dernier message: 07/11/2002, 11h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo