• [^] # Re: Re:

    Posté par . En réponse au journal Fin de gcc dans les *BSD ?. Évalué à 1.

    > T'es sur que le probleme vient du compilo et que tu n'as pas fait une bourde qui par chance passe dans gcc ?

    Voilà ce qui ne marchait pas (une petite partie des entêtes) :
    class CMixerBmpD3D : public virtual CBmpD3DDesc {
    virtual ... = 0 ;
    }
    class CMixerBmpD3DSurf : public virtual CMixerBmpD3D {
    }
    class CMixerBmpD3DTex : public virtual CMixerBmpD3D {
    }
    class CMixerShot : public virtual CShotDesc, public virtual CMixerBmpD3D {
    int entier_CMxierShot ;
    virtual ... = 0 ;
    void fonction_CMixerShot() {
    entier_CMixerShot++ ;
    }
    class CMixerShotSurf : public virtual CMixerShot, public virtual CMixerBmpD3DSurf {
    }
    class CMixerShotTex : public virtual CMixerShot, public virtual CMixerBmpD3DTex {
    }


    Ce qui ne marchait était par exemple :
    CMixerShotTex * pTex = new CMixerShotTex ;
    CMixerShot * pShot = pTex ;
    pShot->fonction_CMixerShot() ; // plantage.

    Il n'y a pas forcément plantage à l'appel de la fonction mais plantage lors de "entier_CMixerShot++". Un affichage de "*this" dans le débuggeur donne du n'importe quoi alors que je suis dans une fonction membre ! C'est définitivement une erreur du compilateur.

    Autre problème :
    CMixerShotTex * pTex = new CMixerShotTex ;
    CMixerShot * pShot = dynamic_cast<CMixerShot *>(pTex) ;

    Le dynamic_cast n'est pas nécessaire. Mais si je l'utilise, pShot est égal à NULL. C'est encore définitivement une erreur du compilateur.

    Autre problème :
    CMixerShotTex * pTex = new CMixerShotTex ;
    f(pTex) ;
    f(CMixerShot * pShot) {
    CMixerShotTex * pTex = dynamic_cast<CMixerShotTex *>(pShot) ; // retourne NULL alors que c'est un CMixerShotTex *
    }

    Pour régler le problème, j'ai viré CMixerShot (j'ai déplacé des données/fonctions) et tout regroupé dans CMixerBmpD3D.

    > T'es sur que le probleme vient du compilo

    Oui, j'ai vu une page web qui en parle mais je ne l'ai plus. Parfois VC++ n'arrive pas à déterminer le type d'un object.

    Les "public virtual" sont nécessaires car il y a des données en commun entre CShotDesc et CMixerBmpD3D entre autre.