Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème étrange

Désolé pour le titre :'(

Sujet résolu
    11 juin 2007 à 22:29:47

    Bonsoir à tous ;) !

    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 o_O ) qui ne possède que des constructeurs pour l'instant ( mais sur-chargé 6 fois ). Allez, soyons fous, un bout de code :

        Sdl_Init(SDL_INIT_VIDEO);
        Sdl ecran(Sdl_ECRAN);
        ecran.choixModeVideo(800, 800, 32, SDL_HWSURFACE);
        Sdl rectangleVert(Sdl_SURFACE);

        rectangleVert.creer(SDL_HWSURFACE, 150, 30);
        rectangleVert.remplir(10, 150, 10);

        // 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 :diable: ) entre temps, par la ligne qui pose problème.
    Alors, bien gentiment, je vais mettre en commentaire le constructeur. Voyez par vous-même :

    Sdl_Bouton::Sdl_Bouton(Sdl image, int positionX, int positionY)
    {
        cerr << "Verification" << endl;
        /*_image = image;
        _image2 = image;
        _image3 = image;
        _positionX = positionX;
        _positionY = positionY;
        _etat = Sdl_Bouton_RIEN;*/

    }


    Je reconstruit le programme, le lance à nouveau, et ... ca bug au même endroit. Etrange non ???

    D'où peut-bien venir le problème ???

    Merci d'avance ;) !
    • Partager sur Facebook
    • Partager sur Twitter
      11 juin 2007 à 22:55:14

      C'est quoi l'erreur que ça t'affiche?
      • Partager sur Facebook
      • Partager sur Twitter
        12 juin 2007 à 8:54:22

        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
        • Partager sur Facebook
        • Partager sur Twitter
          12 juin 2007 à 9:36:57

          Ah oui en effet, autant pour moi, j'avais mal lu.

          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"?
          • Partager sur Facebook
          • Partager sur Twitter
            12 juin 2007 à 10:42:27

            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);
                        }
                        else if (action == Sdl_ECRIRE_ERREUR)
                        {
                            cerr << "Erreur lors du blit d'une surface : " << SDL_GetError() << endl;
                        }
                        return false;
                    }
                    return true;
                }
                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);
                    }
                    else if (action == Sdl_ECRIRE_ERREUR)
                    {
                        cerr << "Erreur lors du blit d'une surface : la SDL n'avait pas été initialisé." << endl;
                    }
                    return false;
                }


            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.
            • Partager sur Facebook
            • Partager sur Twitter
              12 juin 2007 à 12:15:25

              Citation : Blackhole

              ca bug au même endroit. Etrange non ???


              Ton programme fais quoi aussi? parce que tu dis que ça bug mais ça veut pas dire grand chose, si tu dis pas ce qui arrive exactement.

              Moi je pense que le probleme viens du fait que tu appelles la méthode coller, enfin avant de m'avancer plus je voudrais savoir ce que ça te fait.
              • Partager sur Facebook
              • Partager sur Twitter
                12 juin 2007 à 13:18:06

                Ah oui, désolé ...

                Quand je lance le programme, la fenêtre s'ouvre, et, instantanément après, elle se ferme.
                Aucune erreur ne s'affiche.

                Citation : Code::Blocks

                Checking for existence: Defaut.exe
                Executing: "xxx\Defaut.exe" (in .)
                Process terminated with status 1 (0 minutes, 0 seconds)
                0 errors, 0 warnings

                • Partager sur Facebook
                • Partager sur Twitter
                  12 juin 2007 à 15:16:03

                  Un titre? facile :

                  Citation

                  [SDL]Incapable d'exécuter mon prog avec un bouton

                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 juin 2007 à 15:45:01

                    Mouais ...

                    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);
                                }
                                else if (action == Sdl_ECRIRE_ERREUR)
                                {
                                    cerr << "Erreur lors du blit d'une surface : " << SDL_GetError() << endl;
                                }
                                return false;
                            }
                            return true;
                        }
                    • Partager sur Facebook
                    • Partager sur Twitter
                      12 juin 2007 à 21:39:58

                      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.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        12 juin 2007 à 22:01:31

                        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 o_O 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 ...

                        Edit 2 : A l'aide :'( !!!
                        • Partager sur Facebook
                        • Partager sur Twitter
                          13 juin 2007 à 18:28:59

                          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.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            13 juin 2007 à 21:53:07

                            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 !
                            • Partager sur Facebook
                            • Partager sur Twitter
                              13 juin 2007 à 22:03:50

                              Essaye de poster un petit code qui bugue.
                              Parce que là, on a plein de fonction inconnue et on connaît 1/10e de ton code.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                13 juin 2007 à 22:45:48

                                Exact. Je pense que TourBoucle et BoucleStop, ainsi que ChoixModeVideo et Flip sont inutile, voilà donc la méthode créer :

                                bool creer(unsigned int mode, int largeur, int hauteur, int nombreDeCouleur = 32, int action = Sdl_FINIR_PROGRAMME);

                                    if (initialiser && _type != Sdl_ECRAN)
                                    {
                                        _surface = SDL_CreateRGBSurface(mode, largeur, hauteur, nombreDeCouleur, 0, 0, 0, 0);
                                        if (_surface == NULL)
                                        {
                                            exit(EXIT_FAILURE);
                                        }
                                        return true;
                                   


                                Et la méthode remplir :

                                bool remplir(unsigned char rouge, unsigned char vert, unsigned char bleu, SDL_Rect *partie = NULL, int action = Sdl_FINIR_PROGRAMME);

                                    if ((initialiser && _charger) || _type == Sdl_ECRAN)
                                    {
                                        if (SDL_FillRect(_surface, partie, SDL_MapRGB(_ecran->format, couleur.rouge, couleur.vert, couleur.bleu)) != 0)
                                        {
                                                 exit(EXIT_FAILURE);
                                        }
                                        return true;
                                    }


                                Avec la gestion des erreurs en moins ;) !
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  14 juin 2007 à 9:57:09

                                  Je sais que ça va paraitre bête, mais apres tout c'est une methode :p .
                                  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...
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    14 juin 2007 à 11:00:10

                                    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 :D ! 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à ....

                                    Merci à tous pour votre aide ;) !
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      14 juin 2007 à 14:40:07

                                      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.
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      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.
                                      • Editeur
                                      • Markdown