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 :

Se jouer des types avec les void*?


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2006
    Messages : 122
    Par défaut Se jouer des types avec les void*?
    Hoy les gens!

    Aller un ptit problème, ça faisait longtemps.

    Je cherche à écrire une fonction "touche à tout" dans l'optique d'un jeu que je programme en c++.

    J'ai créé une classe Event qui, à partir d'un enum et quelques paramètre, exécute une (ou plusieurs) fonctions des différentes classe de mon jeu.

    Le hic bien sur, c'est qu'aucune classe n'a le même paramètre. Mon idée est donc d'utiliser le void* pour récupérer ces paramêtres. Je dirais même mieux : utiliser un vecteur de void*.

    J'ai donc cette class :
    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
    class Event
    {
     
    	public:
    		enum EventType
    		{
    			BACKGROUND_SPEED
    		};
    		Event();
    		Event(EventType type, std::vector<void*> params);
    		void DoEvent();
    		static EventType GetEventFromName(std::string name);
    	private:
     
    		EventType type;
    		std::vector<void*> params;
    };
    Et je cherche à écrire cette 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
    15
    16
    17
    18
    19
     
    void Event::DoEvent()
    {
    	switch(type)
    	{
    		case BACKGROUND_SPEED:
    			{
    				std::cout << "Event BACKGROUND_SPEED exécuté" << std::endl;
    				Background *b =(Background *)(params[0]);
    				float * ts = static_cast<float *>(params[1]);
    				float * a = static_cast<float *>(params[2]);
    				std::cout << "Targeted_speed = " << *ts << ", acceleration = " << *a << std::endl;
    				b->SetTargetedSpeed(*ts, *a);
    			}
    			break;
    		default:
    			break;
    	}
    }
    les variables "type" et "params" sont créé et passé à l'objet event via son constructeur comme suis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::vector<void*> params;
    params.push_back(&background);       // Pointeur vers une instance de Background
    params.push_back(&targeted_speed); // Doit valoir 100.0
    params.push_back(&acceleration);     // Doit valoir 1000.0
    Event evnt = Event(Event::GetEventFromName("background_speed"), params);
    Pour résumer : Je passe à mon Event un vecteur de void * qui sert à stocker les paramètres quelque soit leur type. Le premier élément du vecteur est un pointeur sur l'objet dont on va faire l'appel à la fonction désirée, les éléments suivant sont les différents paramètre pour la fonction.

    Les std::cout me donne ça sur ma sortie standard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Event BACKGROUND_SPEED exécuté
    Targeted_speed = -1.07374e+008, acceleration = -1.07374e+008
    Appel à Background::SetTargetedSpeed     // Cette ligne montre que le b->SetTargetedSpeed est bien appelé, on note un changement lors de l'exécution du jeu, mais pas le changement souhaité
    Voila, donc la ptite chançon habituelle : "Pourquoi ça marche paaaaaaaaas? Qu'est-ce que j'ai mal faaaaaais?"

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 638
    Par défaut
    Salut,

    Peut être devrais tu t'inspirer de cet article sur le type erasure...

    Ou, si tu en a l'occasion, tu pourrais aussi envisager d'utiliser la bibliothèque boost any
    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

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2006
    Messages : 122
    Par défaut
    Une bonne nuit de sommeil et le problème m'est apparus une fois le premier pied posé par terre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::vector<void*> params;
    params.push_back(&background);       // Pointeur vers une instance de Background
    params.push_back(&targeted_speed); // Doit valoir 100.0
    params.push_back(&acceleration);     // Doit valoir 1000.0
    Event evnt = Event(Event::GetEventFromName("background_speed"), params);
    J'ai simplement oublié que les données en paramètres ici ne sont dans une fonction appelée un fois en début de programme, donc les pointeurs finissent par perdre les objets vers lesquels ils pointent.

    J'ai simplement fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    params.push_back(new float(targeted_speed)); // Doit valoir 100.0
    params.push_back(new float(acceleration));     // Doit valoir 1000.0
    avec les delete qui vont bien dans ma fonction DoEvent, une fois la fonction voulu appelée.

    Le code marche très bien après la modification.

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

Discussions similaires

  1. Gestion des transactions avec les composants DOA
    Par lper dans le forum Bases de données
    Réponses: 2
    Dernier message: 01/12/2008, 16h06
  2. Linux à des problèmes avec les brevets
    Par bilb0t dans le forum Linux
    Réponses: 15
    Dernier message: 21/11/2006, 13h54
  3. Exporter des données avec les insert
    Par maximenet dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 03/04/2006, 16h20
  4. [vb.net]Gestion des exceptions avec les web services
    Par mvr dans le forum Windows Forms
    Réponses: 2
    Dernier message: 05/12/2005, 22h41
  5. [Eclipse] [VE] Créer des menus avec les classes SWT de VE
    Par jbcorens dans le forum SWT/JFace
    Réponses: 3
    Dernier message: 30/08/2005, 12h25

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