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 :

Pointeurs de Structure


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2007
    Messages : 57
    Points : 7
    Points
    7
    Par défaut Pointeurs de Structure
    A l'issue d'un appel vers une API, j'ai une réponse avec un pointeur vers une structure.
    J'ai deux syntaxe dans le même code suivant le traitement à faire.

    La première syntaxe est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    STRUCTURE_1 *pObjData = (STRUCTURE_1*)pData;
    Et la deuxième est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    STRUCTURE_1* pObjData = (STRUCTURE_1*)pData;
    La différence est minime : l'Astérix "*" n'est pas placée au même endroit avant le PobjData. Dans le premier cas, l'Astérix est collé à STRCTURE_1 et dans le deuxième l'Astérix est collé à PobjData.

    1/ Est-ce le même résultat dans les deux cas ?

    2/ Sachant que le pData est le pointeur d'adressage, faut-il bien comprendre qu'il s'agit d'un transfert des donnés de la structure à l'adresse pData vers la variable PobjData en se référent au format de la structure STRUCTURE_1 ?

    3/ J'ai des lignes de code avec ce même type de syntaxe où il y a 2 Astérix. Quelle est la différence ?

    Merci beaucoup de votre aide.

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    1/ Les espaces avant ou après l'étoile n'ont aucune importance. La forme utilisée est de l'avis de chacun / de la convention d'écriture choisie. Personnellement, je n'aime pas la coller à la variable car cela fait partie du type est j'aime avoir un espace entre les 2.

    2/ Je ne sais pas ce que tu entends par transfert, mais un cast d'un pointeur à un autre ne fait que dire au compilateur que le pointeur sur A est en fait un pointeur sur B. Les données pointées ne changent pas.
    Au passage, ton cast est un cast à la C, qui n'est absolument pas sécurisé alors que le C++ propose static_cast et le risqué reinterpret_cast.

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Il n'y a aucune différence entre type *pointer(un espace entre type et l'astérisque, mais pas entre l'astérisque et l'identifiant de la donnée) et type* pointer(pas d'espace entre type et l'astérisque, mais bien entre l'astérisque et l'identifiant de la donnée). Ni même avec type * pointer (un espace entre type et l'astérisque, et un autre entre l'astérisque et l'identifiant de la donnée), ou type*pointer(aucun espace du tout.

    Certains développeurs préféreront (pour des raisons qui leur sont propres) l'une ou l'autre de ces écritures, mais cela n'aura absolument aucune incidence réelle sur le code en lui-même (hormis la lisibilité).

    Car le fait est que la grammaire à respecter consiste à fournir quatre éléments distincts (dont deux sont optionnels):
    1. un "type identifier" (un identifiant de type)
    2. un "cv qualifier" (un qualificatif de constance ou de volatilité): le mot clé const ou le mot clé volatile (optionnel)
    3. un "memory access spécifier" (un spécificateur d'accès mémoire): savoir s'il s'agit d'une valeur (sans aucun signe particulier), d'un pointeur (l'astérisque) ou d'une référence (une esperluette) (optionnel)
    4. un "data identifier" (un identifiant de donnée) dont le type correspond au deux premiers éléments.

    Or, la règle pour retrouver les "identifiants" et les mots clé est relativement simple, dans le sens ou
    • la première lettre est forcément une lettre (majuscule ou minuscule) ou un "underscore" _
    • suivie (de manière optionnelle) par un nombre inconnu de lettres (minuscule ou majuscule), de chiffres ou d'underscore _


    A partir de là, lorsque le compilateur rencontre, en début d'instruction, une lettre ou un underscore, il va considérer qu'il s'agit d'un identifiant (de type) qui s'arrête forcément au premier caractère qui ne soit ni une lettre, ni un chiffre, ni un underscore. Ce sera très souvent un espace, mais ce pourrait tout aussi bien être
    • un symbole de tabulation ('\t')
    • un retour à la ligne ('\n')
    • une esperluette &
    • une astérisque *
    • en gros: tous les autres caractères auxquels te donne accès ta table de caractères

    Si bien que ton astérisque va ** forcément ** servir de séparateur entre les deux identifiants qui sont requis, vu que ce n'est ni une lettre, ni un chiffre, ni un underscore, et qu'elle suffit parfaitement à ce rôle. Si le développeur décide d'ajouter un (ou plusieurs) espace(s) avant ou après, il sera (ils seront) d'office ignoré(s), quelle qu'en soit la forme

    Il n'y aura vraiment que si un cv_qualifier apparait dans le code qu'il faudra -- forcément -- ajouter un espace entre l'identifiant de type et le mot clé en question (et entre le mot clé et l'identifiant de donnée) pour permettre au compilateur de se rendre compte qu'il s'agit de mots séparés
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2007
    Messages : 57
    Points : 7
    Points
    7
    Par défaut
    Merci à jo_link_noir et à koala01 !

    Je crois que c'est très complet, même si j'ai un peu de mal à retrouver les "petits" car je n'ai pas la même manière de penser pour tout ce qui est C++, Puisque je suis en Windev.

    En tous cas c'est une avancée qui va me permettre de mieux comprendre les fonctions que je dois utiliser.

    Veuillez m'excuser pour le "Asterix", au lieu de astérisque, automatiquement corrigé lors de mon écriture.

    Merci encore

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 631
    Points : 10 558
    Points
    10 558
    Par défaut
    Citation Envoyé par didierma34 Voir le message
    1/ Est-ce le même résultat dans les deux cas ?
    C'est la même chose ... mais c'est assez subtil
    Les gens préfèrent coller l'astérique à la variable parce que l'astérique ne s'applique qu'à la variable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int *pvar1; // pvar1 est 1 pointeur
    int* pvar2, var1; // pvar2 est 1 pointeur, var1 est 1 entier
    int  var2, *pvar3; // pvar3 est 1 pointeur, var2 est 1 entier

    Citation Envoyé par didierma34 Voir le message
    2/ Sachant que le pData est le pointeur d'adressage, faut-il bien comprendre qu'il s'agit d'un transfert des donnés de la structure à l'adresse pData vers la variable PobjData en se référent au format de la structure STRUCTURE_1 ?
    Dans 1 pointeur, tu stockes 1 adresse d'1 variable. Il n'y a pas de transfert ni dédoublement.
    Tu as 1 variable de type STRUCTURE_1 et maintenant tu as 2 pointeurs qui pointent vers cette structure ... si pData est valide
    Le terme technique : "shallow copy"


    Citation Envoyé par didierma34 Voir le message
    3/ J'ai des lignes de code avec ce même type de syntaxe où il y a 2 Astérix. Quelle est la différence ?
    C'est l'étape d'après 1 double pointeur c'est très très souvent l'adresse d'1 pointeur.
    L'idée est de passer 1 pointeur mais qu'on veut affecter avec l'adresse d'1 nouvelle allocation. Donc ce n'est pas que des déréférencements, mais 1 [des] affectation(s)
    L'alternative c'est de retourner cette adresse.

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

Discussions similaires

  1. Réponses: 60
    Dernier message: 13/02/2007, 19h53
  2. [C#]Pointeur vers structure
    Par torNAdE dans le forum Windows Forms
    Réponses: 3
    Dernier message: 08/05/2006, 19h43
  3. Réponses: 7
    Dernier message: 08/04/2006, 12h18
  4. Pointeurs et structures...
    Par vinzzzz dans le forum C
    Réponses: 13
    Dernier message: 18/01/2006, 11h37
  5. probleme avec pointeurs de structures
    Par remi77 dans le forum C
    Réponses: 2
    Dernier message: 20/10/2003, 13h19

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