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 :

allocation et pointeur sur pointeur


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 76
    Points : 64
    Points
    64
    Par défaut allocation et pointeur sur pointeur
    salut
    Voila, je me renseigne sur les pointeurs et ca rentre petit a petit mais la je suis vraiment bloque.
    L'allocation dynamique me pose probleme: tabMot.c:55: warning: assignment makes integer from pointer without a cast
    En fait j'essai de decouper ma chaine de caractere (ptr) et il faut que je renvoie un char**.
    Donc est t-il possible d'allouer a l'indice k et d'y stocker une chaine?
    Merci

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    #include <stdlib.h>
     
    char    *my_strcpy(char *dest, char *src)
    {
      int   i;
      int   size;
     
      size = 0;
      while (src[size] != '\0')
        size++;
      for (i = 0; i < (size + 1); i++)
        dest[i] = src[i];
     
      //return (dest);                                               \
                                                                      
    }
     
    int     nbrCaract(char *ptr, int i)
    {
      int   size;
     
      size = 0;
      while (ptr[i]  != ' ' || ptr[i] != '\t')
        size++;
      return (size);
    }
    char    **tabMot(char *ptr)
    {
      int   i;
      int   j;
      int   k;
      char  **tab;
      int taille;
     
      i = 0;
      j = 0;
      k = 0;
      while (ptr[i] != '\0')
        {
          if (ptr[i] != ' ' || ptr[i] != '\t')
            {
              taille = nbrCaract(ptr, i);
              tab[j][k] = malloc(taille * sizeof(char **));
              while (ptr[i] != ' ' || ptr[i] != '\t')
                {
                  tab[j][k] = ptr[i];
                  k++; i++;
                }
              tab[j][k] = '\0';
            }
          else
            j++;
        }
      return (tab);
    }
     
    int     main()
    {
      char ptr[37];
      char **tab;
     
      my_strcpy(ptr, "test\t affichage chaine  tableau\t c");
      tab = tabMot(ptr);
      //printf("%s", tab[0]);                                         
    }
    edit: code complet

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par noobC Voir le message
    Voila, je me renseigne sur les pointeurs et ca rentre petit a petit mais la je suis vraiment bloque.
    L'allocation dynamique me pose probleme: tabMot.c:55: warning: assignment makes integer from pointer without a cast
    En fait j'essai de decouper ma chaine de caractere (ptr) et il faut que je renvoie un char**.
    Donc est t-il possible d'allouer a l'indice k et d'y stocker une chaine?
    Ca ne compile toujours pas...
    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
    29
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `my_strcpy':
    main.c:17: warning: control reaches end of non-void function
    main.c: In function `nbCaract':
    main.c:24: error: `str' undeclared (first use in this function)
    main.c:24: error: (Each undeclared identifier is reported only once
    main.c:24: error: for each function it appears in.)
    main.c: At top level:
    main.c:19: warning: unused parameter 'ptr'
    main.c: In function `tabMot':
    main.c:43: error: `taille' undeclared (first use in this function)
    main.c:43: warning: implicit declaration of function `nbrCaract'
    main.c:43: error: `str' undeclared (first use in this function)
    main.c:44: warning: assignment makes integer from pointer without a cast
    main.c:34: warning: unused variable `size'
    main.c:53: warning: will never be executed
    main.c: At top level:
    main.c:59: warning: function declaration isn't a prototype
    main.c: In function `main':
    main.c:63: error: `str' undeclared (first use in this function)
    main.c:63: warning: passing arg 2 of `my_strcpy' discards qualifiers from pointer target type
    Process terminated with status 1 (0 minutes, 1 seconds)
    6 errors, 8 warnings
    Ton algo a l'air douteux... Je propose (pseudo-code) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    FUNCTION decouper (chaine): tab-de-pointeurs-sur-chaines
    BEGIN
     n := compter-les-mots(chaine)
     tab-de-pointeurs-sur-chaines := allouer (n x pointeurs-sur-chaine)
     i := 0
     tab-de-pointeurs-sur-chaines[i] := decouper_mot(chaine, PREMIER)
     WHILE tab-de-pointeurs-sur-chaines[i] <> NIL
       i := i + 1
       tab-de-pointeurs-sur-chaines[i] = decouper_mot(chaine, SUIVANTS)
     END
     RETURN tab-de-pointeurs-sur-chaines
    END

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    [EDIT] Pour la question d'allouer à l'indice k, ce n'est pas possible.

    tab est un char **.
    tab[j][k] est donc un char. Peu de chance que tu puisses y mettre un pointeur.
    Il faut donc que tu alloues d'abord ton tableau de n pointeurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab = malloc (n * sizeof *tab)
    et ensuite que tu alloues chacun des tab[i] et là tu pourras y stocker une chaîne (à l'indice i)

    Ensuite, ce code n'est pas complet.

    [EDIT] Le code est complet mais apparemment ça ne compile pas.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 76
    Points : 64
    Points
    64
    Par défaut
    donc il faut que j'oublie le tableau a 2 dimensions?
    mon affichage doit ressembler a ca au final:

    tab[0] == "test\0"
    tab[1] == "affichage\0"
    tab[2] == "chaine\0"
    tab[3] == "tableau\0"
    tab[4] == "c\0"

    Je vais tester le malloc sur "tab = malloc (taille* sizeof *tab)"

    EDIT: trop galere, je comprends pas comment on peut stocker dans un element, comme par exemple tab[1], une chaine de caractere.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    tab [1] est un char *, dont une chaîne de caractères que tu dois allouer.
    Exemple:

    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
    29
    30
    31
    32
    33
     
    #include <stdio.h>
    #include <stdlib.h>
     
    char **tab (int size) {
      int i, j;
      char **tab;
      /* Allocation du tableau de chaines */
      tab = malloc (size * sizeof *tab);
      for (i = 0 ; i < size ; i++) {
        /* Allocation de chacune des chaines */
        tab [i] = malloc ( (i+2) * sizeof **tab);
        for (j = 0 ; j < i+1 ; j++) {
          tab [i][j] = 'a' + (j % 26);
        }
        tab [i][i+1] = '\0';
      }
      return tab;
    }
     
    int main () {
      int size = 5;
      int i;
      char **t = tab (size);
      for (i = 0 ; i < size ; i++) {
        printf ("%s\n", t[i]);
      }
      for (i = 0 ; i < size ; i++) {
        free (t[i]);
      }
      free (t);
      return 0;
    }

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 76
    Points : 64
    Points
    64
    Par défaut
    ok je vois maintenant pourquoi je bloquais. cette exemple va me permettre de continuer mon exo (piouf enfin )
    merci beaucoup aoyou

    J'ai tout de meme du mal a me representer ce malloc et plus particulierement le sizeof de **tab: tab[i] = malloc ( (i+2) * sizeof **tab);

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Citation Envoyé par noobC Voir le message
    J'ai tout de meme du mal a me representer ce malloc et plus particulierement le sizeof de **tab: tab[i] = malloc ( (i+2) * sizeof **tab);
    *(tab[i]) et **tab pointe sur un objet de même type, en l'occurence un char. C'est juste que je trouvais plus lisible d'écrire sizeof **tab que sizeof *(tab[i]).
    J'alloue donc un tableau de (i+2) caractères dont le dernier élément est réservé au '\0' final.
    Bon allez, il doit te rester pleins d'autres choses à corriger...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 76
    Points : 64
    Points
    64
    Par défaut
    ouai ca seg fault c'est sympa. J'ai une nuit blanche dans la tronche alors on verra ca demain->cerveau hs
    encore merci et a bientot (tres bientot je pense )

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

Discussions similaires

  1. Allocation dynamique: Tableau de pointeur sur char
    Par Anonymouse dans le forum Débuter
    Réponses: 4
    Dernier message: 21/10/2007, 11h57
  2. pointeur sur pointeur générique
    Par j0o0 dans le forum C
    Réponses: 14
    Dernier message: 10/09/2007, 19h52
  3. les pointeurs sur pointeurs ne m'aiment pas :/
    Par GhostNemo dans le forum C
    Réponses: 3
    Dernier message: 18/12/2006, 00h10
  4. Réponses: 6
    Dernier message: 02/11/2006, 17h44
  5. pointeur sur pointeur
    Par gaut dans le forum C
    Réponses: 3
    Dernier message: 01/11/2005, 22h30

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