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 :

Retourner un tableau dynamique


Sujet :

C

  1. #1
    wkd
    wkd est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 112
    Points : 65
    Points
    65
    Par défaut Retourner un tableau dynamique
    Bonjour,

    j'aimerai savoir comment retourner un tableau dynamique dans mon programme main.


    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
     
     
    //fonction
    char ** appelFonction(){
       char *temp[50];
       int i;
       for(int i=0;i<49;i++°{
          // saisir chaine de caractere, alloué dynamiquement dans temp[i], fermé par '\0';
       }
       return temp;
    }
     
    //prog. principal
    int main(int argc, char *arg[]){
       char *tab[50];
       tab=appelFonction();
       for(j=0;j<49;j++){ 
         printf("val:%d contenu:%s\n",j,tab[j]);
       }
    }
    Je n'arrive pas à retourner un tableau dynamique, mais si je renvoie juste une chaine dynamique, ca marche. Mais pas pour un tableau.

    Quand je mets char * au lieu de **, il me dit: probleme entre & et *

    Merci
    Le forum est là pour ceux qui ont déjà passé des heures et des heures à chercher la petite bête et qui n'ont pas encore trouvé le moyen de l'attraper...

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,

    avoir un code compilable serait un bon début. Pourquoi recopier le code avec des fautes alors qu'il existe la fonction copier/coller?

    Citation Envoyé par wkd
    temp est une variable locale donc la fonction retourne d'adresse d'un tableau qui n'existe plus. Il faut utiliser l'allocation dynamique pour faire cela.

  3. #3
    wkd
    wkd est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 112
    Points : 65
    Points
    65
    Par défaut
    ok, mais honnetement, je vois pas trop comment faire :/

    parce ke quand je fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    char * appelFonction(){
      char *temp;
       ...//allocation de temp avec un '\0' en fin de chaine
       return temp;
    }
     
    int main(int argc,char *argv[]){
       char *chaine;
       chaine=appelFonction();
       printf("message: %s",chaine");
       return 0;
    }
    là, ca marche mais pas pour le tableau de chaines de caracteres alloué dynamiquement :/
    Le forum est là pour ceux qui ont déjà passé des heures et des heures à chercher la petite bête et qui n'ont pas encore trouvé le moyen de l'attraper...

  4. #4
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 89
    Points : 91
    Points
    91
    Par défaut
    Dans un tableau dynamique, il faut tout allouer dans le tas :
    Si tu laisse ton char *temp[50], quand tu vas sortir de ta fonction, les 50 places mémoires pour char * seront perdues (elles étaient dans la pile d'execution et vont être dépilées)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    char ** appelFonction(){
       char **temp; = (char **)malloc(sizeof(char *) * 50); // MODIF
       int i;
       for(int i=0;i<49;i++°{
           temp[i] = (char *)malloc(sizeof(char) * taille_chaine);  // MODIF
          // saisir chaine de caractere, alloué dynamiquement dans temp[i], fermé par '\0';
       }
       return temp;
    }
    autre chose, un tableau n'est pas un pointeur, tu ne peux pas lui faire changer d'adresse comme ça, il faut mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main(int argc, char *arg[]){
      -- char *tab[50]; 
      ++ char **tab;
      ...

  5. #5
    wkd
    wkd est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 112
    Points : 65
    Points
    65
    Par défaut
    merci gege et ciol.

    Au fait, ciol, tu as mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (char **)malloc(sizeof(char *) * 50);
    et je pense que l'ecrire vous semble t-il correct ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     malloc(50*sizeof(char *));
    A titre info, ca marche^^
    merci
    Le forum est là pour ceux qui ont déjà passé des heures et des heures à chercher la petite bête et qui n'ont pas encore trouvé le moyen de l'attraper...

  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 wkd
    Au fait, ciol, tu as mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (char **)malloc(sizeof(char *) * 50);
    et je pense que l'ecrire vous semble t-il correct ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     malloc(50*sizeof(char *));
    Oui, ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     char **tmp = malloc (50 * sizeof *temp);
    http://emmanuel-delahaye.developpez....tes.htm#malloc
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/03/2015, 18h31
  2. Retourner un tableau dynamique
    Par Diacred dans le forum Débuter
    Réponses: 9
    Dernier message: 02/06/2008, 19h11
  3. AFFICHER UN TABLEAU DYNAMIQUE
    Par ghassenus dans le forum Langage
    Réponses: 2
    Dernier message: 28/12/2002, 14h19
  4. [Kylix] tableau dynamique
    Par sdoura2 dans le forum EDI
    Réponses: 1
    Dernier message: 31/10/2002, 08h57
  5. Réponses: 4
    Dernier message: 13/05/2002, 16h43

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