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 :

Fonction argument pointeur de pointeur


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 18
    Points : 13
    Points
    13
    Par défaut Fonction argument pointeur de pointeur
    Bonjour à tous,
    Je veux qu'une fonction génère un tableau de structure de taille variable.


    Le code ci-desous fonctionne :
    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
    typedef struct
    {
        unsigned char cLib [15];                        unsigned char cNum;                                                
    } stParamStruct;
     
    void ExeScan ( void )
    {
        char dbgMax =5; char i; char buf [100];
        stParamStruct *stParTab; 
     
        stParTab = malloc(dbgMax);      // créé et rempli tableau structure
        for ( i = 0; i<dbgMax ;i++)
        {
            sprintf(buf,"Num %d", i);
            strcpy( (char *)((stParTab+i)->cLib), buf);
        }
     
        DialScan (stParTab, dbgMax ); // passe le tableau de structure en                                                    //argument 
        free(stParTab);
    }
    Je créer le tableau de structure dans une fonction externe, avec le programme suivant qui ne fonctionne pas :

    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
    void GenereTab( stParamStruct **tParTab, char nombre)
    {                                                                      // nouvelle fonction
        char i, buf[50]; stParamStruct *local;
        local = malloc(nombre);                    // créé et rempli tableau structure
        for ( i = 0; i<nombre ;i++)
        {
            sprintf(buf,"Num %d", i);
            strcpy( (char *)((local+i)->cLib), buf);
        }
        *tParTab = local;    // plantage !!!!!
    } 
     
    void ExeScan ( void )
    {
        stParamStruct *stParTab, **bis; 
     
        GenereTab( bis, 5);
        stParTab = *bis;
     
        DialScan (stParTab, 5);// passe le tableau de structure en argument 
        free(stParTab);
    }
    Ou est l'erreur ? Comment faut-il faire pour faire fonctionner la fonction GenereTab ?

    Merci d'avance.

  2. #2
    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
    Le code ci-desous fonctionne :
    ....
    Non, il est faux , il ne faut pas se fier aux apparences :
    le malloc doit prendre en argument le nombre de bytes demandés. Pour allouer un tableau de dbgMax structures stParamStruct, on doit avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        stParamStruct *stParTab = malloc(dbgMax*sizeof(stParamStruct ));
    // ou
    //  stParamStruct *stParTab = malloc(dbgMax*sizeof *stParTab);
        if(stParTab != NULL)....
    La même erreur est commise dans la fonction GenereTab()
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par diogene Voir le message
    Non, il est faux , il ne faut pas se fier aux apparences :
    le malloc doit prendre en argument le nombre de bytes demandés. Pour allouer un tableau de dbgMax structures stParamStruct, on doit avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        stParamStruct *stParTab = malloc(dbgMax*sizeof(stParamStruct ));
    // ou
    //  stParamStruct *stParTab = malloc(dbgMax*sizeof *stParTab);
        if(stParTab != NULL)....
    La même erreur est commise dans la fonction GenereTab()
    Oui merci premier point corrigé il faut bien passer les infos à la fonction malloc.

    Par contre le pb reste le même, comment remonter le pointeur attribué par malloc à la fonction appelante.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ALBERT_F Voir le message
    Par contre le pb reste le même, comment remonter le pointeur attribué par malloc à la fonction appelante.
    Salut
    Comme toute valeur que t'as besoin de retourner...
    Code c : 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
    char *fct1()
    {
        return fct2();
    }
     
    char *fct2()
    {
        return fct3();
    }
     
    char *fct3()
    {
        return malloc(...);
    }
     
    int main()
    {
        char *pt=fct1();
        ...
        free(pt);
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Salut
    Comme toute valeur que t'as besoin de retourner...
    Code c : 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
    char *fct1()
    {
        return fct2();
    }
     
    char *fct2()
    {
        return fct3();
    }
     
    char *fct3()
    {
        return malloc(...);
    }
     
    int main()
    {
        char *pt=fct1();
        ...
        free(pt);
    }
    Bonjour,
    Merci, ça fonctionne parfaitement et sa répond à mon besoin.
    Maintenant si j'arrive à comprendre ce qui ne vas pas dans le code original ça me permetrait d'aller manger ce midi un peu moins bête que ce matin.

  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
    Maintenant si j'arrive à comprendre ce qui ne vas pas dans le code original ça me permetrait d'aller manger ce midi un peu moins bête que ce matin.
    La fonction originale ExeScan() devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void ExeScan ( void )
    {
        stParamStruct *stParTab;
       // Passer l'adresse de l'endroit où la fonction doit placer la valeur : 
        GenereTab( &stParTab, 5); 
        DialScan (stParTab, 5);// passe le tableau de structure en argument 
        free(stParTab);
    }
    Bon appétit !
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par diogene Voir le message
    La fonction originale ExeScan() devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void ExeScan ( void )
    {
        stParamStruct *stParTab;
       // Passer l'adresse de l'endroit où la fonction doit placer la valeur : 
        GenereTab( &stParTab, 5); 
        DialScan (stParTab, 5);// passe le tableau de structure en argument 
        free(stParTab);
    }
    Bon appétit !
    Très bien merci beaucoup Diogene,
    Avec tous ça j'arrive maintenant à manipuler des tableaux de données à longueur variable.
    Et ce soir je reprendrai deux fois du fromage, encore merci.

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

Discussions similaires

  1. Pointeurs et pointeurs de pointeurs
    Par wallace27 dans le forum C
    Réponses: 10
    Dernier message: 09/04/2015, 23h07
  2. Réponses: 21
    Dernier message: 06/08/2009, 10h31
  3. Réponses: 6
    Dernier message: 26/05/2007, 01h33
  4. Réponses: 17
    Dernier message: 24/03/2005, 13h24
  5. fonction qui retourne un pointeur
    Par sorari dans le forum C++
    Réponses: 6
    Dernier message: 16/03/2005, 22h23

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