Allocation matrice de char uniquement avec malloc

Résolu
glupidon -  
[Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

le sujet a était aborder au moins des centaine de fois et pourtant sa fonctionne toujours pas pour moi ...

j'aimerais savoir comment allouer dynamiquement un matrice (tableau 2 D) de char !
uniquement avec malloc !

voici un bout de code pour vous illustrer mon problème ( n'hésitez pas a me dire si certaine chose vous pique les yeux !

int     maloc_map(int fd, int cle)
{
  int   i;
  char  **map;
  char  *map2;

  **map = (char **)malloc(sizeof(char*) * 11);
  *map2 = (char *)malloc(sizeof(char) * 42 * 11);
  i = 0;
  while (i < 11)
    {
      i++;
      map[i] = &map2[i * 42];
    }
  make_map(map, cle, fd);
  return (0);
}

int     make_map(char **map, int cle, int fd)
{
  int   l;
  int   c;
  char  *str;

  l = 0;
  if ((str = malloc(sizeof(str))) == NULL)
    {
      my_putstr("error whith first malloc");
      return (0);
    }
  while (l < 11)
    {
      c= 0;
      if ((str = get_next_line(fd)) == NULL)
        {
          my_putstr("error whith str \n");
          return (0);
        }
      while (c < 42)
        {
          map[l][c] = str[c];
          c++;
        }
      l++;
    }
  brain(map, 0, 0, cle);
  return (0);
}


et voici le genre d'erreur que cela me génère


make_game.c: In function `maloc_map':
make_game.c:23:9: warning: assignment makes integer from pointer without a cast [enabled by default]
**map = (char **)malloc(sizeof(char*) * 11);
^
make_game.c:24:9: warning: assignment makes integer from pointer without a cast [enabled by default]
*map2 = (char *)malloc(sizeof(char) * 42 * 11);
^
make_game.c:23:4: warning: `map' is used uninitialized in this function [-Wuninitialized]
**map = (char **)malloc(sizeof(char*) * 11);
^
make_game.c:24:9: warning: `map2' is used uninitialized in this function [-Wuninitialized]
*map2 = (char *)malloc(sizeof(char) * 42 * 11);
^


merci de votre future aide en espérant avoir des réponses assez rapide si possible !

EDIT: Précision du langage dans la coloration syntaxique.

7 réponses

  1. sambia39 Messages postés 610 Date d'inscription   Statut Membre Dernière intervention   50
     
    Bonjour
    je n'ai pas lu en totalité ton code source précédent à savoir la création d'une matrice de caractère N*N car tu t'es écarté de ton objectif à la ligne 8. Je ne sais pas ce que tu as voulu à faire, mais voici un exemple d'allocation mémoire d'une matrice N*N (sans le contrôle d'allocation correcte ), son remplissage par le caractère A et la dé-allocation mémoire de celle-ci.
    à bientôt
    #include <stdio.h>
    #include <stdlib.h>
    
    #define _BUFF_ 5
    
    int main( void ){
    
     unsigned int i = 0;
     unsigned int j = 0;
    
     /* Allocation de la matrice */
     char **p_str = (char**)malloc( _BUFF_ * sizeof(char*) );
     for( i = 0; i< _BUFF_; i++ ){
      p_str[i] = (char*)malloc( _BUFF_ * sizeof(char) );
     }
    
     /* Remplissage de la matrice */
     for( i = 0; i <_BUFF_; i++){
      for( j = 0; j <_BUFF_; j++ ){
       p_str[i][j] = (char)( (33+i)+j );
      }
     }
    
     /* Affichage de la matrice */
     for( i = 0; i < _BUFF_; i++ ){
      printf("%3d|\t ", i );
      for( j = 0; j < _BUFF_; j++ ){
       printf("%c\t", p_str[i][j] );
      }
      printf("\n");
     }
    
     /* Free memoire */
     for( i = 0; i < _BUFF_; i++ ){
      free( p_str[i] );
      p_str[i] = NULL;
     }
     free( p_str );
     p_str = NULL;
    
     return( EXIT_SUCCESS );
    }
    

    Celui qui peut, agit. Celui qui ne peut pas, enseigne. Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien, et les philosophes, qui ne connaissent rien sur tout. G.B Shaw
    1
  2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Bonjour,

    **map = (char **)malloc(sizeof(char*) * 11);
    *map2 = (char *)malloc(sizeof(char) * 42 * 11);

    map n'est pas initialisé, tu ne peux donc pas pointer vers une valeur.
    Il faut plutôt faire : map=malloc(sizeof(char*) * 11);
    Note : le cast est superflu, voire même déconseillé.

    De même : map2=malloc(42*11);
    Note : j'ai retiré sizeof(char) car il vaut systématiquement 1. Mais tu peux le laisser sans souci.

    while (i < 11)
    {
    i++;
    map[i] = &map2[i * 42];
    }

    Dommage, tu fais i++; juste avant map[i]. Du coup, map[0] n'est pas initialisé. Il suffit de le mettre après.
    map[i] est un char. Donc tu peux pas mettre un char** dedans. Que souhaites-tu faire ici ?

    Cdlt,
    1
  3. glupidon
     
    merci pour la correction

    vraiment ?
    pourquoi sa ?
    0
    1. Utilisateur anonyme
       
      Prenons
      char *map2
      ça ressemble à une déclaration de pointeur en C ou C++.
      On n'utilise pas les pointeurs en c#, ça ne doit même pas exister.

      --
      0
      1. ElementW Messages postés 5690 Statut Contributeur 1 293 > Utilisateur anonyme
         
        ça ne doit même pas exister.
        Si, si, ça existe en C#, mais ça requiert de créer du code unsafe, et ça peut être "dangereux".
        0
    2. glupidon
       
      ha oui d'accord XD
      je voie ou est le problème ....
      il s'agit bien de C dans ce cas .

      je viens de comprendre que C et C# sont deux langage bien différent ...
      pour moi le c# n'était qu'une appellation pour langage c

      je te remercie de ton intervention
      je dormirais moins con ce soir XD

      du coup je fait comment pour bouger mon sujet de catégorie ?
      0
    3. glupidon
       
      merci bien !

      bon ba du coup mon problème reste le même mais en C ! ^^
      0
  4. glupidon
     
    Bonjour ,

    merci a tous pour vos réponses !
    je vais enfin pouvoir continué a avancer !

    fiddy ,
    je cherche a stocker dans chaque ligne de ma matrice
    une chaine de caractère qui changera durant le programme (a chaque ligne )
    cette chaine de caractère contiens uniquement des espace et des "|" d'où les char !

    je me demande si avec une tel matrice c'est envisageable ou non ?
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. sambia39 Messages postés 610 Date d'inscription   Statut Membre Dernière intervention   50
     
    Bonjour
    Dans mon ancien poste ligne 17 à 22 à ton avis qu'est ce que c'est ? aprés c'est à toi de l'adapté
    
     /* Remplissage de la matrice */
     for( i = 0; i <_BUFF_; i++){
      for( j = 0; j <_BUFF_; j++ ){
       p_str[i][j] = (char)( (33+i)+j );
      }
     }
    


    Celui qui peut, agit. Celui qui ne peut pas, enseigne. Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien, et les philosophes, qui ne connaissent rien sur tout. G.B Shaw
    0
  7. glupidon
     
    merci pour vos nombreuses aide !

    sa fonctionne enfin !

    passer une bonne journée !
    0
    1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      En C99, on peut faire comme cela :

      #include <stdio.h>
      #include <stdlib.h>
      
      int main(void)
      {
          size_t lignes = 20;                                                             
          size_t colonnes = 10;
      
          char (*map)[colonnes] = malloc(sizeof(char[lignes][colonnes]));
      
          map[15][5] = '|';
      
          free(map);
      
          return 0;
      }
      0
  8. Utilisateur anonyme
     
    Bonjour, je me suis permis de corriger ta coloration syntaxique en précisant que le langage est C# puisque c'est la catégorie que tu as choisie.
    Et c'est là que ça pique les yeux comme tu dis... Ça ne ressemble pas du tout à du c#....
    -1