PDA

Voir la version complète : Probleme de polymorphisme, d'operator, ...


bougie
23/09/2005, 19h02
Hello hello :)

Bon c'est pas souvent que je demande de l'aide car je prefere quand meme trouver mes erreurs tout seul, mais la je croi que j'en ai vraiment besoin :)

Donc j'ai decidé de recréer mon moteur 2D an C++ et SDL.
Jusque la tous va bien. :p

Pour faciliter la conception, de decide de créer une class dediée pour la gestion des SDL_Surface. Elle return la surface à l'aide de l'operator (). On créé une surface grace à l'operator =.

J'ai fais de meme pour mes SDL_Rect.

Je code donc tous le rest autour.
J'essaye dons d'afficher une image, mais alors là, l'image ne s'affiche pas.
J'ai regardé la valeur de de la surface just apres sa création et just avant le blit, et elle a la meme valeur.
De meme pour le rect.

Mais mon ecran rest noir :00000012:

Mon code est dispo dans mon archive tar.gz ainsi que mon projet pour dev-cpp et mon makefile pour linux.

http://bougieskater.free.fr/irc/2DEngine.tar.gz

Merci d'avance pour votre aide

GuyTIna
23/09/2005, 20h45
Bonjour tout le Monde.

La mise en oeuvre de fonctions virtuelles constitue un mécanisme extraordinairement puissant.

Tu as peut être déjà entendu parler du terme polymorphisme dans le cadre de la programmation orientée objets.

Il fait référence aux capacités des fonctions virtuelles.

Un élément polymorphique peut se présenter sous différentes formes,comme un loup-garou,ou le docteur Jekyll,ou encore un homme politique avant et aprés une élection.

L'appel d'une fonction virtuelle produit différents effets,selon le type d'objet pour lequel elle est appelée.

Cordialement

Mokona
24/09/2005, 04h34
GuyTina -> Si tu as jeté un oeil à son code, tu auras vu qu'il sait ce qu'est le polymorphisme et la virtualité.

Bougie -> Plusieurs choses.

- ton bug principal vient de ta dérivation de SDL_Surface. C'est osé... et ça ne fonctionne pas. En faisant rapidement la modification en coupant l'héritage et en ayant comme membre une SDL_Surface, ça passe (enfin, avec les autres modifs ci-dessous et ça plante en sortie car je ne me suis pas occupé de la destruction).

Je pense que le compilateur ne te garanti pas que la première chose que tu trouves dans ta classe au sens C++ est la même chose que tu trouves dans la structure au sens C. En C++, struct et class sont quasi identiques, mais là, tu hérites d'une structure implémentée dans une bibliothèque en C.

- ton programme fait une Seg Fault à sa sortie à cause de m_pszWindName = pszWindName dans ENG_Video.cpp. Tu écrases en effet un pointeur déjà alloué (donc, memory leak) puis dans le destructeur, tu fais un delete sur ce pointeur... qui est en fait le const char * que tu passes en argument dans main. Forcément, ça n'aime pas (utilise strncpy, ou bien les strings de la stl).

- attention à ton système de thread qui lit une liste d'affichage remplie par un autre thread. Dans l'état actuel, ça ne pose pas trop de souci, mais si tu te retrouves à faire des modifs pendant que la liste est parcourue, c'est la catastrophe assurée. Regarde du côté des mutex (SDL offre un support) afin de rentre ta gestion thread safe.

Puis voilà.

Le code est clair, c'est bien, ça donne envie d'aider :) (vu l'heure, il vaut mieux que ce soir clair...)

bougie
24/09/2005, 09h27
Merci mokona, ça fait plaisir de voir des message comme ça :p

En faite, j'ai créé une class pour la gestion des surface pour faciliter cella.

Je vais essayer ce que tu m'a dit, c'est à dire couper l'heritage de SDL_Surface et mettre une SDL_Surface à la place :)


Je vous tiens au courant :P

EDIT : j'ai essayer de mettre comme membre à CSurface une SDL_SUrface à la place de l'heritage, et ça ne marche pas :/

Mokona
24/09/2005, 12h03
C'est-à-dire ?

Toujours pas d'image ? Ou bien quelque chose va de travers avant ?

Si tu mets à jour ton package à charger, je peux regarder si j'ai un peu de temps à y consacrer.

bougie
24/09/2005, 12h26
Oui, je n'ai toujours pas d'image.
Et lorsque le programme se quit, j'ai un segfault

Pour la package, j'ai just changer des petits trucs dans CSurface.

surface.cpp
#include "Surface.hpp"





/**

* Constructor.

*/

CSurface :: CSurface(void)

{

}





/**

* Destructor.

*/

CSurface :: ~CSurface(void)

{

}





/**

* Operator = copy an SDL_Suface.

*

* @param pSurf The SDL_Surface you want to copy

*/

void CSurface :: operator =( SDL_Surface* pSurf )

{



this->m_pSurf = pSurf;



}

surface.hpp
#ifndef SURFACE_HPP

#define SURFACE_HPP



#include <iostream>

#include "SDL/SDL.h"





/**

* Class CSurface.

*

* This class is a base class of an SDL_Surface.

* Create, delete and manage it.

* Often associated with a SDL_Rect manage by the class CRect.

*/

class CSurface

{



protected:

SDL_Surface* m_pSurf;



public:

CSurface(void);

~CSurface(void);

void SetAlpha( Uint8 u8Alplha );



SDL_Surface* operator ()( void );

void operator =( SDL_Surface* pSurf );



};





/**

* Get the current SDL_Surface.

*

* @return Return the current SDL_Surface

*/

inline SDL_Surface* CSurface :: operator ()( void )

{



return m_pSurf;



}





/**

* Set the alpha value of the SDL_Surface.

*

* @param u8Alplha New alpha value

*/

inline void CSurface :: SetAlpha( Uint8 u8Alplha )

{



SDL_SetAlpha( m_pSurf, SDL_SRCALPHA, u8Alplha );



}

#endif // SURFACE_HPP

bougie
24/09/2005, 19h40
Bon, j'ai reussi à le faire marché, c'est just que je n'execté pas l'executable dans le bon dossier :D