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 :

Envoyé l'adresse d'une variable d'une structure


Sujet :

C

  1. #1
    Membre éclairé
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Points : 812
    Points
    812
    Par défaut Envoyé l'adresse d'une variable d'une structure
    Bonjour,
    Je souhaite retrouver l'adresse d'une variable contenue dans une structure, mais je sais pas comment faire...

    Voici ma structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct Perso Perso;
    struct Perso
    {
        SDL_Rect position;
    	char table_sprite[100];
    	int typeMvt,numMvt;
    };
    on créé une variable de ce type...
    [suite du programme]

    Et ensuite il faudrait que j'envoi l'adresse de la variable "Position" de la structure Perso... Mais je ne sais pas comment faire...
    J'ai bidouillé mon Heros.position avec des *,&,->.... j'ne trouve pas la bonne solution...
    Peut on m'aider?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Points : 380
    Points
    380
    Par défaut
    C'est pourtant assez simple, tu as cité dans ta petite liste l'opérateur qu'il faut utiliser. Ce que tu veux c'est l'adresse d'une variable, il faut donc utiliser le &, l'opérateur -> c'est pour accéder aux variables d'un pointeur sur une structure, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Perso *heros;
    // Initialisation de heros, je l'ai pas mise
    // mais faut pas l'oublier
     
    heros->typeMvt = 5; // accès à un champ de heros
    L'opérateur . c'est comme -> mais lorsqu'on a une structure et non plus un pointeur sur une structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Perso heros;
     
    heros.typeMvt = 5; // accès à un champ de heros
    Le fait est qu'une fois que tu as accédé à ta variable tu peux en récupérer l'adresse avec l'opérateur &, ce qui donne donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_Rect *ptrPosition = &heros.position;
    L'opérateur . étant prioritaire sur l'opérateur &, tu accèdes d'abord au champ "position" de heros avant d'en récupérer l'adresse et de l'affecter à ptrPosition. Tu peux bien sûr mettre "&heros.position" directement dans un appel de méthode.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par PsychoH13 Voir le message
    C'est pourtant assez simple, tu as cité dans ta petite liste l'opérateur qu'il faut utiliser. Ce que tu veux c'est l'adresse d'une variable, il faut donc utiliser le &, l'opérateur -> c'est pour accéder aux variables d'un pointeur sur une structure, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Perso *heros;
    // Initialisation de heros, je l'ai pas mise
    // mais faut pas l'oublier
     
    heros->typeMvt = 5; // accès à un champ de heros
    En fait, l'écriture logique serait "(*heros).typeMvt=5" mais comme cette écriture deviendrait vite lourde, l'opérateur "->" a été créé pour remplacer ça...

  4. #4
    Membre éclairé
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Points : 812
    Points
    812
    Par défaut
    J'initialise bien le perso...
    mais en fait, voilà la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void majSprite(Perso *Personnage, SDL_Surface *ecran){
    	SDL_Surface *sprite;
    	SDL_Rect rogne,position;
     
    	rogne.x = (Personnage->numMvt) * 48;
    	rogne.y = (Personnage->typeMvt) * 48;
    	rogne.h = 48;
    	rogne.w = 48;
    	position.x = 100;
    	position.y = 100;
     
    	sprite = SDL_LoadBMP(Personnage->table_sprite);
    	SDL_BlitSurface(sprite, &rogne, ecran, Personnage);
    }
    J'envoi l'adresse de la structure à la fonction.
    Le probleme est dans la fonction SDL_BlitSurface();
    Il demande dans le dernier argument, l'adresse d'une variable de type SDL_Rect, et donc moi je veux passer le "position" de la structure Personnage.
    Or Personnage, à lui meme est deja une adresse dans cette fonction, et donc ne marquer que "Personnage" fonctionne, mais j'comprends pas pourquoi j'ai pas besoin de preciser Personnage.position ( qui d'ailleurs ne fonctionne pas, ainsi que toutes vos propositions au dessus. )
    Comment sait il qu'en envoyant juste Personnage, il va prendre automatiquement position?

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Il ne faut pas passer la structure Personnage mais l'adresse de la structure de type SDL_Rect donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_BlitSurface(sprite, &rogne, ecran, & Personnage->position);

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Points : 380
    Points
    380
    Par défaut
    Citation Envoyé par ZouBi Voir le message
    Or Personnage, à lui meme est deja une adresse dans cette fonction, et donc ne marquer que "Personnage" fonctionne, mais j'comprends pas pourquoi j'ai pas besoin de preciser Personnage.position ( qui d'ailleurs ne fonctionne pas, ainsi que toutes vos propositions au dessus. )
    Comment sait il qu'en envoyant juste Personnage, il va prendre automatiquement position?
    Alors ça c'est une très grave incompréhension du C. Ce n'est pas parce que ton compilateur ne te fait pas de reproche qu'il n'y a pas un problème. Les pointeurs ont cette particularité de tous se ressembler donc on peut facilement utiliser un pointeur à la place d'un autre mais ça, ça pose problème. Quand on te demande de mettre un SDL_Rect* est-ce que tu crois qu'il est raisonnable de donner à ta fonction un Perso* (type de ton personnage) ? Je te dis la réponse est Non, et c'est d'ailleurs dangereux !

    Je te l'ai expliqué déjà. Pour avoir l'adresse d'une variable, il faut utiliser l'opérateur &, si la variable en question est dans une structure, il faut d'abord récupérer la variable elle-même avec les opérateurs "." s'il s'agit d'une structure, et "->" s'il s'agit d'un pointeur sur une structure.

    Donc ici ton code donne tout simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void majSprite(Perso *personnage, SDL_Surface *ecran){
    	SDL_Surface *sprite;
    	SDL_Rect rogne,position;
     
    	rogne.x = (personnage->numMvt) * 48;
    	rogne.y = (personnage->typeMvt) * 48;
    	rogne.h = 48;
    	rogne.w = 48;
    	position.x = 100;
    	position.y = 100;
     
    	sprite = SDL_LoadBMP(personnage->table_sprite);
    	SDL_BlitSurface(sprite, &rogne, ecran, &personnage->position);
    }
    &personnage->position se lit : "adresse du champ "position" de la structure pointée par "personnage". Et là tu envoies le bon type à ta fonction.

    PS : les conventions de nommage indique que le type doivent commencer par une majuscule et les variables par une minuscule, c'est pour ça que j'ai enlever la majuscule à "personnage" car il s'agit d'une variable.

  7. #7
    Membre éclairé
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Points : 812
    Points
    812
    Par défaut
    ok merci bien !
    J'comprends bien ces histoires de passage par valeur et adresse, pointeur et tout... meme si j'laissais paraitre le contraire.
    M'enfin voilà, vous m'avez donné la solution à mon probleme :
    &personnage->position
    et j'vous en remercie bien !

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par ZouBi Voir le message
    ok merci bien !
    J'comprends bien ces histoires de passage par valeur et adresse
    En C tous les passages d'arguments se font par copie uniquement !

Discussions similaires

  1. [Débutant] Affecter une variable d'une classe C# à une variable Javascript
    Par SultanGeek dans le forum C#
    Réponses: 0
    Dernier message: 20/06/2015, 20h42
  2. Mettre une valeur d'une table dans une variable
    Par Raphou96 dans le forum Access
    Réponses: 5
    Dernier message: 06/02/2006, 15h19
  3. faire passer une variable d'une fct js à une page php
    Par harlock59 dans le forum Langage
    Réponses: 1
    Dernier message: 25/11/2005, 14h41
  4. Affecter une variable javascript à une variable php
    Par gwendy dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 17/10/2005, 20h58
  5. Désigner une variable avec une variable?
    Par littleman dans le forum Paradox
    Réponses: 4
    Dernier message: 12/08/2002, 11h21

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