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 l'adresse d'une structure


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Points : 55
    Points
    55
    Par défaut Retourner l'adresse d'une structure
    Bonsoir.

    Comment faire pour qu'un fonction retourne l'adresse d'une structure ??


    Merci d'avance

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct 
    {
        int i;
    } structToto;
     
    structToto* fonctiontoto()
    {
       [...]
        return &sToto; //la variable est de type structToto
    }
    Hope it helps.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Points : 55
    Points
    55
    Par défaut
    Je pense que ça ira, merci

  4. #4
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Points : 55
    Points
    55
    Par défaut
    Et mince... Petit problème...

    En fait, ma structure est déja déclarée dans ma classe, et c'est un pointeur car je fais une allocation dynamique pendant le programme. Ainsi, ma fonction doit retourner l'adresse d'une partie du tableau de structure en question.

    Comment faire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct Data_Texture_Sol C_Terrain::*Get_DataTextureSol(int TextureSol)
    {
        return &Data_TextureSol[TextureSol];
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class C_Terrain
    {
    private:
    [...]
    struct Data_Texture_Sol *Data_TextureSol;
    public:
     
    struct Data_Texture_Sol *Get_DataTextureSol(int TextureSol);
    };

  5. #5
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Si j'ai bien compris, Data_TextureSol est un tableau? Si oui, alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class C_Terrain
    {
    private:
    [...]
    Data_Texture_Sol *Data_TextureSol; //pas de struct en début de ligne
    public:
     
    Data_Texture_Sol *Get_DataTextureSol(int TextureSol); //pas de struct en début de ligne
    };
    [/quote]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     Data_Texture_Sol* C_Terrain::Get_DataTextureSol(int TextureSol)
    {
        if (TextureSol<size) //size=taille de ton tableau
        {
            return &Data_TextureSol[TextureSol];
        }
        else
        {
            return NULL;
        }
    }
    Ce code devrait fonctionner, mais il est absolument horrible.

    Dans une optique purement didactique, je me permet de le corriger un peu:
    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
    #include <vector>
    typedef struct 
    {
        int toto;
    } Data_Texture_Sol;
     
    class CTerrain  // Evite de mette des "_" partout, ça rend le code inutilement illisible
    {
    private:
        [...]
            std::vector<Data_Texture_Sol*> m_DataTextureSolList; //l'utilisation du template vector est infiniment préférable à un tableau de type C
    //de plus, utilise de préférence un tableau de pointeurs, c'est plus souple
    //enfin, l'utilisation du préfixe "m_" indique qu'il s'agit d'une variable membre. C'est une convention utilisée par beaucoup de développeur.
    public:    
        Data_Texture_Sol* GetDataTextureSol(int iIndex); //la pertinence des noms de variables est importante. De plus, le mot "index" représente un concept ultra fréquent en programmation.
    };
     
    Data_Texture_Sol* CTerrain::Get_DataTextureSol(int iIndex)
    {
        if (iIndex<m_DataTextureSolList.size())
        { // toujours tester la validité d'un indice quand on attaque un tableau
            return m_DataTextureSolList.at(iIndex);
        }
        else
        {
            return NULL;
        }
    }
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    On en fait pas de typedef struct machin {} en C++, le typedef ne sert plus
    Je plussoie r0d

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Points : 55
    Points
    55
    Par défaut
    Merci Rod, là j'ai pas le temps, j'étudierai le code demain. Les vecteurs n'ont-ils pas un résultat en performances plus faibles ?? Prennent-ils plus de ressources ??

    Encore merci

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Les performances, c'est à laisser pour la phase d'otimisation lorsqu'on a vérifié que le goulot d'étranglement était à ce niveau. Que ce soit pour la consommation CPU ou mémoire. Après profiling.

  9. #9
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Et puis de toutes façon, je pense qu'en général un vector est plus efficace, autant en ce qui concerne les performances que le poids des données. En effet, les conteneurs de la stl sont optimisés à tous les niveaux.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  10. #10
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Points : 55
    Points
    55
    Par défaut
    Ok, je crois que je vais me mettre à utiliser beaucoups plus souvent les vector.

    Par contre, j'ai une petite question... Je comprends pas trop comment tu veux que j'utilise des pointeurs ?

    Dans mon programme, j'initialise les structures sans pointeur, et je donne l'adresse de la structure à chacun de mes cases...

    Concernant les données membres, si je fais un pointeur vers ces données, j'enlève le m_ dans le nom du pointeur je suppose ? Ou y-a-il un nom spécial pour les pointeurs ?

    Je reposterai peut-etre si j'ai d'autres questions... Encore merci

  11. #11
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par insomniak
    Ok, je crois que je vais me mettre à utiliser beaucoups plus souvent les vector.
    En voilà une bonne résolution

    Citation Envoyé par insomniak
    Par contre, j'ai une petite question... Je comprends pas trop comment tu veux que j'utilise des pointeurs ?

    Dans mon programme, j'initialise les structures sans pointeur, et je donne l'adresse de la structure à chacun de mes cases...
    Je ne comprends pas ton problème :/

    Citation Envoyé par insomniak
    Concernant les données membres, si je fais un pointeur vers ces données, j'enlève le m_ dans le nom du pointeur je suppose ? Ou y-a-il un nom spécial pour les pointeurs ?
    le préfixe m_ signifie que la variable appartient à la classe. En c++, on est toujours dans une classe. Les variables que tu déclare dans ta classe (dans le .h) commencerons toutes par m_. Les autres variables (paramètres des méthodes, variables locales, etc.) n'auront pas ce suffixe.
    Pour les pointeurs, on utilise p. Par exemple un pointeur sur un objet de type Toto sera déclaré ainsi: Toto* pToto; Et si cette variable est membre de la classe, donc déclarée dans le .h, elle sera notée m_pToto.

    Hope it helps.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  12. #12
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Ces histoires de m_ devant les variables, ça vient des tréfonds de la programmation, la notation hongroise, ...
    On peut largement s'en passer.

  13. #13
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    En effet, je plussoie. En fait, dans cette discussion, j'ai mis l'accent sur cette notation car je voulais exprimer que le nommage est important. Après c'est sût qu'on utilise la convention que l'on souhaite. CErtains utilisent leurs propres conventions. Et s'il y en a certaines que je n'apprécie pas particulièrement (comme le fait de mettre un _ avant, pour les variables membre), l'important est d'en utiliser une. Depuis quelque temps, j'utilise plutôt celle préconisée par Herb Sutter, en mettant des _ après le nom de variable.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

Discussions similaires

  1. Adresse d'une structure inconnue
    Par will74 dans le forum C
    Réponses: 12
    Dernier message: 05/01/2011, 22h41
  2. Retourner l'adresse d'une instance ou None
    Par pfeuh dans le forum Général Python
    Réponses: 9
    Dernier message: 21/09/2010, 19h59
  3. retourne l'adresse d'une variable locale ou temporaire
    Par jojo000 dans le forum Débuter
    Réponses: 10
    Dernier message: 12/06/2009, 11h11
  4. Réponses: 11
    Dernier message: 09/05/2006, 09h34
  5. Ecrire l'adresse d'une structure dans un uint32
    Par Steph12 dans le forum C++
    Réponses: 6
    Dernier message: 17/03/2005, 16h31

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