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 transtypage (ou de pointeur)


Sujet :

C++

  1. #1
    Membre éclairé Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Points : 791
    Points
    791
    Par défaut Problème de transtypage (ou de pointeur)
    Bonjour à tous

    Voilà j'essaye de programmer un mini moteur physique 2D (mécanique du point simplifiée) avec un ami. On arrive à un assez bon résultat, mais on voudrais recommencer à zéro et le passer en c++ (plus simple à gérer).

    Le problème que je rencontre c'est que quand j'initialise une variable d'une de mes instance de la classe balle (sa position), il me sort des choses assez effrayantes (je passe 50.0 en float pour le constructeur, je récupère 3.988e-40 dans la variables que je la passe en Sint16 (la structure qui contient ce nombre attend ce genre de nombre) ou pas). Ce qui fait que l'image de ma balle ne s'affiche tout simplement pas (encore que je soupçonne que ça ne vienne même pas de là...


    Voilà la création de l'instance:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ball Balle1(1, 1, 0.5, 0.0, 0.0, 10.0, 10.0, 0.3, "cb.bmp");
    les coordonnées correspondent au 10.0 et au 10.0;

    la classe balle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Ball
    {
        public:
        int sensx, sensy;
        int posX, posY;
        float bounce, initialVelocityX, initialVelocityY,
        initialPosX, initialPosY, speedX, speedY, timeX, timeY;
        char spriteName[20];
        SDL_Surface *balle;
     
        Ball(int isensx, int isensy, float ibounce, float iinitialVelocityX, float iinitialVelocityY,
        float iinitialPosX, float iinitialPosY, float itime, char* iname);
        void printBall(SDL_Surface *&screen);
    };
    le constructeur de la balle:
    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
     
    Ball::Ball(int isensx, int isensy, float ibounce, float iinitialVelocityX, float iinitialVelocityY,
        float iinitialPosX, float iinitialPosY, float itime, char* iname)
        {
            sensx=isensx;
            sensy=isensy;
            bounce=ibounce;
            initialVelocityX=iinitialVelocityX;
            initialVelocityY=iinitialVelocityY;
            initialPosX=iinitialPosX;
            initialPosY=iinitialPosY;
            timeX=itime;
            timeY=itime;
            strcpy(spriteName, iname);
     
            balle = SDL_LoadBMP(spriteName);
            cout <<"Balle créée\n"<<endl;
            cout << "nom: "<< spriteName<<endl;
     
        }
    et la methode qui est sensée afficher:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void Ball::printBall(SDL_Surface *&screen)
    {
        SDL_Rect dstrect;
        dstrect.y = (Sint16)posY; //Le transtypage ne change rien
        dstrect.x = (Sint16)posX;
        SDL_BlitSurface(balle, 0, screen, &dstrect);
        cout<<"printball() appellée"<<endl;
        cout <<"x: "<<posX<<endl;
        cout << "y: "<<posY<<endl;
    }

    Pouvez-vous m'aider?
    Merci d'avance

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    Je ne vois nulle part l'affectation des valeurs pour posX et posY.

    Le constructeur affecte initialPosX et initialPosY, il faut au passage également mettre les valeurs ad hoc dans posX et posY, sinon ...
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ball Balle1(1, 1, 0.5, 0.0, 0.0, 10.0, 10.0, 0.3, "cb.bmp");
    Ton constructeur fait peur.
    Groupe tes paramètres, en particulier les coordonnées.
    Tu peux aussi utiliser des paramètres nommés pour que ce soit plus clair.

    Je trouve néanmoins bizarre d'avoir les propriétés d'un objet et l'objet lui-même mélangés.
    En particulier, ton code duplique les sprites et leurs noms inutilement.

    Il y a aussi confusion entre pos et initialPos, ce qui semble être la source de ton problème.

    Utilise std::string et pas char[N]. (D'ailleurs c'est génial, on peut aisément faire du buffer overrun avec ton code actuel)
    Utilise la liste d'initialisation pour les constructeurs.
    Libère ton sprite dans un destructeur.
    Passer ton pointeur par référence ne sert à rien sauf diminuer les performances.
    Ne caste pas quand ce n'est pas nécessaire. Laisse faire les conversions implicites. Et évite les casts C de toute manière (surtout pour autre chose que des entiers ou flottants).
    Boost ftw

  4. #4
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    Et évite les données membres publiques...

    Pour revenir au problème des paramètres de constructeurs, pourquoi ne pas avoir de classe Point (c'est la moindre des choses), une classe Velocity, une classe Vector (au sens mathématique) ? Tous ces objets mathématiques sont à mon avis assez essentiels dans l'implémentation d'un moteur physique, et évitent de trimballer des valeurs dans tous les sens (float par ci, float par là, int par....).

    Tu devrais peut-être jeter un oeil sur google, il doit exister des frameworks entiers là-dessus, avec de jolies classes Point, etc. pour la physique.

    Bon courage.

    Et évite les casts C de toute manière (surtout pour autre chose que des entiers ou flottants).
    Pas de cast C en C++ !
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

Discussions similaires

  1. Problème avec les tableaux de pointeurs
    Par TheDoci dans le forum C
    Réponses: 2
    Dernier message: 07/01/2007, 13h04
  2. Transtypages sur des pointeurs de fonction
    Par gege2061 dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 05/01/2007, 15h01
  3. Réponses: 4
    Dernier message: 15/10/2006, 18h05
  4. problème de transtypage
    Par salseropom dans le forum C
    Réponses: 5
    Dernier message: 30/08/2006, 10h59
  5. Problème de transtypage
    Par SunSyS dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 31/07/2006, 18h03

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