1. #1
    Membre du Club
    Profil pro
    Inscrit en
    décembre 2009
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2009
    Messages : 149
    Points : 66
    Points
    66

    Par défaut Pointeurs vers pointeurs: toujours un tableau multidimensionnel?

    Bonjour,
    En développant un webservice avec Gsoap, je me suis retrouvé face a quelque chose de nouveau pour moi (en même temps je fais pas souvent de c++), un pointeurs vers un pointeurs que voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class SOAP_CMAC Sitet_USCOREsiteArray
    {
    public:
    	Site__t_USCOREsite **__ptr;
    [...]
    En cherchant un peu, j'ai pu trouver comment accéder aux différentes valeurs inclues dans ce pointeur vers pointeur. Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    T_USCOREsiteControllerBindingProxy		mySite_SiteWebService;
    Site__getActionSiteCloudResponse		siteWithActionCloud;
    int							i;
    Site__t_USCOREsite				site;
     
    mySite_SiteWebService.getActionSiteCloud("TO_SYNC", siteWithActionCloud);
    for (int i = 0; i < siteWithActionCloud.return_->__size; i++)
    {
    	site=*(siteWithActionCloud.return_->__ptr[i]);
    	cout << "my cell: " << site.f_USCOREsite_USCOREid << endl;
    }
    Mon code marche c'est le principale, mais j'aimerai bien maintenant comprendre cette notion!
    En fait ce que je ne comprends pas c'est ce qui fait que __ptr est un tableau et que je peux donc appeler __ptr[i]. Comme je l'avais compris, __ptr est une adresse pointant elle même sur une autre adresse dont la valeur contient mon objet? Mais bon, je vois bien que mon raisonnement ne tiens pas debout parce que dans ce cas *(siteWithActionCloud.return_->__ptr[i]) devrait me retourner la valeurs de __ptr, c'est a dire une adresse, or la j'ai bien la valeur de mon deuxième pointeur, c'est a dire mon objet. Est ce le fait d'utiliser __ptr[i] qui "saute" le premier pointeur? Une variable de type monObj **__obj sera t elle toujours un tableau multidimensionnel?

    Bref, désolé si je suis un peu confus c'est justement pour ne plus l'être que je pose ces questions. Si vous avez des indication pour m'éclairer ou de bons tuto pour comprendre la notion, je suis preneur!
    Merci.

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

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

    Informations forums :
    Inscription : septembre 2005
    Messages : 26 741
    Points : 39 184
    Points
    39 184

    Par défaut

    Ici, je pense qu'on ne peut pas vraiment parler de tableau multidimensionnel, vu que la "seconde dimension" semble être toujours un.

    Pour moi, c'est juste un "tableau de pointeurs". Et vu qu'il est question de C++, il est possible que la classe Site__t_USCOREsite fasse partie d'une hiérarchie de classe avec des fonctions membres virtuelles (ce qui nécessite d'utiliser un pointeur, même si de nos jours le fait d'utiliser des pointeurs nus pour ça est de mauvais goût).

    Dans d'autre cas, on peut avoir un "pointeur de tableau" par exemple en paramètre d'une fonction:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    int UneFonction(MaStructure **ppTableau) { *ppTableau = new int[36]; return 36; }
    Mais là aussi, ça a mauvaise réputation en C++ où les références sont privilégiées (même si les pointeurs ont l'avantage d'être explicites lors de l'appel de fonction).

    En tout cas, cela soulève l'avantage qu'il y aurait à utiliser des conteneurs C++ plutôt que des pointeurs nus. Si ton tableau était un vector<unique_ptr<Site__t_USCOREsite>>, il n'y aurait pas d'ambigüité!

    PS: Des membres publics préfixés par un double-underscore, c'est aussi de mauvais goût: Les noms préfixés d'un double-underscore sont réservés pour l'usage du compilateur, tout comme ceux préfixés d'un simple underscore sont réservés pour l'implémentation de la bibliothèque standard.
    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 du Club
    Profil pro
    Inscrit en
    décembre 2009
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2009
    Messages : 149
    Points : 66
    Points
    66

    Par défaut

    Merci Médinoc pour ta réponse.

    Ici, je pense qu'on ne peut pas vraiment parler de tableau multidimensionnel, vu que la "seconde dimension" semble être toujours un.
    Oui effectivement je me suis mal exprimé, **ptr est un tableau deux dimension, ***ptr est un tableau trois dimension, etc...
    En fait je pense avoir compris cette notion de double pointeur, ce qui me manque c'est la gestion d'un tableau monodimensionnel par pointeur, je vais potasser ça et je pense que ce sera tout de suite plus clair!

    Pour ce qui est des bonnes pratiques et des conventions, je me base ici sur le code que gsoap me fourni et je n'ai clairement pas le niveau d'aller à l'encontre de ça! Pour leur défense, je reprends ici un projet vieux de quelques années, ma version de gsoap n'est pas la dernière. En tous cas merci, pour ma culture personnel ces infications sont toujours bonnes a prendre.

Discussions similaires

  1. Pointeur sur élément d'un tableau multidimensionnel
    Par Blustuff dans le forum Langage
    Réponses: 5
    Dernier message: 12/05/2011, 01h16
  2. pointeur vers pointeur
    Par simplyc dans le forum Débuter
    Réponses: 2
    Dernier message: 01/12/2010, 14h03
  3. Réponses: 21
    Dernier message: 06/08/2009, 09h31
  4. Pointeurs vers pointeurs
    Par azertylr dans le forum C
    Réponses: 3
    Dernier message: 07/11/2007, 11h59
  5. Réponses: 6
    Dernier message: 26/05/2007, 00h33

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