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 :

Initialisation dans une fonction d'une matrice de pointeur


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 42
    Points : 38
    Points
    38
    Par défaut Initialisation dans une fonction d'une matrice de pointeur
    Bonjour,

    D'habitude, je galère déjà avec les tableaux de pointeurs, alors maintenant que j'utilise une matrice de pointeurs, je patauge totalement :s

    J'essaie de créer une matrice possédant 5 colonnes et dont le nombre de ligne augmente quand le besoin se fait sentir. Voici ce que cela donne en 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
    28
     
    void add_line(uint *numLine, TTrio **h_InputKey, const uint limit){
    	(*numLine)++;
    	h_InputKey = (TTrio **)realloc(h_InputKey, *numLine * sizeof(TTrio*));
    	h_InputKey[(*numLine)-1] = (TTrio *) malloc (limit*sizeof(TTrio));
     
    }
     
    int main(int argc, char** argv){
     
            TTrio **h_InputKey;
            const uint arrayLength = argc > 1 ? atoi(argv[1]) : 1048576 ;
            const uint limit = argc > 2 ? atoi(argv[2]) : 5;
            uint numLine = 0;
     
    	for(uint i  = 0; i<arrayLength;i++){
    		if(i%limit == 0)
    		  add_line(&numLine, h_InputKey,limit);
    		h_InputKey[i/limit][i%limit].idx = i;
    		h_InputKey[i/limit][i%limit].val = i;
    		printf("TTrio CPU [%d][%d] : idx : %8x val : %8x \n", i/limit, i%limit, h_InputKey[i/limit][i%limit].idx, h_InputKey[i/limit][i%limit].val);
    	}
     
    	for(uint i = 0; i < numLine; i++){
    		free(h_InputKey[i]);
    	}
    	free(h_InputKey);
    }
    Lorsque j'exécute le code, j'ai droit à un segmentation fault (core dumped). Apparemment, je gère mal un élément de la mémoire :s Quelqu'un pourrait-il m'aider svp ?

    Merci !!

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Points : 705
    Points
    705
    Par défaut
    Bonjour,

    Comme tu modifies ton pointeur 'h_InputKey' dans ta fonction tu dois passer un pointeur vers cette variable, comme pour 'numLine'... Soit :

    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
     
    void add_line (uint *numLine, TTrio ***ph_InputKey, const uint limit){
       (*numLine)++;
       *ph_InputKey = (TTrio **)realloc(*ph_InputKey, *numLine * sizeof(TTrio*));
       (*ph_InputKey)[(*numLine)-1] = (TTrio *) malloc (limit*sizeof(TTrio));
    }
     
    int main(int argc, char** argv){
       TTrio **h_InputKey;
       // [...]
       for(uint i  = 0; i<arrayLength;i++){
          if(i%limit == 0) {
             add_line(&numLine, &h_InputKey,limit);
          }
          // [...]
       }   
       // [...]
    }

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Et de plus ne pas oublier d'initialiser h_InputKey ; c'est indispensable dans ce cas (à cause du realloc dans la fonction) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int main(int argc, char** argv){
       TTrio **h_InputKey = NULL;

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 42
    Points : 38
    Points
    38
    Par défaut
    Merci beaucoup pour vos réponses, cela fonctionne quand je combine les deux réponses ^^

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

Discussions similaires

  1. ArrayList initialisation dans les paramètres d'une fonction
    Par Mageni dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 15/02/2010, 11h54
  2. Réponses: 2
    Dernier message: 17/04/2007, 18h14
  3. Réponses: 3
    Dernier message: 29/04/2006, 14h02
  4. Réponses: 3
    Dernier message: 16/01/2006, 17h02
  5. Réponses: 4
    Dernier message: 17/03/2004, 18h24

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