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 devant contenir des adresse


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 28
    Points : 14
    Points
    14
    Par défaut allocation dynamique d un tableau devant contenir des adresse
    [Transféré depuis le forum C++]

    Bonjour je suis debutant en C, je me debrouille un tout petit peu mais depuis deux jours je n'arrive pas à comprendre un problème, le fait est que j'aimerais allouer un tableau dynamique dont chacune des cellules contiendra par après l'adresse d'un autre tableau...

    char *pTab ; // declaration de mon tableau

    pTab = (char *)malloc( 3 * sizeof(char));

    après sa je pensais que mon tableau contenais 3 cellule de type char accessible comme :

    pTab[0] = (adresse d un autre tableau)
    pTab[1] =
    pTab[2] =

    Mais apperement seule la première cellule est accessible, ce que je ne comprend pas..

    L'adresse d'un autre tableau contenant des valeurs de type char est elle meme de type char non ?

    merci pour votre aide d'avance, je voudrais preciser que j'ai deja chercher dans le forum mais sans trouver de reponse...

  2. #2
    Membre éclairé
    Avatar de myzu69
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 220
    Points : 744
    Points
    744
    Par défaut
    Salut,

    ta question semble porter sur le C et non sur le C++ (tu es dans le forum C++ ici)

    Pour répondre à ta question, si tu veux déclarer un tableau dynamique contenant d'autres tableaux, il faut que tu déclare un char ** et non pas un char *.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int nbChaines = 3;
    int tailleChaine = 5;
    char ** pTab;
    pTab = malloc(nbChaines * sizeof(*pTab));
     
    for(i=0 ; i<nbChaines ; ++i)
            pTab[i] = malloc(tailleChaine * sizeof(**pTab));
    En faisant ça tu déclares un tableau dynamique de trois éléments contenant chacun un tableau de cinq caractères. On peut assimiler ces types d'allocations à des matrices ou à des tableaux à deux dimensions. On alloue d'abord le premier tableau puis pour chaque élément on alloue un deuxième tableau.

    J'espère avoir pu aider, ma solution est peut-être pas très élégante mais normalement ça fonctionne (j'ai pas vérifié mais bon le principe est là).

  3. #3
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Points : 387
    Points
    387
    Billets dans le blog
    3
    Par défaut
    Salut , tout d'abord une chose :
    char *pTab ; // declaration de mon tableau
    ne fait que déclarer un pointeur sur un type caractère et non pas un tableau
    de pointeur de ce type ; pour déclarer un tableau de pointeur il te faut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *pTab[x] ; // declaration de mon tableau
    avec x comme expression constante représentant le nombre d'élément.
    Ton pseudo tableau :
    pTab = (char *)malloc( 3 * sizeof(char));
    n'étant en réalité qu'une chaîne de 3 caractères avec pTab comme adresse ...
    et non initialisé (c à dire contenant tout ce qu'on veux).

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Merci pour vos réponse,

    en fait ce que je voudrais c'est allouer un tableau dynamique de X cellule , et ensuite pourvoir stocké l'adresse d'un autre tableau allouer dynamiquement mais dans une autre fonction...

    donc :

    tTab[0] contient l adresse d'un autre tableau
    tTab[1] contient egalement une adresse vers une autre tableau

    etc..

    Mysu qd tu fais le premier malloc, on ne dois pas faire de cast ? et comme type si on met *tTab il prend quel type ? celui déclarer ?

    merci

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    En fait voila ce qu'il se passe , voila ma fonction :
    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
     
    void AddBloc (char **ppTabDynamique)
    {
    	printf("\n                        on entre dans la fonction AddBloc \n");
     
    	*ppTabDynamique  = (char *)malloc( 3 * sizeof(char));
    	printf("\n   TEST TABLEAU ALLOUE DYNAMIQUEMENT \n");
    	if (*ppTabDynamique == NULL)
    	{
    		printf("ERREUR ALLOCATION DYNAMIQUE");
    	}
    	*ppTabDynamique[0] = 'A';
    	printf("\n   %c \n", *ppTabDynamique[0]); // l affichage se fait 
                 *ppTabDynamique[1] = 'B';
    	printf("\n   %c \n", *ppTabDynamique[1]); // ERREUR
    }
    la fonction est cense allouer un tableau dynamique et retourne l'adresse de celui ci dans un pointeur du main, les cellules de se tableau contiendront par la suite une adresse d'un autre tableau dynamique..

    Merci d'avance pour votre aide

  6. #6
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    L'adresse d'un autre tableau contenant des valeurs de type char est elle meme de type char non ?
    Non, les éléments du tableau étant des char, le tableau est du type char[] et l'adresse du tableau est du type char (*)[]

    - Si le tableau de char est alloué dynamiquement, on va récupérer un char * (l'adresse du premier élément char alloué). Si on veut mettre cette adresse dans un tableau, celui-ci doit être un tableau de pointeurs sur char : char* [].

    - Si on veut que le tableau des adresses soit aussi alloué dynamiquement, on va récupérer un char** (l'adresse du premier élément char * alloué ). La création d'un tel tableau sera alors par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    char** AddBloc(int dim)
    {
       int i;
       char ** p = malloc(dim*sizeof(char*));
      // mettre ses éléments à NULL pour montrer qu'il n'y a aucune chaine
       if(p != NULL)
          for(i=0;i<dim;i++) p[i] = NULL;
       return p;
    }
    On peut alors lui ajouter des chaines :
    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 AjoutChaine(char** bloc, int dim, char* chaine)
    {
      int i;
      // Chercher une place libre
      for(i=0; i<dim && bloc[i]!= NULL;i++) {}
      if(i != dim)
      { // il y a de la place
        // Allouer de la place pour la chaine
        bloc[i] = malloc(strlen(chaine)+1);
        if(bloc[i] != NULL)
        { //allocation réussi, copier la chaine
          strcpy(bloc[i], chaine);
          return 1; // retourner !=0 si succès
        }
      }
      return 0 ; // pas de place ou échec d'allocation.
    }
    et tester :
    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
    int main(void)
    {
      int stat;
      char** bloc =  AddBloc(3);
      stat = AjoutChaine(bloc,3,"chaine1");
      //stat ==1. afficher les chaines de bloc (faire une fonction pour ça)
      stat = AjoutChaine(bloc,3,"chaine2");
      //stat ==1. afficher les chaines de bloc
      stat = AjoutChaine(bloc,3,"chaine3");
      //stat ==1. afficher les chaines de bloc
      stat = AjoutChaine(bloc,3,"chaine4");
      //stat ==0 bloc est plein. afficher les chaines de bloc
      // détruire tous ce qui a été alloué dynamiquement (faire une fonction pour ça)
      return 0;
    }

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    bonjour, depuis tantot j'essaye et reessaye ton code mais j'arrive pas je suis encore trop debutant a mon avis... mais c est bizar...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    char **AddBloc (int dim);      // prototype de la fonction declare au debut du fichier module1.cpp
     
    static char** bloc =  AddBloc(3);
     
    char** AddBloc(int dim)
    {
       int i;
       char ** p = malloc(dim*sizeof(char*));
      // mettre ses éléments à NULL pour montrer qu'il n'y a aucune chaine
       if(p != NULL)
          for(i=0;i<dim;i++) p[i] = NULL;
       return p;
    }
    Pour le malloc il me retourne une erreur : error C2440: '='*: impossible de convertir de 'void *' en 'char *' pk ??

    N'y a t'il pas possibilité de déclarer un pointeur de tableau de pointeur dans le main en static, et de faire une fonction a laquelle on fournirait ce pointeur, pour qu'au final ce soit l'adresse de notre pointeur de tableau de pointeur qui soit modifiée ?

    merci et désolé si je ne comprend pas vite

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Pour le malloc il me retourne une erreur : error C2440: '='*: impossible de convertir de 'void *' en 'char *' pk ??
    C'est parce que tu compiles du code C avec un compilateur C++. Pas bien !
    Il faut déjà configurer ton projet de manière à ce qu'il soit compilé avec le compilateur C.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    et comment on fait pour modifier sa avec visual studio 2010 ??

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Je ne saurais pas te répondre, vu que je n'utilise pas Visual. D'autres pourront probablement te répondre.
    Mais déjà avec l'aide du logiciel ou grâce à une recherche sur Internet, tu dois pouvoir trouver ça facilement... C'est quand même un réglage capital.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    re bonjour,

    j'ai regardé les autres projet que l on avait deja fait en cours etc et c est tous des projets c++ malgré qu'on utilise toujours pas mal de c,

    alors ma question est que changer dans le code pour que sa fonctionne en c++ ?

  12. #12
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    -
    alors ma question est que changer dans le code pour que sa fonctionne en c++ ?
    La première chose serait de renoncer à l'allocation dynamique par malloc()/free() qui va faire hurler les programmeurs C++ au profit des opérateurs new/delete. malloc()/free() est possible en C++ mais n'est pas dans la "mentalité" C++.
    Les programmeurs C++ te diront ensuite d'utiliser la STL, mais je ne crois pas que tu ais déjà étudié ses fonctionnalités.

    -
    Pour le malloc il me retourne une erreur : error C2440: '='*: impossible de convertir de 'void *' en 'char *' pk ??
    La conversion d'un pointeur en void* er réciproquement est implicite en C et pas en C++. Si tu compiles en C++, il te faut faire le transtypage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char ** p = (char**)malloc(dim*sizeof(char*));
    -
    N'y a t'il pas possibilité de déclarer un pointeur de tableau de pointeur dans le main en static, et de faire une fonction a laquelle on fournirait ce pointeur, pour qu'au final ce soit l'adresse de notre pointeur de tableau de pointeur qui soit modifiée ?
    Je n'en vois pas l'intérêt ni l'avantage. Quant à utiliser un tableau de pointeurs en statique ou automatique, sa taille serait alors déterminée à la compilation et non pas lors de l'exécution du programme.

Discussions similaires

  1. [debutant] allocation dynamique d'un tableau.
    Par méphistopheles dans le forum Débuter
    Réponses: 3
    Dernier message: 16/03/2007, 12h45
  2. Réponses: 2
    Dernier message: 05/03/2007, 18h37
  3. Réponses: 67
    Dernier message: 13/02/2007, 18h08
  4. Réponses: 13
    Dernier message: 01/10/2006, 00h25
  5. [PRO*C] Allocation dynamique d'un tableau de VARCHAR
    Par NéalZheimer dans le forum Interfaces de programmation
    Réponses: 5
    Dernier message: 07/07/2006, 13h02

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