Partage
  • Partager sur Facebook
  • Partager sur Twitter

pointeurs FMOD

Sujet résolu
    13 octobre 2006 à 12:44:48

    Salut à tous !
    Tout d'abord un grand merci à toute l'équipe du site il est super !

    Alors voila je fais un programme dans lequel il y a du son, donc tout marche, puis le main.c commençait à devenir très très encombré donc je me suis dit je vais faire un sons.c je déclare mes pointeurs de sons dans le main.c et je les envois dans ma fonction d'initialisation pour charger les wav dedans, je ne renvoi rien puisqu'un pointeur n'en a pas besoin normalement, je me fais une autre fonction qui joue les sons. Et quand je compile et bah les sons ne marchent pas, mais si je met ma fonction d'initialisation (les pointeurs qui reçoivent les wav) dans le main.c tout marche.

    Je ne sais pas si ce que j'ai dit est clair, je pourrais mettre le code pour éclairer si vous voulez (je peux pas le faire je dois partir).

    Merci d'avance pour vos éclairements.
    • Partager sur Facebook
    • Partager sur Twitter
      13 octobre 2006 à 18:34:12

      si j'ai bien compris, je te dirais qu'il faut garder les pointeurs dans la fonction main() mais de mettre les fonctions dans sons.c
      • Partager sur Facebook
      • Partager sur Twitter
        13 octobre 2006 à 19:19:15

        Ca c'est ce que j'ai mis dans le main (uniquement la partie son)

        // variables FMOD
            FSOUND_SAMPLE *opendoor = NULL;
            FSOUND_SAMPLE *closedoor = NULL;
            FSOUND_SAMPLE *opendoors = NULL;
            FSOUND_SAMPLE *closedoors = NULL;
            FSOUND_SAMPLE *explosions = NULL;
            FSOUND_STREAM *musique = NULL;
            init_sounds (volume,opendoor,opendoors,closedoor,closedoors,explosions,musique); //initialise toute la partie son


        Ca c'est ma fonction qui est dans le sons.c qui charge les pointeurs.

        void init_sounds (int volume, FSOUND_SAMPLE *opendoor, FSOUND_SAMPLE *opendoors, FSOUND_SAMPLE *closedoor, FSOUND_SAMPLE *closedoors, FSOUND_SAMPLE *explosions, FSOUND_STREAM *musique)
        {

            /* Initialisation de FMOD */
            FSOUND_Init(44100, 32, 0);

            /* Chargement des sons et vérification du chargement */
            opendoor = FSOUND_Sample_Load(FSOUND_FREE, "Sons/opendoor.wav", 0, 0, 0);
            if (opendoor == NULL)
            {
                fprintf(stderr, "Impossible de lire opendoor.wav\n");
                exit(EXIT_FAILURE);
            }
            closedoor = FSOUND_Sample_Load(FSOUND_FREE, "Sons/closedoor.wav", 0, 0, 0);
            if (opendoor == NULL)
            {
                fprintf(stderr, "Impossible de lire closedoordoor.wav\n");
                exit(EXIT_FAILURE);
            }
            opendoors = FSOUND_Sample_Load(FSOUND_FREE,"Sons/opendoors.wav", 0, 0, 0);
            if(opendoors == NULL)
            {
                fprintf(stderr, "Impossible de lire opendoors.wav\n");
                exit(EXIT_FAILURE);
            }
            closedoors = FSOUND_Sample_Load(FSOUND_FREE,"Sons/closedoors.wav", 0, 0, 0);
            if(closedoors == NULL)
            {
                fprintf(stderr, "Impossible de lire closedoors.wav\n");
                exit(EXIT_FAILURE);
            }
            explosions = FSOUND_Sample_Load(FSOUND_FREE,"Sons/Explosions.wav",0 ,0 ,0);
            if(explosions == NULL)
            {
                fprintf(stderr, "Impossible d'ouvrir explosions.wav\n");
                exit(EXIT_FAILURE);
            }

            //Chargement des musiques
            musique = FSOUND_Stream_Open("Sons/Musiques/menu.mp3", 0, 0, 0);
            if(musique == NULL)
            {
                fprintf(stderr, "Impossible d'ouvrir menu.mp3");
                exit(EXIT_FAILURE);
            }

            //Lecture de la musique de menu et réglage volume
            FSOUND_Stream_Play(FSOUND_FREE,musique);
            FSOUND_SetVolume(FSOUND_ALL, volume);
        }


        Si je la met dans le main ça marche, mais ça prend pas mal de place, c'est pour ça que je veux la placer ailleurs.
        • Partager sur Facebook
        • Partager sur Twitter
          13 octobre 2006 à 19:47:09

          faut pas oublier de mettre les entêtes dans main.c
          • Partager sur Facebook
          • Partager sur Twitter
            13 octobre 2006 à 19:51:16

            Ouai il y a ça au début

            #include <stdio.h>
            #include <stdlib.h>
            #include <SDL/SDL.h>
            #include <SDL/SDL_image.h>
            #include <SDL/SDL_ttf.h>
            #include <FMOD/fmod.h>
            #include "constante.h"
            #include "sons.h"


            int main(int argc, char *argv[])
            {
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              13 octobre 2006 à 19:55:53

              quand tu envoie t'es pointeur, tu écrit bien
              init_sounds(son1, son2, ect); //juste

              //Et non

              init_sounds(*son1, *son2, *ect); //faux
              • Partager sur Facebook
              • Partager sur Twitter
                13 octobre 2006 à 19:57:06

                Oui j'écris bien sans étoiles, si je le fais j'aurrais des erreurs de compilation.
                Je précise que mon programme compile bien et execute le programme.
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  13 octobre 2006 à 19:58:54

                  Alors ya problème, demande à ed, il en sait beaucoup plus que la plupart d'entre nous.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 octobre 2006 à 20:00:42

                    Je ne connais pas encore Ed mais je sens que ça ne va pas tarder :)
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      14 octobre 2006 à 0:57:06

                      Citation : Cyril_MSA

                      Ca c'est ce que j'ai mis dans le main (uniquement la partie son)


                      // variables FMOD
                          FSOUND_SAMPLE *opendoor = NULL;

                          init_sounds (volume,opendoor,<...>); //initialise toute la partie son


                      Ca c'est ma fonction qui est dans le sons.c qui charge les pointeurs.


                      void init_sounds (int volume, FSOUND_SAMPLE *opendoor,<...>)
                      {
                          /* Initialisation de FMOD */
                          FSOUND_Init(44100, 32, 0);

                          /* Chargement des sons et vérification du chargement */
                          opendoor = FSOUND_Sample_Load(FSOUND_FREE, "Sons/opendoor.wav", 0, 0, 0);

                      <...>
                      }



                      C'est un problème classique d'incompréhension des paramètres et des pointeurs. Je continue de penser que de se lancer dans des applications utilisant des bibliothèques aussi complexes que SDL ou FMOD sans maitriser les bases du C, c'est un peu suicidaire.

                      Il faut donc revenir aux fondamentaux, et expliquer ce qu'est un paramètre de fonction.

                      Un paramètre est une variable locale à la fonction, qui est initialisée lors de l'appel de celle-ci. Par exemple :

                      Soit la fonction f dont le prototype est :
                      f(int x);

                      appelé de la façon suivante :
                         int a = 123;
                         f(a);

                      Le parametre x de f() reçoit une copie de la valeur (x = a, soit 123).

                      Celle-ci peut être lue dans la fonction.

                      Cette valeur étant stockée dans une variable locale, elle peut être modifiée, mais cette modification n'aura aucun impact sur la valeur initiale de a. En effet, la fonction ne connait pas cette variable.

                      Illustration :

                      #include <stdio.h>

                      void f(int x)
                      {
                         x = 456;
                      }

                      int main (void)
                      {
                         int a = 123;

                         printf ("a = %d\n", a);

                         f (a);

                         printf ("a = %d\n", a);

                         return 0;
                      }

                      produit, sans surprise :

                      a = 123
                      a = 123

                      Press ENTER to continue.

                      C'est exactement ce qui se passe dans ton code.

                      Je te laisse refléchir et on en reparle demain.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Music only !
                        14 octobre 2006 à 17:03:43

                        Cet exemple que tu m'a montré je le comprend très bien, mais ce que j'envoie moi ce sont des pointeurs non ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          14 octobre 2006 à 18:06:03

                          Il n'y a aucune différence entre un pointeur et une variable standard comme un int, par exemple, seulement un pointeur a une valeur correspondant a une adresse, et c'est tout.

                          Partant de là, j'ai reprit le code d'emmanuel pour l'adapter avec une variable de type pointeur et produire le même exemple.


                          int g=456;

                          void f(int* x){
                              x=&g;
                          }

                          int main(){
                              int a=123;
                              int* pi=&a;
                              printf("a = %i\n",*pi);
                              f(pi);
                              printf("g = %i\n",*pi);
                              return 0;
                          }


                          De la même manière, alors que l'on s'attend a voir dans un premier temps s'afficher la valeur de a puis de g via le pointeur pi, la fonction f ne modifie en aucun cas son argument (pi, un int*) et dans pi vaut toujours l'adresse de a, d'ou le double affichage de la valeur de a (123).

                          Je suppose que tu as lu le cours et que tu sais comment on résoud le problème qu'a soulevé emmanuel, et que tu pourrais réécrire son code pour que la fonction f modifie la valeur de a et lui affecte réellement 456, via un pointeur sur entier.

                          Ton problème est exactement le même, si pour modifier la valeur d'une variable entière on passe par un pointeur sur entier, alors pour modifier la valeur d'un pointeur sur FSOUND_SAMPLE, et bien on passe par un pointeur sur pointeur de FSOUND_SAMPLE, ce qui est terriblement logique.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            16 octobre 2006 à 12:36:49


                            opendoor = FSOUND_Sample_Load(FSOUND_FREE, "Sons/opendoor.wav", 0, 0, 0);


                            Ca ça me donne l'adresse de là où est chargé le son.

                            Donc si j'ai bien compris ce que vous m'avez dit je devrais retourner opendoor et ça transmettrait l'adresse dans le opendoor du main.

                            Mais si je fais un return et que je transforme ma fonction en celle ci :

                            FSOUND_SAMPLE init_sounds (FSOUND_SAMPLE *opendoor)

                            et que je fais mon return et que je le reprend dans ma fonction
                            opendoor=init_sounds (opendoor);

                            le compilateur me dit : invalid use of incomplete typedef 'FSOUND_SAMPLE'
                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 octobre 2006 à 12:57:10

                              Citation : Cyril_MSA

                              le compilateur me dit : invalid use of incomplete typedef 'FSOUND_SAMPLE'


                              Manque une '*'. Le type retourné doit être pointeur de type FSOUND_SAMPLE.

                              FSOUND_SAMPLE *init_sounds (void)

                              C'est pas un peu ce qu'on se tue à te dire...
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Music only !
                                17 octobre 2006 à 14:17:58

                                Merci à tous pour vos rappels je pense que maintenant je n'aurai plus de problèmes avec les pointeurs.
                                ;)
                                • Partager sur Facebook
                                • Partager sur Twitter

                                pointeurs FMOD

                                × 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