D'abord, excusez-moi pour ce titre pas clair du tout, mais une fois que vous aurez lu mon message, je vous mets au défi de trouver un meilleur titre !
Voilà. Je possède une class ( si si je vous jure ) qui ne possède que des constructeurs pour l'instant ( mais sur-chargé 6 fois ). Allez, soyons fous, un bout de code :
// Tenez compte de cette ligne là, en dessous
Sdl_Bouton bouton(rectangleVert, 100, 600);
SDL_Event event;
while(Sdl_TourBoucle()) {
SDL_WaitEvent(&event); switch(event.type) { case SDL_QUIT:
Sdl_BoucleStop(); }
rectangleVert.coller(300, 300, ecran);
Sdl_Flip(); }
La ligne qui ne va pas du tout, c'est celle où il y a le commentaire :
- Quand elle n'y ait pas, tout marche nickel.
- Quand elle y ait, le programme plante lamentablement. Je fais donc un debbugage à la bourrin à l'aide de "cerr", qui m'indique que le programme plante à la ligne de rectangleVert.coller(300, 300, ecran); , tout en bas. Je suppose donc que la variable rectangleVert a été modifié ( et corrompu, la traitresse ) entre temps, par la ligne qui pose problème.
Alors, bien gentiment, je vais mettre en commentaire le constructeur. Voyez par vous-même :
Je crois qu' il doit avoir un seg fault cacher dans un quoi puisqu' il dit que son prog plante au niveau de je sais plus trop quelle ligne c' est que ça doit compiler
Alors deux choses, pourquoi mettre deux fois en parametres du constructeur puis de la methode "coller" la coordonnée du boutton? Puis pourrais-t'on avoir le prototype de la methode "coller"?
Les coordonnées peuvent être totalement différentes, le bouton est un bouton et le rectangleVert un simple rectangle !
Voilà le prototype de la méthode coller :
bool coller(int positionX, int positionY, Sdl surfaceReceptrice, SDL_Rect *partie = NULL, int action = Sdl_FINIR_PROGRAMME);
Je vois pas trop en quoi ca peut te servir par contre, puisque quand le constructeur de Sdl_Bouton n'est pas appellé, tout marche à la perfection ...
En prévention d'une autre demande, voilà le contenu de la méthode coller :
if(initialiser) {
SDL_Rect position;
position.x = positionX;
position.y = positionY;
if(SDL_BlitSurface(_surface, partie, surfaceReceptrice._surface, &position) != 0) { if(action == Sdl_FINIR_PROGRAMME) { cerr << "Erreur lors du blit d'une surface : " << SDL_GetError() << endl; exit(EXIT_FAILURE); } elseif(action == Sdl_ECRIRE_ERREUR) { cerr << "Erreur lors du blit d'une surface : " << SDL_GetError() << endl; } returnfalse; } returntrue; } else { if(action == Sdl_FINIR_PROGRAMME) { cerr << "Erreur lors du blit d'une surface : la SDL n'avait pas été initialisé." << endl; exit(EXIT_FAILURE); } elseif(action == Sdl_ECRIRE_ERREUR) { cerr << "Erreur lors du blit d'une surface : la SDL n'avait pas été initialisé." << endl; } returnfalse; }
Merci encore pour votre aide.
Edit : Le compilo' ne détecte aucune erreur, c'est lors de l'éxécution du programme qu'il y a un problème.
Sans vouloir te vexer, là c'est un peu HS, ton message... et ton titre aussi, d'ailleurs. Le faite que ma classe s'appelle bouton n'a pas d'importance, ca aurait pu être la class TintinEtSonChien, ca n'aurai rien changé.
Edit : Après utilisation du débuggeur de Code::Blocks, j'obtiens cette erreur :
Citation : Erreur renvoyé par Code::Blocks
Erreur lors du blit d'une surface : Surfaces must not be locked during blit
Notez que cette erreur ne s'inscrit dans le stderr.txt qu'avec le débuggeur, pas avec le fonctionnement normal.
J'ai modifié la méthode coller en conséquence, mais ca ne marche pas mieux :
if(initialiser) {
SDL_Rect position;
position.x = positionX;
position.y = positionY;
SDL_UnlockSurface(surfaceReceptrice._surface);
SDL_UnlockSurface(_surface); if(SDL_BlitSurface(_surface, partie, surfaceReceptrice._surface, &position) != 0) { if(action == Sdl_FINIR_PROGRAMME) { cerr << "Erreur lors du blit d'une surface : " << SDL_GetError() << endl; exit(EXIT_FAILURE); } elseif(action == Sdl_ECRIRE_ERREUR) { cerr << "Erreur lors du blit d'une surface : " << SDL_GetError() << endl; } returnfalse; } returntrue; }
Ben on va s'en tenir à ce que dis le debugger de code:blocks deja, donc a prioris tu aurais besoin de verouiller la surface, sdl le permet "locksurface" (ou un truc dans le genre), je t'invite à te référer à la doc. Ensuite tu deverouille la sur face avec un "unlocksurface" (pas sur du nom).
Essaye ça.
Voir mon message précédent : le dévérouillage ne donne rien. Le verrouillage/déverrouillage, ou bien le double déverrouillage, ou bien encore le verrouillage/double déverrouillage ne donne rien non plus ...
Edit : Nouvelle info, rendant le problème plus étrange encore : je crée une deuxième variable ( du même type que rectangleVert ), disons rectangleRouge. Si j'envoie au constructeur de Sdl_Bouton la variable rectangleVert et que je colle seulement rectangleRouge, ca marche Si je colle les deux, bien sûr, ca ne marche pas ...
Pour voir ce que ca donnais, j'ai enlever toutes les surcharges du constructeur... Ca ne marche pas mieux.
C'est quand même étrange, ça ! Pourtant, mon constructeur ne fait rien sur ma variable, j'en suis sûr ! J'ai même mis chacun des paramètres de mon constructeur en constante ...
Franchement, je pense que ça vient du fait que lorsque tu met une position en parametre du constructeur du bouton plus le rectangleVert tu lui donne deja une position à travers le bouton, puis ensuite tu colle le rectangleVert aux coordonnées que tu met en parametre de ta methode coller. Moi je vois que ça, donc repense ta gestion des deux.
Puis j'ai regarder plus en detail ta methode coller et y'a quelquechose qui ne coincide pas. En effet tu met en valeur par defaut à la variable action "Sdl_FINIR_PROGRAMME" donc d'apres ton code logiquement à chaque fois qu tu appeleras la methode coller ça quitera le programme.
Tu as mal lu mon code !
C'est en cas d'erreur que ca fini le programme . Les deux autres valeurs possibles sont Sdl_ECRIRE_ERREUR ( qui ne fait que écrire l'erreur dans stderr.txt ) et Sdl_RIEN ( qui ne fait rien du tout ).
Je veux bien te croire, UltimAKnighT, mais le problème c'est que mon constructeur est VIDE. Il ne peut rien s'y passer !
Je sais que ça va paraitre bête, mais apres tout c'est une methode .
Essaye de mettre l'appel à la methode coller juste apres la déclaration de bouton et juste avant (pas en meme temps bien sûr), histoire de voir si...
Histoire de voir quoi ? Faut pas me demander des trucs qui n'aboutiront à rien, c'est inutile, autrement !
Enfin bon, si ca peut faire avancer : comme je le prévoyais, si la méthode coller est avant, tout marche bien, si elle est après, ca plante aussi lamentablement qu'avant.
Edit : Problème à moitié résolu ! Il suffit d'envoyer un pointeur de l'objet rectangleVert à la méthode coller. Par contre, savoir pourquoi ca plantait autrement même avec le constructeur vide, alors là ....
Ca ne sert jamais à rien, mais je ne voulais pas m'avancer et comme je n'ai pas les sources... mais bon c'est bien ce dont je me doutais.
Enfin, si tu est parvenus à te depanner tant mieux.
Et pourquoi ça marche avec un pointeur? Je ne connais pas ton constructeur Sdl mais tu n'as pas dû tenir compte de son contenu.
Si tu avais donné tout les éléments on aurait pu eviter de perdre du temps, enfin ça s'arrange c'est le principal.
Problème étrange
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Google