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 :

POD & arithmétique de pointeur


Sujet :

C++

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut POD & arithmétique de pointeur
    Hello,

    Soit le morceau de code suivant :
    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
     
    struct float3
    {
        float x;
        float y;
        float z;
    }
     
    float3 variable;
     
    variable.x = 1.5f;
    variable.y = 5.2f;
    variable.z = 8.3f;
     
    std::cout << &(variable) << std::endl;
    std::cout << sizeof(float) << std::endl;
    std::cout << &(variable + sizeof(float)) << std::endl;
    std::cout << &(variable.x) << std::endl;
    std::cout << &(variable.y) << std::endl;
    std::cout << &(variable.z) << std::endl;
    La sortie est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    0012FE1C
    4
    0012FF60
    0012FE1C
    0012FE20
    0012FE24
    Je ne m'explique pas la valeur de la 3ème ligne. Selon moi, elle aurait dû être identique à la 5ème.

    En revanche, si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    float* dodo = reinterpret_cast<float*>(&(variable));
    dodo++;
    J'obtiens la bonne valeur.

    Si quelqu'un a une explication... Merci.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 209
    Points
    23 209
    Par défaut
    Bonjour,

    Le compilateur est parfois amené à ajouter des bits/octets de padding pour des raisons de performances.
    Sinon :
    std::cout << &(variable + sizeof(float)) << std::endl;.
    Ne serais-ce pas plutôt : std::cout << (void *)&variable + sizeof(float) << std::endl; ?

    D'ailleurs je trouve bizarre que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    variable + sizeof(float)
    compile alors que tu ne semble pas avoir défini un opérateur d'addition entre un float3 et un size_t (?).

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Ne serais-ce pas plutôt : std::cout << (void *)&variable + sizeof(float) << std::endl; ?
    Si, tout à fait.

    Citation Envoyé par Neckara Voir le message
    D'ailleurs je trouve bizarre que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    variable + sizeof(float)
    compile alors que tu ne semble pas avoir défini un opérateur d'addition entre un float3 et un size_t (?).
    En fait, j'ai fait une erreur dans la copie du code. C'était évidemment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    &variable + sizeof(float)
    .

    Ce qui m'amène à ma grossière erreur : quand on fait une addition à un pointeur, c'est déjà multiiplé par la taille dy type...

    Du coup, c'est (&variable)++ que j'aurais dû faire.
    Sauf que je dois passer par une variable transitoire (pas possible de faire ++ sur une rvalue).

    À cause de ta réponse trop rapide, je n'ai pas pu effacer mon 1er message. Je vais avoir droit aux quolibets demain.

    Ça faisait vraiment longtemps que je n'avais pas fait d'arithmétique des pointeurs... Et puis bon, il est tard. :-p

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 186
    Points : 17 126
    Points
    17 126
    Par défaut
    tu as aussi la possibilité de (&variable)+1. En effet, ++ est presque équivalent à +=1.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

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

Discussions similaires

  1. Exercice tordu sur l'arithmétique des pointeurs
    Par Tamzoro dans le forum Débuter
    Réponses: 5
    Dernier message: 20/04/2015, 17h26
  2. Arithmétique des pointeurs
    Par Tamzoro dans le forum Débuter
    Réponses: 9
    Dernier message: 25/08/2014, 00h48
  3. Arithmétique de pointeurs
    Par clems_t dans le forum C
    Réponses: 7
    Dernier message: 20/09/2013, 17h25
  4. Réponses: 4
    Dernier message: 23/04/2013, 16h39
  5. djgpp et pointeurs far
    Par elvivo dans le forum C
    Réponses: 2
    Dernier message: 13/07/2002, 01h44

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