Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1213 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] pb de pointeur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] pb de pointeur

n°469937
deviant
Posté le 28-07-2003 à 15:51:44  profilanswer
 

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.

mood
Publicité
Posté le 28-07-2003 à 15:51:44  profilanswer
 

n°469942
Taz
bisounours-codeur
Posté le 28-07-2003 à 15:56:21  profilanswer
 

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

n°469943
LetoII
Le dormeur doit se réveiller
Posté le 28-07-2003 à 15:56:30  profilanswer
 

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
n°469958
deviant
Posté le 28-07-2003 à 16:13:27  profilanswer
 

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.

n°470054
Taz
bisounours-codeur
Posté le 28-07-2003 à 17:42:25  profilanswer
 

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

n°470124
deviant
Posté le 28-07-2003 à 18:27:20  profilanswer
 

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

n°470134
jagstang
Pa Capona ಠ_ಠ
Posté le 28-07-2003 à 18:37:10  profilanswer
 

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?  
n°470136
jagstang
Pa Capona ಠ_ಠ
Posté le 28-07-2003 à 18:37:49  profilanswer
 

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?  
n°470137
Taz
bisounours-codeur
Posté le 28-07-2003 à 18:40:50  profilanswer
 

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

n°470141
jagstang
Pa Capona ಠ_ಠ
Posté le 28-07-2003 à 18:44:48  profilanswer
 

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?  
mood
Publicité
Posté le 28-07-2003 à 18:44:48  profilanswer
 

n°470142
Taz
bisounours-codeur
Posté le 28-07-2003 à 18:48:51  profilanswer
 

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

n°470149
jagstang
Pa Capona ಠ_ಠ
Posté le 28-07-2003 à 18:53:30  profilanswer
 

Je vois merci  ;)


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°471133
deviant
Posté le 29-07-2003 à 16:09:55  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] pb de pointeur

 

Sujets relatifs
Comment on repositionne le pointeur au debut d'une ligne dans un txt?question de newbie sur les pointeur de fonction
Commet savoir si le pointeur de fichier se trouve sur une ligne vide ?probleme pour comparer le contenu d'un pointeur et un valeur!!
question sur le passage d'un pointeur en paramètreun ptit truc tout con mais qui plante, pourquoi ?(pointeur)
strstr donne un pointeur, mais j'aimerai un(e) string =)[C++] Vous utilisez des handles à la place de pointeur?
MFC pointeur sur CDocument[c++] effacer un tableau de pointeur
Plus de sujets relatifs à : [C] pb de pointeur


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR