Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL] Des erreurs que je ne comprend pas.

comme: multiple definition of `SDL_main'

    17 février 2006 à 1:40:48

    Bonjour :) !

    Mon problème c'est que j'essais de comprendre POURQUOI o_O ce code (ci-dessous) ne fonctionne pas.

    ça compil mais le programme quitte dès que je le lance.
    Je vous ait mis le seul warning plus bas qui doit être la source du problème car tous les médias dit dans mon fichier ce trouve bien dans le même répertoire.

    Voici mon code qui est cencé être un déplacement de sprite avec du son en même temps.
    Le problème semble venir de tous ce qui concerne l'audio car la vidéo seul marchait très bien.


    code:
    /* Inclusion des entêtes nécessaires */

    /* Librairie standard */
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_audio.h>
    #include <iostream>
    #include <stdio.h>
    #include <windows.h>

    #define AUDIO_BUFFER_SIZE 1024


    int quitProgram;

    Uint32 color;
    /* Pointeur sur la surface représentant l'écran */
    SDL_Surface *screen = NULL, *fond = NULL;

    /* Surface contenant l'image des sprites */
    SDL_Surface *sdlLoadedPicture;
       
    /* Rectangle décrivant le sprite actuel à afficher */
    SDL_Rect    sdlSrcSprite;

    int x;
    int y;






    //l'audio:
    SDL_AudioSpec sortie, obtenu, wav1;
    SDL_AudioCVT  wav1_cvt;

    Uint8 *wav1_buf;
    Uint32 wav1_len;
    Uint8 *cvt1_buf;
    int index1 = 0;



    void fill_audio(void *udata, Uint8 *stream, int len) {
      memset(stream,0,len);
      // Mélange des échantillons, volume 75%
     if(index1 < wav1_cvt.len_cvt) {
            if((index1+len) > wav1_cvt.len_cvt)
              len = wav1_cvt.len_cvt - index1;
            SDL_MixAudio(stream, cvt1_buf + index1, len, 0.75 * SDL_MIX_MAXVOLUME);
            index1 += len;
      }
    }













    int main(int argc, char *argv[])
    {
        SDL_Rect rect;
            int done;

            /* Initialisation de la partie Vidéo de SDL */
            if (SDL_Init (SDL_INIT_VIDEO) < 0)
                    /* En cas d'échec, sortie */
                    exit (1);

            /* Lorsque le programme se termine, il ferme SDL correctement */
            atexit(SDL_Quit);

            screen = SDL_SetVideoMode (1024, 768, 24, SDL_SWSURFACE | SDL_DOUBLEBUF);

            /* En cas d'echec, on sort */
            if (screen == NULL)
                    exit (2);

            /* Titre de la fenêtre */
            SDL_WM_SetCaption ("..::: Galxies Battle Front :::..", NULL);

           
                    //charge des images du sprites
      sdlLoadedPicture = SDL_LoadBMP("titre.bmp");
       fond = SDL_LoadBMP("fond.bmp");
       
       
        if(sdlLoadedPicture==NULL) //si on peut pas charger la pic
           exit(3); //on quit
           
        SDL_SetColorKey (
          sdlLoadedPicture,
          SDL_SRCCOLORKEY,
          SDL_MapRGB (sdlLoadedPicture->format, 0, 255, 0));
           
     x=0; //affectation de 0 à x & y
     y=0;     
           
       
    sdlSrcSprite.w = 57;
    sdlSrcSprite.h = 57;
    sdlSrcSprite.y = y;
    sdlSrcSprite.x = x;



     
     
     
     
      //debut audio ---------------------------
    if(argc < 3) {
            printf("Utilisation: %s son1.wav \n", argv[0]);
            return 1;
      }

      if(!SDL_LoadWAV(argv[1], &wav1, &wav1_buf, &wav1_len)) {

            printf("Erreur lors du chargement du fichier WAV\n");
            return 1;
      }

      // On demande un format de sortie 16 bits stéréo à 22kHz
      sortie.freq = 22050;
      sortie.format = AUDIO_S16;
      sortie.channels = 2;
      sortie.samples = AUDIO_BUFFER_SIZE;
      sortie.callback = fill_audio;
      sortie.userdata = NULL;

      if ( SDL_OpenAudio(&sortie, &obtenu) < 0 ) {
            fprintf(stderr, "Erreur SDL Audio: %s\n", SDL_GetError());
            return 2;
      }

      // Préparation des blocs de conversion audio

      SDL_BuildAudioCVT(&wav1_cvt, wav1.format, wav1.channels, wav1.freq,
                                            obtenu.format, obtenu.channels, obtenu.freq);


      // Conversion des échantillons vers le format de sortie

      cvt1_buf = (Uint8*)malloc(wav1_len * wav1_cvt.len_mult);
      wav1_cvt.len = wav1_len;
      wav1_cvt.buf = cvt1_buf;
      memcpy(cvt1_buf, wav1_buf, wav1_len);

      SDL_ConvertAudio(&wav1_cvt);


      // Démarrage de la restitution (en tâche de fond)
      SDL_PauseAudio(0);
      //Attend la fin de la restitution
        while((index1 < wav1_cvt.len_cvt)) {
            SDL_Delay(100);
      }
      free(cvt1_buf);
      SDL_FreeWAV(wav1_buf);

      SDL_CloseAudio();
      return 0;

    //fin audio ----------------------------



            /* Boucle principale */
            while (!quitProgram)
            {
          SDL_FillRect(
             screen,
             NULL,
             SDL_MapRGB (screen->format, 0, 0, 0));
             SDL_FillRect (screen, NULL, 0);
             
              if(y > y+1)
              {
                       x=0;
                       y=0;
              }
              else
              {
                  x=x+3;
                  y=y+3;
                  //Sleep(25);
           
                 

                 
                 
              }

              SDL_Event event;

             sdlSrcSprite.y = y;
             sdlSrcSprite.x = x;

            /* Lecture des évènements dans la queue d'évènements */
            while (SDL_PollEvent (&event))
            {
                switch (event.type)
                {
                /* Evenement de fermture d'application, on sort la boucle */
                case SDL_QUIT:
                    quitProgram = 1;
                    break;
                }
            }
           
       
            SDL_BlitSurface(fond, NULL, screen, NULL);
            SDL_BlitSurface(sdlLoadedPicture,NULL,screen,&sdlSrcSprite);
           
           
             
             
                   
                    SDL_Flip (screen);
                    //SDL_FreeSurface(fond);
                   
            }
            return 0;
    }







    Erreur au compilo:
    In function `void fill_audio(void*, Uint8*, int)':
    [Warning] passing `double' for converting 4 of `void SDL_MixAudio(Uint8*, const Uint8*, Uint32, int)'



    le bug se situ vers là nan ?:
    SDL_MixAudio(stream, cvt1_buf + index1, len, 0.75 * SDL_MIX_MAXVOLUME);
    ou alors c'est autre chose ?

    Dans le fichier stdout j'ai :
    Utilisation: C:\...\Projet1.exe son1.wav

    ++

    Edit: c'est bizard mais je viens de remarquer que le warning ne vient qu'une fois sur 2 à la compilation :-/ et même quand il n'y est pas le programme se ferme dès le lancement, c'est quoi le problème?
    • Partager sur Facebook
    • Partager sur Twitter
      17 février 2006 à 17:06:03

      eh ba moi perso j'en sais rien vraiment dsl sinon un conseil attend les cours de m@teo21
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        17 février 2006 à 22:52:12

        Citation : Erreur au compilo :


        In function `void fill_audio(void*, Uint8*, int)':
        [Warning] passing `double' for converting 4 of `void SDL_MixAudio(Uint8*, const Uint8*, Uint32, int)'


        (les warnings, en général, sont des petites erreurs qui n'empêchent pas la compilation)


        Chez moi le programme compile et éxécutes. Simplement, après un très court instant, la fenêtre qui s'est ouverte se ferme. C'est donc une erreur d'execution, et non de compilation. Les causes possibles sont donc un peu différentes.
        SDL n'as pas créé les fichiers stdout.txt ni stderr.txt, donc pas de messages d'érreurs qui auraient pu nous aider.

        *Peut-être que les images/sons que tu essaies de charger dans ton applications ne sont pas placées dans le répertoire de l'éxécutable ?


                SDL_CloseAudio();
                return 0;

        *Je n'ait pas très bien comprit pourquoi ce return 0; était là ?
        Il n'as pas l'air d'être dans un if et il termine l'execution de main ...?
        (je doit me tromper, car ce n'est pas la cause de notre erreur, ou alors il y a plusieurs causes).

                if(argc < 3) {
                printf("Utilisation: %s son1.wav \n", argv[0]);
                return 1;
                }

                if(!SDL_LoadWAV(argv[1], &wav1, &wav1_buf, &wav1_len)) {

                printf("Erreur lors du chargement du fichier WAV\n");
                return 1;
                }


        *Après quelques tests, j'ai cru comprendre que l'erreur venait de là.
        Si j'enlève le premier tests, j'obtiens des vrais plantages de l'applications. Donc, quand la fenêtre se ferme, c'est parceque main() retourne 0 a ce point du programme.
        Si j'appelle le programme avec plus de trois arguments (on ne passe donc pas par ce if), j'obtiens pourtant toujours la même erreur. Il doit donc y avoir une autre cause, mais pour l'instant, je ne la voit pas...

        En espérant avoir pu t'aider. quand même...


        • Partager sur Facebook
        • Partager sur Twitter
          18 février 2006 à 0:42:00

          Merci pour ton aide, jvais aussi répondre à tes questions. tout mes .bmp et le .wav se trouve dans mon répertoire où est exécuté le programme.
          Il y a une ligne cependant dans le fichier stdout.txt:
          [gras]Utilisation: C:\Documents and Settings\Platost\Mes documents\sdz\C\SDL\son\Projet1.exe son1.wav [/gras]

          Sinon le return 0 n'a pas vraiment d'utiliter mais comme il n'était pas la source du problème j'ai oublié de le virer.

          Si tu as des suggestions je suis tout ouïe, merci.

          ++
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            18 février 2006 à 13:11:14

            Je pense que la meilleure chose à faire serait de faire des appels à printf() a chaque étape de ton code (chaque test, chaque fonction), pour voir par ou est passé ton programme. Enfin, il ne faut pas oublier qu'un return dans main termine le programme immédiatement (enfin, je crois).
            • Partager sur Facebook
            • Partager sur Twitter
              18 février 2006 à 22:34:54

              Voilà j'ai suivi tes conseils pour les printf et il se trouve que le problème vient de là:

              if(argc < 3) {
                      printf("Utilisation: %s son1.wav \n", argv[0]);
                  return 1;
                }


              c'est quoi le bogue ?

              Si c'est tant là galère n'y a-t-il pas un autre moyen pour lire des sons en sdl? j'ai entendu parler de fmod mais j'ai aps trop trouver de code pour la lecture du son.
              ++
              • Partager sur Facebook
              • Partager sur Twitter

              [SDL] Des erreurs que je ne comprend pas.

              × 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