[C] pb de pointeur

pb de pointeur [C] - C - Programmation

Marsh Posté le 28-07-2003 à 15:51:44    

Encore un petit problème bête.
J'ai
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int
  4. main (void)
  5. {
  6.   int i;
  7.   char **buf;
  8.   buf = malloc(4096 * 256);
  9.   for(i=0;i<100;i++)
  10.     {
  11.       strcpy(*buf++, "plop" );
  12.     }
  13.   free(buf);
  14.   return 0;
  15. }

 
Forcément ça segfault. J'utilise un pointeur car dans mon programme je ne connais pas le nombre de ligne à copier dans une variable alors je pensais faire des realloc au fur et à mesure mais c'est très moche et très lent.

Reply

Marsh Posté le 28-07-2003 à 15:51:44   

Reply

Marsh Posté le 28-07-2003 à 15:56:21    

ben il te faut donc un "tableau" de chaine de caractères, sinon pour utiliser ta méthode en un seul malloc, il faut se livrer à une sacré arithmétique, par pratique pour manipuler des lignes.
 
donc faut faire en 2 passes
 
1) allocation d'un "tableau" de char*
2) pour chaque élément, allocation d'un "tableau" de char
 
3) pour chaque élément, désallocation
4) désallocation

Reply

Marsh Posté le 28-07-2003 à 15:56:30    

deviant a écrit :

Encore un petit problème bête.
J'ai
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int
  4. main (void)
  5. {
  6.   int i;
  7.   char **buf;
  8.   buf = malloc(4096 * 256);
  9.   for(i=0;i<100;i++)
  10.     {
  11.       strcpy(*buf++, "plop" );
  12.     }
  13.   free(buf);
  14.   return 0;
  15. }

 
Forcément ça segfault. J'utilise un pointeur car dans mon programme je ne connais pas le nombre de ligne à copier dans une variable alors je pensais faire des realloc au fur et à mesure mais c'est très moche et très lent.


 
 :ouch:  
 
Sportnawak.
 
Tu devrais revoir les bases sur les pointerus et les tableaux, et même si t'as le courage pousser jusqu'au tableau de pointeurs.


---------------
Le Tyran
Reply

Marsh Posté le 28-07-2003 à 16:13:27    

Tableau de pointeur, je connais (enfin je pense)
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int
  4. main (void)
  5. {
  6.   int i;
  7.   char buf[100];
  8.   char *buf_ptr;
  9.   buf_ptr = buf;
  10.  
  11.   for(i=0;i<100;i++)
  12.     {
  13.         *buf_ptr++ = 'c';
  14.     }
  15.   *buf_ptr = '\0';
  16.   printf("%s\n", buf);
  17.  
  18.   return 0;
  19. }

 
Par contre un tableau de pointeurs, j'ai oublié.
C'est con car je l'avais fait il y a longtemps.

Reply

Marsh Posté le 28-07-2003 à 17:42:25    

t'as jamais du etre au point si tu veux mon avis
 

Code :
  1. char **tab=malloc(42*sizeof(char*)); // un tableau de 42 char*
  2. tab[0]=malloc(100); // tab[0] est un tableau de 100 char
  3. // et ainsi de suite pour chaque tab. pa smoyen de tout faire d'un coup

Reply

Marsh Posté le 28-07-2003 à 18:27:20    

C'est fort possible, enfin merci pour ta réponse.

Reply

Marsh Posté le 28-07-2003 à 18:37:10    

Code :
  1. int** construitMatrice(int li, int co)
  2.     {
  3.     int **m = (int**) malloc(li * sizeof(int*)) ;
  4.     if (!m)
  5.         return NULL ;
  6.     for (int i=0 ; i<li ; i++)
  7.         {
  8.         m[i] = (int*) malloc(co * sizeof(int)) ;
  9.         if (!m[i])
  10.             {
  11.             i-- ;    // un retour en arrière
  12.             while (i >= 0)
  13.                 free(m[i--]) ;
  14.             free(m) ;
  15.             return NULL ;
  16.             }
  17.         }
  18.     for (int i=0 ; i<li ; i++)
  19.         for (int j=0 ; j<co ; j++)
  20.              m[i][j] = 0 ;   
  21.     return m ;
  22.     }


 
Voilà. ensuite tu lui passe un int**  à ta fonction.
 

Code :
  1. int **m ;
  2. m = construitMatrice(50, 800) ;
  3. if (m)
  4.    ...


 
Tu peux bien sûr remplacer int** par char** ou n'importe quoi d'autre


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 28-07-2003 à 18:37:49    

pour libérer la matrice
 

Code :
  1. void libereMatrice(int **m, int li)
  2.     {
  3.     for (int i=0 ; i<li ; i++)
  4.         free(m[i]) ;
  5.     free(m) ;
  6.     }


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 28-07-2003 à 18:40:50    

c'est bien. tu peux utiliser calloc si tu veux eviter la phase de maz de la matrice

Reply

Marsh Posté le 28-07-2003 à 18:44:48    

j'ai jamais utilisé calloc. C'est "phase de maz" ?


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 28-07-2003 à 18:44:48   

Reply

Marsh Posté le 28-07-2003 à 18:48:51    

mise à zéro. calloc fait pareil que malloc, son prototype diffère un poil et il te garantit que la zone allouée est remplie de 0 binaire (donc ça convient pas pour tout, l'exemple qu'on prends toujours, c'est les flottants pour lesquels 0x00000000 l'est pas une valeur acceptable

Reply

Marsh Posté le 28-07-2003 à 18:53:30    

Je vois merci  ;)


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 29-07-2003 à 16:09:55    

Finalement j'ai utilisé une liste chainée et ça marche très bien.
Merci de votre aide !

Reply

Sujets relatifs:

Leave a Replay

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