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 :

passer une structure en parametre d'une fonction


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2002
    Messages : 48
    Points : 44
    Points
    44
    Par défaut passer une structure en parametre d'une fonction
    Bonjour,

    J'ai des structure, (definie avec typedef struct{} ),

    J'ai une fonction qui doit me servir a faire passer ces structures, avec en parametre:
    un int, puis les donnees (contenant la structure)

    Message(int nType, struct myStruct);

    est il possible d'avoir une fonction sans preciser le type de la structure, mais en le castant apres (grace au type) ?

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 572
    Points
    41 572
    Par défaut
    Non, tu ne peux pas caster de structure en structure.
    Par contre, on peut caster des pointeurs vers structure, mais là, tu n'as pas vraiment l'air de savoir ce que tu fais, alors n'y pense même pas: Réfléchis en profondeur avant...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre actif Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Points : 214
    Points
    214
    Par défaut
    meme si tu pense que c'est pas une solution pour lui, d'autres pourraient etre intéressé, donc tu pourrais quand meme donner la solution.

    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 blabla()
    {
        struct maStructure b;
        b.x = 2;
        b.y = 3;
        int j = ouai( 1, &b);
    }
     
    int ouai(int h, void *ptr)
    {
        struct maStructure *s = NULL;
     
        if(h==1)
           s = (struct maStructure*)ptr;
     
        if(s != NULL)
           printf("%d, %d\n", s->x, s->y);
        else
            return 0;
        return 1;
    }
    si tu ne comprends pas cet exemple, en effet, tu devrais passer par une autre methode.
    Colère et Haine mènent à la Puissance

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 572
    Points
    41 572
    Par défaut
    là par contre, je remplacerais le cast de type C par un static_cast (sur un void*, un static_cast suffit).

    Cela évitera des erreurs si un jour le pointeur est passé en const...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre actif Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Points : 214
    Points
    214
    Par défaut
    "static_cast", je ne connaissait pas, j'en apprend tous les jours! je vais me renseigner dessus. merci pour cette info
    Colère et Haine mènent à la Puissance

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 572
    Points
    41 572
    Par défaut
    ce sont les opérateurs de cast du C++ : Ils sont plus restrictifs, donc permettent moins d'erreurs.

    Par exemple, static_cast et reinterpret_cast ne permettent en aucun cas de caster un pointeur const en pointeur non-const.
    Si on se retrouve acculé à le faire, il faut employer explicitement l'opérateur const_cast pour cela (ou un cast de type C).

    Je me demande s'il existe un paramètre de GCC pour interdire les casts de type C, mais malheureusement certains headers de la STL en contiennent...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 109
    Points : 121
    Points
    121
    Par défaut
    est il possible d'avoir une fonction sans preciser le type de la structure, mais en le castant apres (grace au type) ?
    Oui mais pour cela, il faut organiser tes structures en héritage. Comme ça, pas besoin de déterminer le type.
    Si tous les types sont connus à la compilation, tu peux même opter pour des templates.


    Pouurais-tu nous donner un exemple en code de ce que tu veux faire?

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    L'équivalent plus typesafe et maintenable à ça :

    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
    void Fonction(int Type, void* Data)
    {
        switch (Type)
        {
            case 1 :
            {
                Struct1* s = reinterpret_cast<Struct1*>(Data);
                F1(s);
                break;
            }
            case 2 :
            {
                Struct2* s = reinterpret_cast<Struct2*>(Data);
                F2(s);
                break;
            }
            case 3 :
            {
                Struct3* s = reinterpret_cast<Struct3*>(Data);
                F3(s);
                break;
            }
     
            ...
        }
    }
    C'est ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void Fonction(Struct1 s)
    {
        F1(s);
    }
     
    void Fonction(Struct2 s)
    {
        F2(s);
    }
     
    void Fonction(Struct3 s)
    {
        F3(s);
    }
    En règle générale.

  9. #9
    Membre actif Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Points : 214
    Points
    214
    Par défaut
    la je comprend rien,
    F1, F2, F3, c'est des fonctions qui contiennent quoi?
    Colère et Haine mènent à la Puissance

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par keil
    la je comprend rien,
    F1, F2, F3, c'est des fonctions qui contiennent quoi?
    Rien de spécial, c'est juste une manière de dire qu'après tu fais ce que tu veux de ton instance s, et pas forcément la même chose pour chaque type.

  11. #11
    Membre actif Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Points : 214
    Points
    214
    Par défaut
    ok, j'ai capté!
    tu surcharge la fonction Fonction.
    mais bon, baert ne nous a pas dit si son paramètre 'type' etait destiné a faire des tests sur la type de structure.
    de plus, en admettant que la fonction à appeler soit un callback (une thread par exemple), la surchage ne résoud rien.

    pour une thread, la fonction doit avoir une syntaxe précisée.
    pour la SDL par exemple:
    SDL_Thread *SDL_CreateThread(int (*fn)(void *), void *data);

    on remarque qu'il faut que la fonction passée en argument soit du type:
    int nomDeLaThread(void *);

    donc inutile à surcharger.

    en balancant
    int maThread(struct maStructure*);
    SDL_CreateThread(maThread, NULL);

    il y a de bonne chance que ça ne compile ou ne link pas
    Colère et Haine mènent à la Puissance

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    J'ai bien sûr supposé d'après ce qui a été dit que c'est notre ami qui concevait et codait ce mécanisme, s'il doit juste utiliser une fonction existante alors le débat est clos.

  13. #13
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    Si ce thread est fini, peut-on le mettre en tant que "RESOLU" ?

    Merci
    Nul ne peut mieux connaitre la connaissance qu'elle-même.

Discussions similaires

  1. Passer un contrôle en paramètre d'une fonction
    Par Kinian dans le forum Access
    Réponses: 6
    Dernier message: 15/05/2006, 11h15
  2. Réponses: 7
    Dernier message: 08/04/2006, 12h18
  3. Tableau de structures en parametre d'une fonction
    Par -No Comment- dans le forum C
    Réponses: 19
    Dernier message: 29/03/2006, 15h00
  4. Réponses: 6
    Dernier message: 12/02/2006, 18h02
  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