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 :

FAQ: Comment allouer un tableau dynamique


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 213
    Points : 58
    Points
    58
    Par défaut FAQ: Comment allouer un tableau dynamique
    Voila je ne comprends pas tre bien le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /* METHODE 1 */
    char **tab;/* Allocation de la 1er dimension */
    tab = malloc ( sizeof(*tab)  *  taille);/* Allocation des tableaux */
     
    for (i=0; i<taille; i++)
    {
       tab[i] = malloc ( sizeof(**tab) * taille2);
    }
    Il est dit:
    Si on désire allouer un tableau de N * M élements, il y a 2 méthodes possibles :
    on peut allouer un tableau de N éléments et ensuite allouer dans chacun de ces éléments, les M éléments nécessaires.
    A quoi signifie taille et taille2. Cela ne doit pas se faire dynamiquement?Que doit on ajoutera ce code pour creer un tableau dynamique?Et si mon parametre M est connu, dois je enlever un truc?

    Merci

    [Message édité par Gangsoleil - Merci d'utiliser la touche "retour à la ligne", ce qui facilite grandement la lecture]

  2. #2
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Taille corespond à la première dimension (N) et taille2 à M. TU peux trés bien inverser, aprés c'est au moment de récupérer les valeurs qu'ils faut utiliser le même sens.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /* METHODE 1 */
    char **tab;
    /* Allocation de la 1er dimension */
    tab = malloc ( sizeof(*tab)  *  taille);
    /* Allocation des tableaux */
    for (i=0; i<taille; i++){
       tab[i] = malloc ( sizeof(**tab) * taille2);
    }
    C'est une méthode pour créer un tableau à 2 dimensions dynamiquement (c'est à dire que les dimensions ne sont connus qu'a l'exécution.

    SI ton paramètre M est connu à la compilation (il est fixé), alors tu peux en effet simplifier la chose.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char * tab[VALEUR_M];
    tab = malloc( sizeof (*tab * n)
    VALEUR_M étant une constante.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 213
    Points : 58
    Points
    58
    Par défaut
    Voila un bout de mon code

    je vais ire un fichier texte et en fonction de sa structure, je renvoi des informations du type char ID_Trames. J'aimerai en fait stocker toutes les chaines de caracteres de ce type dans un tableau dynamique.

    voici mon code:

    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    #include <stdio.h> 
    #include <string.h>
    #include <stdlib.h>  
     
    int i;
    int j;
    char *ptr;
     
    void decompositionligne1(void)
    {
    char ID_Trames[3];
       if (i==3)  
       {
      strcpy(ID_Trames,ptr); 
      //// comment remplir un tableau dynamique contenant N (inconnue: depend de la structure du fichier texte)
      ////chaines de caracteres ID_Trames?
      printf("Identification du message: %s\n", ID_Trames);
      printf("\n"); 
       }
    }
    int lecture()
    {
    int identifiant1= '#';
    char *resultIdentifiant1;
    char seps[]=" ";
    char ligne[100];
    char *str1 = ligne;
    int indexligne=0;
     
    FILE *file = fopen( "fichier.txt", "r" ); 
     if (file==NULL)
     {
         printf("erreur ouverture\n");
         return 1;        
     }
     
    while (fgets( ligne, 100, file ) != NULL)
    {
    i=0;
    j=0;
    resultIdentifiant1= strchr(str1,identifiant1);
     if ( resultIdentifiant1 == 0)  
     {
     }
     else
     {
      ptr = strtok(ligne, seps); 
      while ( ptr != NULL )    
       {
        i++;
        decompositionligne1();  
        ptr = strtok(NULL, seps);  
       }
     }
    }
    }
    void alloc( void )
    {
       char *ID;
       /* Allocate space for a path name */
       ID = (char *)malloc( _MAX_PATH );
       if( ID == NULL )
       {
        printf( "Manque de mémoire\n" );
        return;
       }
       else
       {
          lecture();
       //   free(ID);
       //   printf( "Memory freed\n" );
       }
    }
     
    void main(void)
    {
     alloc();
    }

  4. #4
    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 beb30
    Voila un bout de mon code
    • main() retourne int. Toujours.
    • Les globales ça me rend nerveux. A supprimmer. Pour transmettre les valeurs, utilise les parametres...
    • Tu crees ID, mais tu ne l'utilise jamais. (de plus, de taille fixe. Pourquoi malloc() ?)
    • Pour faire des essais, tu devrais choisir un exemple plus simple...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 213
    Points : 58
    Points
    58
    Par défaut
    Voila j'essai d'allouer un tableau dynamique de chaine de caractère ...
    j'ai du mal...

    la taille des chaines de caractères est connu.

    je fais comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int n;
    char *tab_ID;
    tab_ID = (char *)malloc (n * sizeof (char)) ;
    if (tab_ID == NULL)
    {       
     printf ("l'allocation a echoue\n") ;   
        exit (1) ;                             
    }
    Mais j'ai des erreurs dont une qui est la suivante

    'tab_ID' : 'int ' differs in levels of indirection from 'char *'
    Qqun a une idée?

  6. #6
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par beb30
    Voila j'essai d'allouer un tableau dynamique de chaine de caractère ...
    j'ai du mal...

    la taille des chaines de caractères est connu.

    je fais comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int n;
    char *tab_ID;
    tab_ID = (char *)malloc (n * sizeof (char)) ;
    if (tab_ID == NULL)
    {       
     printf ("l'allocation a echoue\n") ;   
        exit (1) ;                             
    }
    Mais j'ai des erreurs dont une qui est la suivante



    Qqun a une idée?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int n = 4;
    char *tab_ID;
    tab_ID = malloc (n) ;
    if (tab_ID == NULL)
    {       
       printf ("l'allocation a echoue\n") ;   
       exit (1) ;                             
    }

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 213
    Points : 58
    Points
    58
    Par défaut
    j'ai tjrs les mêmes erreurs

    je ne comprends pas.

    que peut bien vouloir signifier cette erreur?

  8. #8
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Ben montre ton code en entier, pas seulement ce passage.

  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 beb30
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int n;
    char *tab_ID;
    tab_ID = (char *)malloc (n * sizeof (char)) ;
    Mais j'ai des erreurs
    Manque probalement le prototype de malloc() :

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 213
    Points : 58
    Points
    58
    Par défaut
    Voila, ce bout de code fonctionne, mais rempli t'il ma table tab_ID de façon dynamique?

    Je sais que ce code est loin d'être parfait: variables globales et autres, mais pour l'instant je cherchais à faire marcher un tableau dynamique...


    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
    67
    68
    69
     
    #include <stdio.h> 
    #include <string.h>
    #include <stdlib.h>  
     
    int i;
    int j;
    char *ptr;
     
    void decompositionligne1(void)
    {
       if (i==3)  
       {
     int n=4;
     char *tab_ID;
     tab_ID = (char *) calloc (n, sizeof (char)) ;
     if (tab_ID == NULL)
     {       
     printf ("l'allocation a echoue\n") ;   
        exit (1) ;                             
     }
     else
     {
      tab_ID=ptr;
      printf("%s", tab_ID);
      printf("\n"); 
       }
    }
    }
    int lecture()
    {
    int identifiant1= '#';
    char *resultIdentifiant1;
    char seps[]=" ";
    char ligne[100];
    char *str1 = ligne;
    int indexligne=0;
     
    FILE *file = fopen( "fichier.txt", "r" ); 
     if (file==NULL)
     {
         printf("erreur ouverture\n");
         return 1;        
     }
     
    while (fgets( ligne, 100, file ) != NULL)
    {
    i=0;
    j=0;
    resultIdentifiant1= strchr(str1,identifiant1);
     if ( resultIdentifiant1 == 0)  
     {
     }
     else
     {
      ptr = strtok(ligne, seps); 
      while ( ptr != NULL )    
       {
        i++;
        decompositionligne1();  
        ptr = strtok(NULL, seps);  
       }
     }
    }
    }
    void main(void)
    {
     lecture();
    }
    A quelle valeur dois je fixer la variable n? Cela t il une importance?

  11. #11
    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 beb30
    A quelle valeur dois je fixer la variable n? Cela t il une importance?
    Drôle de question. Visiblement, tu veux utiliser un tableau dynamique, mais en fait tu ne sais pas pourquoi... Tu programmes au hasard ?

  12. #12
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    n n'est autre que la taille du tableau tout simplement, si tu veux un tableau dynamique la valeur peut varier, d'où l'utilité des tableau dynamique donc bin cette valeur peut-être fournie par exemple en argument à ta fonction de création du tableau !

    Mais si tu code en dur la valeur de n, autant faire des talbeau statiques

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 213
    Points : 58
    Points
    58
    Par défaut
    Je ne code pas au hazard mais j'ai du mal a comprendre l'utilisation des pointeurs et des tableaux dynamiques....

    je n'ai pas eu de formation d'info, et j'aprends en ligne.

    j'ai modifier mon code comme ceci; il compile mais mon tableau dynamique n'est pas rempli!

    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
     
       int n=nbrmessage;
       char *tab_ID;     //tableau contenant tous les ID_MSG: Ce sera le point d'entrée de notre décompacatge. 
       tab_ID = (char *) calloc (n, sizeof (char)) ;
       if (tab_ID == NULL)
       {       
       printf ("l'allocation a echoue\n") ;   
       exit (1) ;                             
       }
       else
       {
         strcpy(tab_ID,ptr); 
         printf("tab_ID: %s\n", tab_ID);
         strcpy(entete[nbrmessage].ID_MSG,ptr);  /// rempli la structure "entete": ID_MSG
         printf("Identification du message : %s\n", entete[nbrmessage].ID_MSG);
         printf("\n"); 
       }
    comment remplir ma table tab_ID, en fait
    strcpy(tab_ID,ptr);
    ne rempli pas ma table.

  14. #14
    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 beb30
    j'ai modifier mon code comme ceci; il compile mais mon tableau dynamique n'est pas rempli!
    Ton code n'est pas compilable.

    Poste un code complet mais réduit au minimum qui montre le défaut.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 213
    Points : 58
    Points
    58
    Par défaut
    c bon je ss arrivé à faire marcher comme je souhaiter

    a l avenir, j essayerai d'etre moins vague dans ma requette...

    Merci à tous

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

Discussions similaires

  1. [PDF] Comment générer un tableau dynamique ?
    Par baptx dans le forum C++Builder
    Réponses: 3
    Dernier message: 13/07/2007, 13h29
  2. Réponses: 1
    Dernier message: 03/05/2007, 08h15
  3. Comment redimensionner un tableau dynamique ?
    Par Mickey.jet dans le forum Langage
    Réponses: 13
    Dernier message: 07/09/2006, 18h16
  4. Réponses: 9
    Dernier message: 22/06/2006, 20h06
  5. Comment passer un tableau dynamique en paramètre ?
    Par Charette dans le forum Langage
    Réponses: 2
    Dernier message: 21/04/2005, 11h28

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