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 :

Problème de type ? Mauvais cast?


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Par défaut Problème de type ? Mauvais cast?
    Bonjour !


    J'ai juste une petit soucis au niveau d'un cast je pense...

    Voilà, j'ai voulu faire une fonction générique qui prend en paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    statDirectXToXml (LPVOID* pDD , REFIID iidIDirectDraw);
    Ensuite, un peu plus loin dans mon code, je fais appelle à une fontion de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HRESULT hr = pDD->EnumDisplayModes(flag, NULL, this,EnumModesCallback2);
    Sachant que j'appelle ma première fonction avec les paramètres suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	IDirectDraw7* pDD7;
    	XmlElement* element = statDirectXToXml(pDD7, IID_IDirectDraw7);
    Voici les erreurs que le compilateur me retourne, je crois qu'il ne comprend pas bien ce qu'est pDD7.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    error C2227: left of '->EnumDisplayModes' must point to class/struct/union
    ...
    'statDirectXToXml' : cannot convert parameter 1 from 'struct IDirectDraw7 *' to 'void ** '
    Je pense que je n'ai pas bien casté mon pointeur pDD ?

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Effectivement, d'une part tu essayes de convertir un IDirectDraw* vers void**, ce qui ne marche pas (il faudrait void*), d'autre part tu essayes d'appeler une fonction membre sur un void**, ce qui ne peut pas marcher ; et ça ne marcherait pas mieux avec un void* sans un cast ; mais si tu cast c'est que tu connais le type exact de ton paramètre (ou le type parent), et donc plus de raison de passer un void*.

    Bref, quoiqu'il en soit, le void* mérite un 10 sur l'échelle du goret (sauf quand tu n'as pas le choix car utilisation de certaines bibliothèques).

    Si tu veux faire quelque chose de générique un peu plus propre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template <class DirectDrawInterface>
    statDirectXToXml(DirectDrawInterface* pDD, REFIID iidIDirectDraw) {
    //corps de la fonction
    }

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Par défaut
    Hi ! D'accord...

    Par contre entre temps (de recevoir ta jolie réponce), j'avais déjà changé l'entete...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    statDirectXToXml (IDirectDraw* pDD , REFIID iidIDirectDraw)
    Et pourtant j'ai toujours un problème lors de l'appelle à cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	HRESULT hr = pDD->EnumDisplayModes(flag, NULL, this, EnumModesCallback2);
    L'erreur de compilation est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    error C2664: 'EnumDisplayModes' : cannot convert parameter 4 from 'long (struct _DDSURFACEDESC2 *,void *)' to 'long (__stdcall *)(struct _DDSURFACEDE
    SC *,void *)'
            None of the functions with this name in scope match the target type
    Toujours un problème qui me vaudrait le titre de "goret" ???

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    C'est le code qui se qualifie de goret par le codeur ^^

    Pour ta nouvelle entête, si ta fonction prend pour paramètre uniquement des classes dérivées de IDirectDraw, ta version est correcte et suffisante. Si tu souhaites manipuer d'autres types n'ayant aucun rapport avec IDirectDraw (mais ayant simplement en commun les différentes méthodes que tu appeleras depuis ta méthode statDirectXToXML)), alors la version template est plus appropriée.

    Pour ton problème, c'est encore un problème de type. Ta fonction EnumDIsplayMode attend comme quatrième argument un pointeur sur fonction ayant la signature :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    long MyFunction(struct _DDSURFACEDESC *,void *);
    Apparemment tu lui passes un pointeur sur fonction ayant la signature
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    long MyFunction(struct _DDSURFACEDESC2*, void*);
    Et encore je ne suis pas sûr, l'erreur ne signale pas un type de pointeur de fonction mais un type bizarre :s

    Possible de voir comment tu initialises EnumModeCallback2 ? (Ainsi que la déclaration de la fonction vers laquelle il pointe) ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Par défaut
    Je pense que c'est bon. J'ai enlevé les 2 à la fin de mes structures et ça compile et lance correctement mon programme.
    Il faut encore que je teste avec d'autre version de DirectX, juste pour l'instant j'essais d'appréhender VisualC++ pour qu'il face un GO au niveau de la définition des interfaces mais on dirait qu'il veut pas parser...

    De ce coté là, c'est bon, je vais me débrouiller, Visual est pleins de mystère...

    Merci beaucoup à toi

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

Discussions similaires

  1. [LabVIEW 6.1] Problème de type cast
    Par ¤Dany¤ dans le forum LabVIEW
    Réponses: 3
    Dernier message: 23/10/2008, 21h06
  2. [debutant] problème avec type à utiliser
    Par mlequim dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 15/07/2005, 16h08
  3. Problème de type chaîne
    Par champijulie dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 12/05/2005, 20h23
  4. Réponses: 4
    Dernier message: 30/01/2005, 14h23
  5. [Sybase] Problème de type sous ASE
    Par Hotchotte dans le forum Sybase
    Réponses: 1
    Dernier message: 18/12/2004, 11h04

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