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 d'un tableau de struct dans une fonction


Sujet :

C

  1. #1
    Membre confirmé Avatar de Topeur
    Profil pro
    Inscrit en
    Février 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 91
    Par défaut Allocation d'un tableau de struct dans une fonction
    Bonjour a tous,

    Je suis a la recherche d'une explication au sujet de l'allocation.
    Je sais allouer un tableau de structure dans mon main, mais quand je cherche à faire la même chose dans une fonction, je rencontre des erreurs

    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
     
    typedef struct
    {
       int number;
    }MOY;
     
     
    void AllocMOY( MOY **moy )
    {
       int qte = 10;
       moy = /* (MOY*) */ malloc( qte * sizeof(MOY) );
       moy[2]->number = 10; //Ici, erreur de violation d'acces !
     
       /* Utilisé ca aussi, mais ceci provoque une erreur au moment du printf en sortie de fonction
       moy= malloc (11 * sizeof(MOY*) );
       for(i=0; i<11; i++)
       {
    	moy[i] = malloc(sizeof(MOY));
       }
     
       */
    }
     
     
    void main()
    {
       MOY *moy;
       AllocMOY( &moy );
       printf("%d",moy[2]);
    }


    En quoi ce code ne fonctionne pas ?
    Ou ai je fais une erreur ?
    Je ne trouve pas de solution, c'est pourquoi je viens demander votre aide
    Merci d'avance pour vos reponses !

  2. #2
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Euh, t'es sûr que c'est dans la rubrique C++ que tu voulais poster ?
    malloc, printf, c'est que du C ça !

    Dis moi et je déplace si besoin!

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    moy est un pointeur sur un pointeur sur un MOY. Ce code est absolument non typique de ce qu'on ferait en C++. Pour le corriger à très court terme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void AllocMOY( MOY **moy )
    {
       int qte = 10;
       *moy = (MOY*) malloc( qte * sizeof(MOY) );
       (*moy)[2].number = 10;
    }
    Maintenant, en tenant compte du fait que la structure MOY peut évoluer, et que faire malloc dessus risque de ne plus être correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct MOY
    {
       int number;
    };
     
     
    void AllocMOY( MOY **moy )
    {
       int qte = 10;
       *moy = new MOY[qte];
       (*moy)[2].number = 10;
    }
    Ensuite, on utilisera en C++ le passage par référence, plutôt que de passer un pointeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void AllocMOY( MOY *&moy )
    {
       int qte = 10;
       moy = new MOY[qte];
       moy[2].number = 10;
    }
    int main() // Main DOIT retourner un entier
    {
       MOY *moy;
       AllocMOY( moy );
       cout << moy[2]; // cout est plus simple à utiliser que printf
    }
    Et enfin, de toute manière, en C++, on n'alloue généralement pas de mémoire manuellement. C'est trop aisé de se tromper.

    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
    #include <vector>
     
    using namespace std;
     
    vector<MOY> AllocMOY()
    {
       int qte = 10;
       vector<MOY> result(qte);
       moy[2].number = 10;
    }
    int main()
    {
       vector<MOY> moy = AllocMOY();
       cout << moy[2];
    }
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Membre confirmé Avatar de Topeur
    Profil pro
    Inscrit en
    Février 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 91
    Par défaut Ca tourne
    Veuillez m'excuser d'avoir poster dans le forum C++ (au depart, depuis ca a été deplacé !)
    Je travaille en C++ mais la personne qui avait besoin de cette reponse bosse elle en C.

    J'ai testé et ca marche, en revanche j'aurai encore une tout petite question sur votre solution en C

    Pourquoi ceci marche
    Mais pas ca
    Cela normalement reviens au même je pensais et pourtant, avec la flèche, cela plante le code.
    Merci pour votre rapidité de reponse en tout cas

  5. #5
    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
    implique que moy est un pointeur sur un tableau de structures
    implique que moy est un tableau de pointeurs sur structure

    Ce qui n'est pas la même chose.

    En terme des opérateurs . (point) et *, le premier est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (*(*moy+2)).number = 10
    et le second à

  6. #6
    Membre confirmé Avatar de Topeur
    Profil pro
    Inscrit en
    Février 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 91
    Par défaut
    Merci pour ces explications

    La difference est assez subtil mais j'ai finis par comprendre le truc
    Je crois que je vais garder ca quelquepart de coté !

    Merci encore

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

Discussions similaires

  1. passer un tableau en argument dans une fonction
    Par rogerio dans le forum Débuter
    Réponses: 6
    Dernier message: 30/10/2008, 12h15
  2. Réponses: 6
    Dernier message: 08/10/2007, 13h50
  3. Réponses: 6
    Dernier message: 24/07/2006, 15h22
  4. Réponses: 10
    Dernier message: 30/06/2006, 17h41
  5. Passer un tableau en parametre dans une fonction js
    Par hellmaster78 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 19/06/2005, 14h35

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