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 :

Crash du programme � l'ex�cution


Sujet :

C++

  1. #1
    Membre averti
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mai 2009
    Messages
    28
    D�tails du profil
    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 28
    Par d�faut Crash du programme � l'ex�cution
    Bonjour � tous,

    La fonction Objets_Solides doit me cr�er des corps solides en 3D sous PhysX. Pour cela j'utilise "softBodyDesc" de type "NxSoftBodyDesc". Mais pour pouvoir cr�er ces corps, "NxSoftBodyDesc::isValid()" doit retourner "true".

    Voici d'abord ma 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
    void Objets_Solides(void)
    {
    	NxSoftBodyDesc softBodyDesc;
    	bool BodyRet2 = softBodyDesc.isValid();
    	softBodyDesc.globalPose.t = NxVec3(0.0f, 3.0f, 0.0f);
    	softBodyDesc.particleRadius = 0.2f;
    	softBodyDesc.volumeStiffness = 0.5f;
    	softBodyDesc.stretchingStiffness = 1.0f;
    	softBodyDesc.friction = 1.0f;
    	softBodyDesc.attachmentResponseCoefficient = 0.1f;
    	softBodyDesc.solverIterations = 5;
            bool BodyRet3 = softBodyDesc.isValid();
     
    ...
    }
    Le probl�me qui m'arrive est que pour que "softBodyDesc.isValid();" retourne true, chaque valeur attribu� � un param�tre doit correspondre � ce qui est attendu. Par exemple pour "globalPose.t", est attendu un vecteur. Ce qui est le cas ici. Je sais que pour chaque param�tre, la valeur attendue est bonne.

    Ce qui cloche c'est � la ligne:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
            NxSoftBodyDesc softBodyDesc;
    	bool BodyRet2 = softBodyDesc.isValid();
    Sans m�me avoir mis de param�tres, "BodyRet2 = false" ce qui veut dire qu'il y a un probl�me au niveau de la cr�ation m�me de "softBodyDesc".

    Voici l'image:




    Je ne sais pas si l'explication vous apparait tr�s claire mais c'est plut�t compliqu� pour moi d'expliquer pcq je ne connais pas exactement les termes ad�quat pour d�signer les bouts de code.

    J'esp�re que qqn comprendra mon probl�me.

    Je pr�cise que mon code complie tr�s bien mais crashe � l'ex�cution et que je suis arriv� � cet endroit apr�s le pas � pas.

    Merci

  2. #2
    Membre averti
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mai 2009
    Messages
    28
    D�tails du profil
    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 28
    Par d�faut
    En compilant pas � pas et en comparant � une fonction test d'un autre programme qui marche, je suis rentr� dans la fonction "bool NxSoftBodyDesc::isValid() const", soit la fonction de validation qui doit me retourner "true".

    En comparant les deux programme, cela me donne ��:


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

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    Visiblement, softBodyDesc.isValid() renvoie une valeur bool�enne, vraie si softBodyDesc est valide, fausse s'il ne l'est pas...

    D�s lors, il serait surement int�ressant d'utiliser cette valeur avant d'essayer de travailler sur la suite, non

    Car, dans le code que tu montre, tu d�clares deux variables de type bool�en, mais tu n'en fais strictement rien... c'est un peu domage

    De plus, ta fonction n'�tant pas destin�e � renvoyer quoi que ce soit, il faudrait peut �tre pr�voir de lever une exception si, pour une raison ou une autre, softBodyDesc venait � �tre invalide avant ou apr�s l'ex�cution de cette fonction...

    Les deux solutions possibles sont:
    Ne rien faire du tout si softBodyDesc n'est pas valide en pr�condition
    Lancer une exception si softBodyDesc avant et, pourquoi pas, une autre si softBodyDesc n'est plus valide apr�s...

    Au final, la premi�re solution donnerait un code proche de
    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
    20
    21
    22
    23
    24
    25
    26
    void Objets_Solides(void)
    {
    	NxSoftBodyDesc softBodyDesc;
            /* si ce n'est pas valide au départ, on ne fait rien :P */
    	if(softBodyDesc.isValid())
            {
    	    softBodyDesc.globalPose.t = NxVec3(0.0f, 3.0f, 0.0f);
    	    softBodyDesc.particleRadius = 0.2f;
    	    softBodyDesc.volumeStiffness = 0.5f;
    	    softBodyDesc.stretchingStiffness = 1.0f;
    	    softBodyDesc.friction = 1.0f;
    	    softBodyDesc.attachmentResponseCoefficient = 0.1f;
    	    softBodyDesc.solverIterations = 5;
                /* si softBodyDesc n'est plus valide, 
                 */
                if(!softBodyDesc.isValid())
                {
                    /* tout ce qu'il faut pour
                     * le remettre dans un état valide
                     * Mais est-ce utile, étant donné que c'est un objet
                     * propre à la fonction, qui ne sera pas renvoyé ??
                     */
                }
                ...
            }
    }
    et la deuxi�me pourrait prendre une forme proche de
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    void Objets_Solides(void)
    {
    	NxSoftBodyDesc softBodyDesc;
    	if(!softBodyDesc.isValid())
                throw PreconditionInvalid();
            /* si on arrive ici, c'est que softBodyDesc était valide */
    	softBodyDesc.globalPose.t = NxVec3(0.0f, 3.0f, 0.0f);
    	softBodyDesc.particleRadius = 0.2f;
    	softBodyDesc.volumeStiffness = 0.5f;
    	softBodyDesc.stretchingStiffness = 1.0f;
    	softBodyDesc.friction = 1.0f;
    	softBodyDesc.attachmentResponseCoefficient = 0.1f;
    	softBodyDesc.solverIterations = 5;
            try
            {
                if(! softBodyDesc.isValid())
                    throw PostConditionInvalid();
            }
            catch(PostConditionInvalid &e)
            {
                 /* tout ce qu'il faut pour remettre softBodyDesc dans un état 
                  * valide
                  */
                 /* on lève une exception disant qu'on n'a pas modifié l'objet */
                 throw SolidObjectNotDone();
     
            }
     
    ...
    }
    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

  4. #4
    Membre averti
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mai 2009
    Messages
    28
    D�tails du profil
    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 28
    Par d�faut
    J'ai regard� ce qui merdait avec mon "softBodyMesh", j'ai donc repris mon pas � pas � partir de l�:


    -> NxSoftBodyDesc softBodyDesc;
    bool BodyRet2 = softBodyDesc.isValid();


    Donc "NxSoftBodyDesc softBodyDesc;" me fait rentrer l�:


    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
        NX_INLINE NxSoftBodyDesc::NxSoftBodyDesc()
        {
    	    setToDefault();
        }

    Et "setToDefault();" me fait arrviver l�:


    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    NX_INLINE void NxSoftBodyDesc::setToDefault()
        {
    	softBodyMesh = NULL;
    	globalPose.id();
    	particleRadius = 0.1f;
    	density = 1.0f;
        ...
       }

    Donc comme on peut le voir "softBodyMesh" est bien mis � NULL et donc je ne peux pas avoir:
    if(!softBodyMesh) return false;

    En fait, �a me donne c�:



    et ��:




    Pour moi, tout le probl�me vient de l� mais je ne sais pas comment le r�soudre.

    Y-a-t-il qqn qui puisse m'aider?

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

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Citation Envoy� par MaTtaW Voir le message
    J'ai regard� ce qui merdait avec mon "softBodyMesh", j'ai donc repris mon pas � pas � partir de l�:


    -> NxSoftBodyDesc softBodyDesc;
    bool BodyRet2 = softBodyDesc.isValid();


    Donc "NxSoftBodyDesc softBodyDesc;" me fait rentrer l�:


    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
        NX_INLINE NxSoftBodyDesc::NxSoftBodyDesc()
        {
    	    setToDefault();
        }

    Et "setToDefault();" me fait arrviver l�:


    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    NX_INLINE void NxSoftBodyDesc::setToDefault()
        {
    	softBodyMesh = NULL;
    	globalPose.id();
    	particleRadius = 0.1f;
    	density = 1.0f;
        ...
       }

    Donc comme on peut le voir "softBodyMesh" est bien mis � NULL et donc je ne peux pas avoir:
    if(!softBodyMesh) return false;
    Si, justement, un pointeur NULL est �valu� � false...

    Autrement dit, if(!softBodyMesh) sera �valu� � vrai si softBodyMesh est nul, ce qui provoque le renvoi de false parce que !false == true

    Ce code correspond en fait �
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    if(softBodyMesh==NULL) return false;
    [EDIT]Moralit�, soit tu dois d�clarer ta variable de type NxSoftBodyDesc en utilisant un autre constructeur (qui prend un argument qu'il te faut d�terminer), soit, apr�s avoir d�clar� ta variable, mais avant de tester la validit�, tu dois veiller � appeler une fonction d'intialisation...

    Quoi qu'il en soit, j'ai l'impression qu'il te manquera la variable qui te permettra d'initialiser softBodyMesh dans ta fonction
    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

  6. #6
    Membre averti
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mai 2009
    Messages
    28
    D�tails du profil
    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 28
    Par d�faut
    Ok, (!softBodyMesh) doit me retourner vrai, pour cela softBodyMesh doit �tre NULL.

    Mais en passant par la fonction "setToDefault()", il est bien pass� NULL. Non?

    EDIT:

    Ah non, attend, justement, Il est mis � NULL par d�faut mais ne doit pas �tre NULL pour que "isValid" renvoir True !

    EDIT:

    Mais dans ce cas, par rapport � mes imprime-�crans, j'en conclue quoi?

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

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Soyons clair, le code
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    if(!softBodyMesh) return false;
    correspond �
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    if(softBodyMesh ==NULL)
    {
        return false;
    }
    else
    {
        /* ne fait rien */
    }
    Donc, pour que isValid() puisse finir par renvoyer true, il faut... qu'il passe par la partie else du test (celle qui ne fait rien)...

    Et, pour que cela arrive, il faut... que softBodyMesh repr�sente une adresse valide.

    C'est ce qui me fait dire qu'il faut pouvoir donner quelque chose � la classe NxSoftBodyDesc pour qu'elle puisse initialiser correctement ce pointeur.

    Cela est susceptible de se faire de deux mani�res:
    • Soit par un mutateur sur softBodyMesh (du genre de setSoftBodyMesh(un truc du type ad�quat) )
    • Soit en invoquant un autre constructeur que le constructeur par d�faut.

      V�rifie donc les autres constructeurs pour voir si tu n'a pas, justement, un constructeur qui prendrait:
      • Soit une variable du type ad�quat pour g�n�rer softBodyMesh
      • Soit une variable du type ad�quat pour g�n�rer softBodyMesh, un NxVec3, 5 r�els et 1 entier... (pour ce que j'ai pu d�terminer au d�part de ton code )
    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

  8. #8
    Membre averti
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mai 2009
    Messages
    28
    D�tails du profil
    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 28
    Par d�faut
    Ok je vais zieuter tout �a pour voir exactement quoi faire et tiens au courant.

    Merci bcp pour le coup de main.

  9. #9
    Membre averti
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mai 2009
    Messages
    28
    D�tails du profil
    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 28
    Par d�faut
    Salut,

    j'ai r�ussi � r�soudre mon probl�me � l'aide de tes conseils.


    Comme tu disais, le bool�en retourne false parceque SoftBodyMesh est NULL, donc ne contient pas d'adresse valide. Il faut donc regard� comment il est cr��, par quelle fonction.


    En regardant les diff�rentes formes de d�claration de "softBodyMesh", je vois que dans le fichier MySoftBody.cpp, � la fonction "bool MySoftBody::cookMesh(NxSoftBodyMeshDesc& desc)", il y a la ligne:

    mSoftBodyMesh = mScene->getPhysicsSDK().createSoftBodyMesh(rb);

    qui utilise la fonction "createSoftBodyMesh".


    J'ai donc compar� mon fichier MySoftBody.cpp avec celui utilis� par le programme test qui marche, et je vois que dans la fonction:

    "void MySoftBody::init(NxScene *scene, NxSoftBodyDesc &desc, NxSoftBodyMeshDesc &meshDesc, ObjMesh *surfaceMesh)"

    l� o� il y a la ligne "mSoftBody = scene->createSoftBody(desc);", n'apparait pas ou a �t� effac�:

    if(meshDesc.isValid())
    {
    NxInitCooking();
    cookMesh(meshDesc);
    NxCloseCooking();
    }


    C'est notamment grace � "cookMesh(meshDesc);" qu'est cr�� "softBodyMesh".

    En cr�ant "softBodyMesh", on lui donne une adresse valide, il n'est donc plus NULL.

    A partir de l�, la fonction "isValid()" peut retourner true.
    On peut ainsi faire l'initialisation et donc la cr�ation du SoftBody.


    Donc probl�me r�gl�, je peux continuer mon boulot.

    Merci pour tout.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 1
    Dernier message: 12/04/2007, 11h30
  2. R�ponses: 8
    Dernier message: 18/03/2007, 02h28
  3. R�ponses: 31
    Dernier message: 12/03/2007, 17h50
  4. R�ponses: 3
    Dernier message: 14/12/2006, 11h46
  5. Intercepter un crash du programme ?
    Par Rudyweb dans le forum MFC
    R�ponses: 3
    Dernier message: 03/03/2005, 13h58

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