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 :

Utilisation de l'adresse d'un objet temporaire


Sujet :

C++

  1. #1
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut Utilisation de l'adresse d'un objet temporaire
    Bonjour,

    j'ai une fonction comme ceci, qui est déjà dans la bibliothèque:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_FillRect(SDL_Surface *surf, SDL_Rect *dest, Uint32 color);
    Et donc, j'ai fait une fonction pour créer un rectangle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SDL_Rect SDL_CreateRect(Sint16 x, Sint16 y, Uint16 w, Uint16 h)
    {
        SDL_Rect r = {x, y, w, h};
        return r;
    }
    Et je fais ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_FillRect(surf, &SDL_CreateRect(0, 0, 100, 100), 0);
    Le problème c'est que j'ai un warning:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C:\Users\Dave\Documents\CODING\projets\teambuilder\teambuilder.cpp:553: warning: taking address of temporary
    Je ne sais pas si ça peut causer une erreur, dans l'implémentation que j'en ai faite, et sinon comment faire disparaître le warning?

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par coyotte507 Voir le message
    Bonjour,

    j'ai une fonction comme ceci, qui est déjà dans la bibliothèque:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_FillRect(SDL_Surface *surf, SDL_Rect *dest, Uint32 color);
    Et donc, j'ai fait une fonction pour créer un rectangle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SDL_Rect SDL_CreateRect(Sint16 x, Sint16 y, Uint16 w, Uint16 h)
    {
        SDL_Rect r = {x, y, w, h};
        return r;
    }
    Et je fais ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_FillRect(surf, &SDL_CreateRect(0, 0, 100, 100), 0);
    Le problème c'est que j'ai un warning:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C:\Users\Dave\Documents\CODING\projets\teambuilder\teambuilder.cpp:553: warning: taking address of temporary
    Je ne sais pas si ça peut causer une erreur, dans l'implémentation que j'en ai faite, et sinon comment faire disparaître le warning?
    Ce que tu fait est proscrit: tu créer une variable temporaire stockée sur la pile qui est détruite à la sortie de SDL_CreateRect() (parce qu'on dépile la pile), mais tu l'utilise quand même ensuite. Si SDL_FillRect() utiliser ne serait-ce qu'une variable temporaire initialisée, son addresse risque fort d'être la même que celle de ton rectangle.

    Tu peux faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void fill_rect(SDL_Surface *surf, Uint16 x, Uint16 y, Uint16 w, Uint16 h, Uint16 color)
    {
      SDL_Rect r = {x, y, w, h};
      SDL_FillRect(surf, &r, color);
    }
    Je te déconseille aussi de créer des fonctions extérieures à une librairie mais dont le nom utilise le même préfixe. Si dans 1 an tu relis ton code tu ne sauras plus (sans avoir à faire d'allers-retours dans le code) si telle ou telle fonction est une fonction SDL ou non.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Merci,

    C'est ce que je voulais savoir

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Ce que tu fait est proscrit: tu créer une variable temporaire stockée sur la pile qui est détruite à la sortie de SDL_CreateRect() (parce qu'on dépile la pile), mais tu l'utilise quand même ensuite. Si SDL_FillRect() utiliser ne serait-ce qu'une variable temporaire initialisée, son addresse risque fort d'être la même que celle de ton rectangle.
    Je dirais plutôt que le temporaire est détruit à la sortie de SDL_FillRect. Non ? (J'ai toujours du mal avec la durée de vie des temporaires).

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Montag Voir le message
    Je dirais plutôt que le temporaire est détruit à la sortie de SDL_FillRect. Non ? (J'ai toujours du mal avec la durée de vie des temporaires).
    Non: le temporaire est détruit à la fin du bloc qui l'a créé (durée de vie dite "automatique"). Dans ce cas, la variable est créée dans le corps de SDL_CreateRect(), elle n'existe donc plus à la sortie de cette fonction.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Lors du :
    Une copie de r est créée, c'est donc son adresse qui est utilisée (je crois d'ailleurs que ce n'est pas autorisé par le standard...). Je pense qu'ensuite cette copie est détruite à la sortie de SDL_FillRect.

  7. #7
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut,

    moi aussi ça m'intrigue,

    j'enlève le résolu pour le moment.

Discussions similaires

  1. utiliser la même instance d'un objet plusieurs fois
    Par mhamedbj dans le forum NetBeans
    Réponses: 7
    Dernier message: 08/03/2007, 18h28
  2. Réponses: 9
    Dernier message: 22/07/2006, 22h51
  3. operator<< : n'affiche que l'adresse de l'objet..
    Par skrenit0 dans le forum C++
    Réponses: 10
    Dernier message: 30/04/2006, 17h25
  4. [POO] copie de l'adresse d'un objet
    Par Wormus dans le forum Langage
    Réponses: 11
    Dernier message: 30/01/2006, 14h48
  5. utiliser un script pour inserer des objets 3D
    Par s_mihai dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 09/08/2005, 13h52

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