Partage
  • Partager sur Facebook
  • Partager sur Twitter

Compteur de millisecondes défectueux

Impossible de formater ni de charger le texte...

Sujet résolu
    15 juillet 2006 à 19:19:43

    Bonjour,

    la compilation de mon compteur de millisecondes (exercice du cours de M@téo) s'effectue normalement, mais non son exécution : le programme se ferme aussi vite qu'il s'est lancé...
    Cela me semblait pourtant un exercice aisé, mais à coups de fprint(), j'ai localisé les erreurs (que je vous ai indiquées ci-dessous dans les commentaires), et je n'en comprends aucune :

    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_ttf.h>

    /***************************
     *   Fonction principale   *
     ***************************/


    int main(int argc, char *argv[])
    {

    /********************************
     *   Initialisation de la SDL   *
     ********************************/


            if (SDL_Init(SDL_INIT_VIDEO) == -1)
            {
                    fprintf(stderr, "Erreur lors de l'initialisation de la SDL >> %s\n", SDL_GetError());

                    exit(EXIT_FAILURE);
            }

    /******************************************
     *   Initialisation de la librairie TTF   *
     ******************************************/


            if (TTF_Init() == -1)
            {
                    fprintf(stderr, "Erreur lors de l'initialisation de la librairie TTF >> %s\n", TTF_GetError());

                    exit(EXIT_FAILURE);
            }

    /*****************************
     *   Gestion de la fenêtre   *
     *****************************/


            SDL_Surface *fenetre = NULL;

            //SDL_WM_SetIcon(SDL_LoadBMP("Icone.bmp"), NULL);

            fenetre = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);

            if (fenetre == NULL)
            {
                    fprintf(stderr, "Erreur lors du chargement du mode vidéo >> %s\n", SDL_GetError());

                    exit(EXIT_FAILURE);
            }

            SDL_WM_SetCaption("Compteur", NULL);
            SDL_ShowCursor(SDL_DISABLE);

    /*********************************************
     *   Ecriture à l'aide de la librairie TTF   *
     *********************************************/


            fprintf(stderr, "Préparation de l'écriture en cours...\n");

            TTF_Font        *police = NULL;

            police = TTF_OpenFont("georgia.ttf", 65);;

            fprintf(stderr, "Chargement de la police effectué !\n");

            fprintf(stderr, "Chargement de la couleur et du formatage...\n");

            SDL_Color       couleurTexte  = {0, 0, 64},
                                    couleurFond     = {255, 255, 255};
            SDL_Rect        positionTexte;
            SDL_Surface *texte                = NULL;

            TTF_SetFontStyle(police, TTF_STYLE_BOLD | TTF_STYLE_ITALIC); // Cette ligne provoque une erreur

            fprintf(stderr, "Chargement de la couleur et du formatage effectué !\n");

            char    compteur[30];
            int          temps = 0;

            sprintf(compteur, "Temps >> %d", temps);

            texte = TTF_RenderText_Shaded(police, compteur, couleurTexte, couleurFond); // Cette ligne provoque une erreur

            positionTexte.x = (fenetre->w - texte->w) / 2;
            positionTexte.y = (fenetre->h - texte->h) / 2;

            fprintf(stderr, "Préparation de l'écriture effectuée !\n");

    /******************************
     *   Gestion des événements   *
     ******************************/


            (...)

    /************************
     *   Fin du programme   *
     ************************/


            TTF_CloseFont(police);
            TTF_Quit();

            SDL_FreeSurface(texte);

            SDL_Quit();

            return EXIT_SUCCESS;
    }

    Merci de votre aide !
    • Partager sur Facebook
    • Partager sur Twitter
      16 juillet 2006 à 10:33:02

      Apparemment, toutes les lignes qui provoquent une erreur sont celles qui utilisent le pointeur *police.

      J'ai remarqué qu'il y avait un détail à régler sur la ligne de chargement de la police:

      police = TTF_OpenFont("georgia.ttf", 65);;


      Attention, il y a 2 points-virgules, je ne pense pas que cela résoudra le problème, mais il ne faut rien négliger.
      • Partager sur Facebook
      • Partager sur Twitter
        16 juillet 2006 à 11:32:29

        Très juste, je suis d'ailleurs surpris qu'il compile avec une telle erreur de frappe...
        Bref, le problème reste là, mêmes symptomes ; j'ai tenté de changer la police, ainsi que la taille, mais rien n'y fait...
        Merci déjà pour ce petit pas !
        • Partager sur Facebook
        • Partager sur Twitter
          16 juillet 2006 à 12:24:56

          En tout cas, c'est la ligne de chargement de la police qui provoque un bug, je vois pas d'autre solution. Essaie de vérifier si les polices que tu prends sont exactement au formart .ttf, active l'option [-Wall] du compilateur (Build options)... Essaie beaucoup de choses.
          • Partager sur Facebook
          • Partager sur Twitter
            16 juillet 2006 à 14:11:21

            Les polices sont au bon format, et même en ajoutant [-Wall] je n'ai aucun warning...
            • Partager sur Facebook
            • Partager sur Twitter
              16 juillet 2006 à 14:33:51

              Mettre des point-virgules en trop ne provoque aucune erreur.

              Tu testes tout sauf le plus important : le chargement de la police ! Vérifies que TTF_OpenFont() ne retourne pas NULL.

              Sinon, cette ligne est à enlever :
              //SDL_WM_SetIcon(SDL_LoadBMP("Icone.bmp"), NULL);

              Vu que tu peux faire :
              SDL_WM_SetCaption("Compteur", "Icone.ico");
              • Partager sur Facebook
              • Partager sur Twitter
                16 juillet 2006 à 18:19:06

                Je confirme : l'erreur est bien au chargement de la police.
                Mais qu'est-ce qui peut bien m'empêcher de charger simplement une police ?!

                Sinon, j'ignorais que la fonction du titre servait également à assigner une icône, c'est bon à savoir, merci !
                • Partager sur Facebook
                • Partager sur Twitter
                  17 juillet 2006 à 19:18:33

                  Un petit up! ne mange pas de pain...
                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 juillet 2006 à 19:26:09

                    Re up ! (vu le prix du pain...)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 juillet 2006 à 20:39:42

                      Citation : remram44

                      Sinon, cette ligne est à enlever :

                      //SDL_WM_SetIcon(SDL_LoadBMP("Icone.bmp"), NULL);


                      Vu que tu peux faire :

                      SDL_WM_SetCaption("Compteur", "Icone.ico");


                      A ma connaissance, le deuxième paramètre de setcaption sert à donner un nom à l'icône et non à indiquer l'icône qu'on veut utiliser. C'est apparemment utilisé seulement sous Linux.
                      Pour placer une icône en haut à gauche de la fenêtre, il faut donc bien utiliser SetIcon.
                      • Partager sur Facebook
                      • Partager sur Twitter

                      If you'd like to join us, read "How do we work at OpenClassrooms"! :)

                      Compteur de millisecondes défectueux

                      × 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