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

Visual C++ Discussion :

VisualC 6.0 -> VisualC 2008 Pro (error C2440 static_cast)


Sujet :

Visual C++

  1. #1
    Membre averti
    Inscrit en
    Février 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 19
    Par défaut VisualC 6.0 -> VisualC 2008 Pro (error C2440 static_cast)
    Bonjour,

    J'ai repris un ensemble de projets développés il y a 10 ans sur Visual C++ 6.0 et j'ai besoin de les migrer aujourd'hui vers visual C++ 2008. J'ai réussi tant bien que mal à migrer les plus petits projets par contre il m'en reste 3 gros... écrit en vrai C++ et comme j'ai beaucoup pratiqué en C temps réel mais pas en C++ j'ai besoin de votre aide et pas qu'un peu !

    Voici le type d'erreur que je rencontre à la génération:

    Citation Envoyé par DlgCheckNet.cpp
    d:\developpement\v3000dg\dlgchecknet.cpp(74) : error C2440: 'static_cast'*: impossible de convertir de 'void (__thiscall CDlgCheckNet::* )(WPARAM,LPARAM)' en 'LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)'
    Aucune fonction ayant ce nom dans la portée ne correspond au type de la cible ]
    et dans le programme, on est sur la ligne rouge:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    {
    BEGIN_MESSAGE_MAP(CDlgCheckNet, CDialog)
    	//{{AFX_MSG_MAP(CDlgCheckNet)
    	ON_BN_CLICKED(IDHELP, OnHelp)
    	//}}AFX_MSG_MAP
    
    	ON_WM_TIMER()
    
    	ON_MESSAGE(WMU_CNX_NOTREADY, OnNotReady)	
    
    END_MESSAGE_MAP()
    }
    Merci pour votre aide

    GP

  2. #2
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Erreur de typage !

    Déjà, ce sont des fonctions membres qui ne sont pas membres de la meme classe, mais ça ne pose pas problème s'il y a sous-typage.

    Bon, c'est surtout le fait de convertir une fonction qui renvoie "void" vers une fonction qui renvoie un LRESULT. C'est dangereux si tu te sers vraiment de ce résultat. Heureusement que le compilateur gueule!

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Cela veut dire que ta fonction OnNotReady() est une fonction void et que maintenant, il faut que cela soit une fonction qui retourne un LRESULT.

    Il a dû y avoir des évolutions entre VC6 et VS 2008.

    Je pense que tu peux la modifier et retourner 0 comme valeur.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Membre averti
    Inscrit en
    Février 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 19
    Par défaut
    Merci pour vos réponses rapides !
    Ca marche pour une !
    j'ai une quinzaine d'erreur similaires que je vais corriger de ce pas.
    Si tout se passe bien je passe le sujet en résolu dans la journée.

    GP

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Cela veut dire que ta fonction OnNotReady() est une fonction void et que maintenant, il faut que cela soit une fonction qui retourne un LRESULT.

    Il a dû y avoir des évolutions entre VC6 et VS 2008.
    À mon avis, ça veut plutôt dire qu'il a toujours fallu qu'elle retourne un LRESULT, mais avant l'erreur passait inaperçue parce que VC6 utilisait un cast C-Style au lieu d'un static_cast.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre averti
    Inscrit en
    Février 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 19
    Par défaut
    "Plus que" 23 erreurs sur les 79 du départ

    Concernant ce post, le problème a été réglé dans 90% des cas en remplaçant void par LRESULT dans la définition de la fonction membre, et en retournant 0. (Merci )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    LRESULT CDlgCheckNet::OnNotReady (WPARAM wParam, LPARAM lParam)
    {
    	m_bEchec = TRUE;
    	ConnectSuivant (0, 0);
    	return 0;
    }
    et en remplaçant bien sûr void par LRESULT dans la déclaration correspondante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    afx_msg LRESULT OnNotReady (WPARAM wParam, LPARAM lParam);
    Reste maintenant les 10% qui font l'objet du post suivant

  7. #7
    Membre averti
    Inscrit en
    Février 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 19
    Par défaut Cas suivant - une variante
    J'ai maintenant l'erreur suivante:

    d:\developpement\v3000_commun\dlgvoirafficheur.cpp(75) : error C2440: 'static_cast'*: impossible de convertir de 'void (__thiscall CDlgVoirAfficheur::* )(void)' en 'LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)'
    Aucune fonction ayant ce nom dans la portée ne correspond au type de la cible
    L'erreur pointe sur la ligne rouge:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    BEGIN_MESSAGE_MAP(CDlgVoirAfficheur, CDialog)
    	//{{AFX_MSG_MAP(CDlgVoirAfficheur)
    	ON_BN_CLICKED(ID_FERMER, OnCloseDialogue)
    	//}}AFX_MSG_MAP
    	ON_MESSAGE(WMU_GENERIC_THREAD_2, OnCloseDialogue)
    END_MESSAGE_MAP()
    Jusque là, c'est pareil que le précédent cas, par contre quand j'applique la recette habituelle:

    Définition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    LRESULT CDlgVoirAfficheur::OnCloseDialogue ()
    {
    	CloseDialogue (TRUE);
    	return 0;
    }
    Déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	afx_msg LRESULT OnCloseDialogue ();
    J'obtiens deux nouvelles erreurs:
    d:\developpement\v3000_commun\dlgvoirafficheur.cpp(71) : error C2440: 'static_cast' : impossible de convertir de 'LRESULT (__thiscall CDlgVoirAfficheur::* )(void)' en 'AFX_PMSG'
    Aucune fonction ayant ce nom dans la portée ne correspond au type de la cible
    d:\developpement\v3000_commun\dlgvoirafficheur.cpp(75) : error C2440: 'static_cast' : impossible de convertir de 'LRESULT (__thiscall CDlgVoirAfficheur::* )(void)' en 'LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)'
    Aucune fonction ayant ce nom dans la portée ne correspond au type de la cible

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu dois rajouter les paramètres wParam et lParam, même si tu ne les utilises pas.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Bien lire le message d'erreur :
    Il veut une fonction LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM) et tu fournis une fonction LRESULT (__thiscall CWnd::::* )(void).

    Ajoute les 2 paramètres WPARAM et LPARAM (que tu n'utiliseras pas puisque tu ne les utilisais pas avant) à ta fonction et cela devrait passer.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    D'ailleurs, en __thiscall, c'est un miracle que le code n'ait pas planté alors que c'est la fonction appelée qui doit nettoyer la pile...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    en __thiscall, c'est l'appelé qui doit nettoyer la pile ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Apparemment, oui.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre averti
    Inscrit en
    Février 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 19
    Par défaut
    ram-0000 Bien lire le message d'erreur :
    Il veut une fonction LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM) et tu fournis une fonction LRESULT (__thiscall CWnd::::* )(void).
    Ajoute les 2 paramètres WPARAM et LPARAM (que tu n'utiliseras pas puisque tu ne les utilisais pas avant) à ta fonction et cela devrait passer.
    Merci, ça a réglé une erreur sur les deux, et pour la 2ème j'ai suivi ton conseil, (bien lire l'erreur)

    d:\developpement\v3000_commun\dlgvoirafficheur.cpp(73) : error C2440: 'static_cast'*: impossible de convertir de 'LRESULT (__thiscall CDlgVoirAfficheur::* )(WPARAM,LPARAM)' en 'AFX_PMSG'
    Aucune fonction ayant ce nom dans la portée ne correspond au type de la cible
    Du coups j'ai transtypé OnCloseDialogue en AFX_PMSG:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    BEGIN_MESSAGE_MAP(CDlgVoirAfficheur, CDialog)
    	//{{AFX_MSG_MAP(CDlgVoirAfficheur)
    //	ON_BN_CLICKED(ID_FERMER, OnCloseDialogue)
    	ON_BN_CLICKED(ID_FERMER, (AFX_PMSG)OnCloseDialogue)
    	//}}AFX_MSG_MAP
    
    	ON_MESSAGE(WMU_GENERIC_THREAD_2, OnCloseDialogue)
    END_MESSAGE_MAP()
    Et je n'ai plus l'erreur, mais je me méfie des transtypages que je ne comprends pas, vous pensez qu'il y a des risques ?
    Même si je trace tout ce que je touche histoire de pouvoir revenir plus facilement sur le sujet après coup, je préfère limiter les effets de bord en amont.


  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Une fonction passée à ON_BN_CLICKED ne doit prendre aucun paramètre et retourner void.
    En clair void OnCloseDialogue(void).
    http://msdn.microsoft.com/en-us/library/3dtww101.aspx
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre averti
    Inscrit en
    Février 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 19
    Par défaut
    Merci à tous, mission accomplie pour : error C2440: 'static_cast'



    GP

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 04/01/2011, 07h34
  2. [VS 2008 Pro] Collapse to definitions auto ?
    Par Ticoche dans le forum Visual Studio
    Réponses: 3
    Dernier message: 13/10/2008, 12h16
  3. Visual Studio 2008 Pro vs Express
    Par greenzephyr dans le forum Visual Studio
    Réponses: 2
    Dernier message: 03/10/2008, 12h57
  4. Réponses: 1
    Dernier message: 16/05/2008, 09h51
  5. Réponses: 3
    Dernier message: 12/04/2008, 12h05

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