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 dynamique d'un tableau de caractères dans une procédure


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 18
    Points : 7
    Points
    7
    Par défaut Allocation dynamique d'un tableau de caractères dans une procédure
    Bonjour,

    J'ai quelques difficultés avec les pointeurs alors je me suis inspiré d'une explication de koala01 pour mon code. La différence est qu'il le fait sur un float alors que je souhaite le faire sur un tableau de char 2 dimensions.
    http://www.developpez.net/forums/d19...s/#post1284261

    J'ai réussi à faire l'équivalent de la fonction pour mon tableau de chaines de caractères mais je n'arrive pas à faire la procédure.

    Voici mon code: (j'utilise devcpp pour compiler)
    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
     
    #include <stdio.h>
    #include <malloc.h>
    ...
     
    //prototypes
    void recupConfig(FILE *, char ***, char ***, int *, char ***, int *);
    ...
     
    int main()
      {
      FILE *fichierConf;
      char ***chemins=NULL;
      char ***extensions=NULL;
      char ***mots=NULL;
      int *nbJoursApresZip;
      int nbElements[4];
      ...
     
      recupConfig(fichierConf, &chemins, &mots, &nbJoursApresZip, &extensions, nbElements);
      ...
      return 0;
      }
     
      void recupConfig(FILE *fichier,char ***listeChemins, char ***listeMots, int *nbJAZ, char ***listeExtensions, int nbElements[])
      {
      int i;
      *listeChemins = (char **)malloc(50*sizeof(char *));
      if(*listeChemins!=NULL)
        printf("mallocOK\n");
      for(i=0;i<50;i++)
        {
        *listeChemins[i] = (char *)malloc(100*sizeof(char));
        printf("TestMalloc\n");getch();
        }
      ...
      }
    A l'exécution du programme j'obtiens:
    mallocOK
    TestMalloc
    TestMalloc
    TestMalloc
    Et là ça bloque et ça quitte.

    Je suppose que je n'alloue pas au bon endroit en mémoire mais je ne comprends pas pourquoi. Quelqu'un peut-il m'aider?

    Merci!

  2. #2
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    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
    void recupConfig(FILE *, char ***, char ***, int *, char ***, int *);
    ...
     
    int main()
      {
      FILE *fichierConf;
      char ***chemins=NULL;
      char ***extensions=NULL;
      char ***mots=NULL;
      int *nbJoursApresZip;
      int nbElements[4];
      ...
      
      recupConfig(fichierConf, &chemins, &mots, &nbJoursApresZip, &extensions, nbElements);
      ...
      return 0;
      }
    Les types ne concordent pas. &chemins est un char **** d'après la définition de chemins. Idem pour les autres paramètres.

  3. #3
    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 : 67
    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 Ricks Voir le message
    J'ai quelques difficultés avec les pointeurs alors je me suis inspiré d'une explication de koala01 pour mon code. La différence est qu'il le fait sur un float alors que je souhaite le faire sur un tableau de char 2 dimensions.
    n'existe pas. C'est N'est pas standard.

    J'ai remis ton code en ordre de façon à ce que les paramètres soient cohérents (trop d'*', ça sent le pifomètre tout ça...)...
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    void recupConfig (FILE * fichier, char ***listeChemins, char ***listeMots,
                      int *nbJAZ, char ***listeExtensions, int nbElements[])
    {
       int i;
       *listeChemins = malloc (50 * sizeof (char *));
       if (*listeChemins != NULL)
          printf ("mallocOK\n");
       for (i = 0; i < 50; i++)
       {
          *listeChemins[i] = malloc (100 * sizeof (char));
          printf ("TestMalloc\n");
       }
     
       (void) fichier;
       (void) listeMots;
       (void) nbJAZ;
       (void) listeExtensions;
       (void) nbElements;
    }
     
    int main (void)
    {
       FILE *fichierConf = NULL;
       char **chemins = NULL;
       char **extensions = NULL;
       char **mots = NULL;
       int nbJoursApresZip;
       int nbElements[4];
     
       recupConfig (fichierConf, &chemins, &mots, &nbJoursApresZip, &extensions,
                    nbElements);
     
       return 0;
    }
    Effectivement, ça crashe sévèrement...

    Toutes ces '*', ça rend fou. Je ne fais jamais comme ça. J'utilise des structures, c'est beaucoup plus clair (et pas limité).

    Recodé selon ce principe et une utilisation plus claire de malloc() :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    struct data
    {
       FILE *fichierConf;
       char **chemins;
       char **extensions;
       char **mots;
       int nbJoursApresZip;
       int nbElements[4];
     
    };
     
    void recupConfig (struct data *p_data)
    {
       p_data->chemins = malloc (50 * sizeof *p_data->chemins);
     
       if (p_data->chemins != NULL)
       {
          int i;
          printf ("mallocOK\n");
     
          for (i = 0; i < 50; i++)
          {
             p_data->chemins[i] = malloc (100 * sizeof *p_data->chemins[i]);
             printf ("TestMalloc\n");
          }
       }
    }
     
    int main (void)
    {
       struct data data = { 0 };
     
       recupConfig (&data);
     
       return 0;
    }
    Curieusement, ça marche du premier coup...
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    J'ai aussi stdlib.h dans mes includes. Pour getch(), je l'utilise souvent sans problème. Je pense que le problème vient des pointeurs. J'ai essayé avec char *** dans la procédure et char ** dans le main mais il y a des warning à la compilation.

  5. #5
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       for (i = 0; i < 50; i++)
       {
          (*listeChemins)[i] = malloc (100 * sizeof (char));
          printf ("TestMalloc\n");
       }

  6. #6
    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 : 67
    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 Ricks Voir le message
    J'ai aussi stdlib.h dans mes includes.
    Etrange. Pourquoi tu utilises <malloc.h> ? C'est pas très logique...
    Pour getch(), je l'utilise souvent sans problème.
    Oui, mais ce n'est pas portable. Si tu changes de machine ou compilateur, ça peut de plus fonctionner...
    Je pense que le problème vient des pointeurs. J'ai essayé avec char *** dans la procédure et char ** dans le main mais il y a des warning à la compilation.
    Oui. Une réponse a été apportée. Trop d'*', ça rend gaga...
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    J'utiliserais bien volontiers les structures si cela permet d'allouer et de remplir plusieurs chaines dans la procédure mais je sens que je vais m'emmêler les pinceaux dans la suite du programme car je ne suis pas habitué à utiliser des structures.
    C'est pourquoi j'ai essayé le passage par pointeurs

  8. #8
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Etrange. Pourquoi tu utilises <malloc.h> ? C'est pas très logique... Oui, mais ce n'est pas portable. Si tu changes de machine ou compilateur, ça peut de plus fonctionner... Oui. Une réponse a été apportée. trop d'*', ça rend gaga...
    Je ne savais pas que stdlib.h était utilisée pour l'allocation dynamique.
    Merci pour l'info sur getch(). Je ne savais pas. Je ne m'en sers que pour débugger. Je les retire après.
    Désolé pour les *** je rédigeais en même temps que toi.

  9. #9
    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 : 67
    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 Ricks Voir le message
    J'utiliserais bien volontiers les structures si cela permet d'allouer et de remplir plusieurs chaines dans la procédure mais je sens que je vais m'emmêler les pinceaux dans la suite du programme car je ne suis pas habitué à utiliser des structures.
    C'est pourquoi j'ai essayé le passage par pointeurs
    L'utilisation des pointeurs doubles ou triples et beaucoup plus complexe. Preuve est faite, non ?

    L'usage des structures impose un peu de réflexion préalable (organisation du code, des données, découpe fonctionnel...), mais c'est l'approche professionnelle.
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par stephl Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       for (i = 0; i < 50; i++)
       {
          (*listeChemins)[i] = malloc (100 * sizeof (char));
          printf ("TestMalloc\n");
       }
    Tu as peut être trouvé le problème stephl. Je suis en train de tester.

  11. #11
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    A Stephl : C'est bon ça ne plante plus et je récupère bien le contenu des chaines dans le main.

    A Emmanuel Delahaye : Je suis encore novice en structure. Je me pencherai dessus plus en détails pour améliorer ma façon de programmer.

    Merci à vous deux pour les conseils et la résolution de mon problème!

    PS : saleté de parenthèses

  12. #12
    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 : 67
    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 Ricks Voir le message
    PS : saleté de parenthèses
    Bah, non. Saleté de pointeurs imbitables...
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/03/2015, 16h15
  2. Traitement de chaine de caractères dans une procédure
    Par wissem.ba dans le forum Langage SQL
    Réponses: 4
    Dernier message: 03/02/2011, 18h06
  3. Tableau de variables dans une procédure stockée ?
    Par Seb33300 dans le forum Développement
    Réponses: 4
    Dernier message: 09/03/2009, 11h57
  4. passage d'un tableau en argument dans une procédure
    Par cati_78 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 23/11/2008, 18h11
  5. Réponses: 67
    Dernier message: 13/02/2007, 18h08

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