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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 28
    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 chevronné
    Avatar de myzu69
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 220
    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 éclairé
    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
    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 averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 28
    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 averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 28
    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 confirmé
    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
    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 averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 28
    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

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