Initialisation dans une fonction d'une matrice de pointeur

Initialisation dans une fonction d'une matrice de pointeur - C - Programmation

Marsh Posté le 30-05-2010 à 17:35:50    

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 :
  1. void add_line(uint *numLine, TTrio **h_InputKey, const uint limit){
  2.     (*numLine)++;
  3.     h_InputKey = (TTrio **)realloc(h_InputKey, *numLine * sizeof(TTrio*));
  4.     h_InputKey[(*numLine)-1] = (TTrio *) malloc (limit*sizeof(TTrio));
  5. }
  6. int main(int argc, char** argv){
  7.     TTrio **h_InputKey;
  8.     const uint arrayLength = argc > 1 ? atoi(argv[1]) : 1048576 ;
  9.     const uint limit = argc > 2 ? atoi(argv[2]) : 5;
  10.     uint numLine = 0;
  11.     for(uint i  = 0; i<arrayLength;i++){
  12.         if(i%limit == 0)
  13.         add_line(&numLine, h_InputKey,limit);
  14.         h_InputKey[i/limit][i%limit].idx = i;
  15.         h_InputKey[i/limit][i%limit].val = i;
  16.         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);
  17.     }
  18.     for(uint i = 0; i < numLine; i++){
  19.         free(h_InputKey[i]);
  20.     }
  21.     free(h_InputKey);
  22. }


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


Message édité par Shadew le 30-05-2010 à 17:37:54
Reply

Marsh Posté le 30-05-2010 à 17:35:50   

Reply

Marsh Posté le 30-05-2010 à 18:22:37    

2 problèmes
1) tu passes à ta fonction add_line la variable h_InputKey. Or cette fonction semble devoir modifier cette variable. T'as pas appris que quand une fonction doit modifier une variable il lui faut alors recevoir l'adresse de cette variable ?
 
2) tu utilises realloc sur h_inputKey. Or realloc ne fonctionne que s'il reçoit un pointeur correct, c.a.d soit à NULL (dans ce cas realloc fonctionne comme un malloc), soit déjà alloué via malloc ou realloc
Or h_inputKey n'ayant pas été initialisé, sa valeur est indéterminée.


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 30-05-2010 à 20:44:06    

Sve@r a écrit :

2 problèmes
1) tu passes à ta fonction add_line la variable h_InputKey. Or cette fonction semble devoir modifier cette variable. T'as pas appris que quand une fonction doit modifier une variable il lui faut alors recevoir l'adresse de cette variable ?
 
2) tu utilises realloc sur h_inputKey. Or realloc ne fonctionne que s'il reçoit un pointeur correct, c.a.d soit à NULL (dans ce cas realloc fonctionne comme un malloc), soit déjà alloué via malloc ou realloc
Or h_inputKey n'ayant pas été initialisé, sa valeur est indéterminée.


 
Merci pour ton aide, j'ai essayé ce que tu me proposes, mais ça ne change rien :s Voici le code mis à jour :

Code :
  1. void add_line(uint *numLine, TTrio ***h_InputKey, const uint limit){
  2.     (*numLine)++;
  3.     *h_InputKey = (TTrio **)realloc(*h_InputKey, *numLine * sizeof(TTrio*));
  4.     *h_InputKey[(*numLine)-1] = (TTrio *) malloc (limit*sizeof(TTrio));
  5. }
  6. int main(int argc, char** argv){
  7.     TTrio **h_InputKey = NULL;
  8.     const uint arrayLength = argc > 1 ? atoi(argv[1]) : 1048576 ;
  9.     const uint limit = argc > 2 ? atoi(argv[2]) : 5;
  10.     uint numLine = 0;
  11.     for(uint i  = 0; i<arrayLength;i++){
  12.         if(i%limit == 0)
  13.         add_line(&numLine, &h_InputKey,limit);
  14.         h_InputKey[i/limit][i%limit].idx = i;
  15.         h_InputKey[i/limit][i%limit].val = i;
  16.         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);
  17.     }
  18.     for(uint i = 0; i < numLine; i++){
  19.         free(h_InputKey[i]);
  20.     }
  21.     free(h_InputKey);
  22. }


 
Si je met la fonction dans ma boucle, ça fonctionne, mais comme la fonction est amenée à grandir, j'aimerais pouvoir l'utiliser et ne pas la mettre dans la boucle.  Je passerais mal le double pointeur ? Je n'arrive pas à trouver sur le net comment faire ce genre d'opération :s
 
EDIT : J'ai un peu debugger le programme, et je remarque qu'il plante à la ligne :
 
*h_InputKey[numLine-1] = (TTrio *) malloc (limit*sizeof(TTrio));
 
mais pas lors du premier passage, il remplit la première ligne, et lorsqu'il alloue la seconde ligne, il cale :s
 
Quand on y pense, realloc fonctionne comme un malloc si le premier argument est nul et réalloue de la mémoire si celui-ci est non nul. A mon avis, il y a un bug lors de la réallocation, mais je ne sais pas lequel :s


Message édité par Shadew le 30-05-2010 à 23:46:38
Reply

Marsh Posté le 31-05-2010 à 17:09:11    

Code :
  1. *h_InputKey[(*numLine)-1] = (TTrio *) malloc (limit*sizeof(TTrio));


 
Les [] ont priorités sur l'étoile (déréférencement). Ce que tu voulais écrire, c'est :
 

Code :
  1. (*h_InputKey)[(*numLine)-1] = (TTrio *) malloc (limit*sizeof(TTrio));


Reply

Marsh Posté le 31-05-2010 à 17:16:01    

Merci !!!! C'était ça !!!! Chaud comme problème, merci beaucoup !!

Reply

Marsh Posté le 31-05-2010 à 21:09:03    

Shadew a écrit :

Merci !!!! C'était ça !!!! Chaud comme problème, merci beaucoup !!


T'aurais créé une structure contenant
- la matrice
- sa taille
t'aurais eu moins de problème. Déjà tu passais à ta fonction une seule variable au lieu de deux et tu évitais ces triples indirections...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

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