Partage
  • Partager sur Facebook
  • Partager sur Twitter

Appel de fonction!

    12 octobre 2006 à 21:39:10

    Salut!

    Bon je sais appeler une fonction normalement mais y'a un quelque chose qui me derange dans les cours de M@teo (bien que les mieux fait que j'ai trouver ;) ).


        if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) == -1) //demarrage de la SDL, si erreur ALORS ....
        {
            fprintf(stderr, "Erreur d'initialisation de la SDL : %s\n", SDL_GetError()); //ecriture de l'erreur
            exit(EXIT_FAILURE);

            SDL_Quit();
        }


    Ca fait appel directement a la fonction?

    parce que j'avais penser qu'on devait appeler la fonction separemment d'abord puis faire une condition :

        SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);

        if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) == -1) //demarrage de la SDL, si erreur ALORS ....
        {
            fprintf(stderr, "Erreur d'initialisation de la SDL : %s\n", SDL_GetError()); //ecriture de l'erreur
            exit(EXIT_FAILURE);

            SDL_Quit();
        }


    Merci de vos reponses d'avance

    Kurapix
    • Partager sur Facebook
    • Partager sur Twitter
      12 octobre 2006 à 21:44:38

      Salut,

      En effet le premier code appel bien la fonction SDL_Init :
      Lors de l'exécution, le programme regarde dans le if : il y a une fonction, donc il l'exécute.
      Ensuite il conserve le retour de la fonction, puis le compare à l'autre expression.

      Dans le deuxième code, la fonction sera appellée deux fois.
      Si le fait d'appeler une fonction dans un if te dérange, tu peux faire ceci :
      int retourdefonction;
      retourdefonction = SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);

          if (retourdefonction == -1) //demarrage de la SDL, si erreur ALORS ....
          {
              fprintf(stderr, "Erreur d'initialisation de la SDL : %s\n", SDL_GetError()); //ecriture de l'erreur
              exit(EXIT_FAILURE);

              SDL_Quit();
          }
      • Partager sur Facebook
      • Partager sur Twitter
        12 octobre 2006 à 21:53:01

        Le C permet d'imbriquer des instructions dans des expressions (et inversement.. heureusement).
        En C une fonction peu renvoyer une valeur quelconque selon le type de la fontion. La valeur retournée par une fonction est souvent utiliser pour savoir si la fonction s'est bien déroulé.

        int main()
        {
            FILE* input;
            if(input = fopen("fichier.txt" "r") != NULL)
            {
                   // Instructions...
            }
            else // input == NULL et on quite la fonction
            {
               return 1; // 1 signifie qu'il y a eu une erreur pour l'OS
            }
             
            return 0; // tout c'est bien passé, on quitte le programme normalment
        }


        La valeur retournée par main est utilisé par l'OS pour savoir si le programme s'est bien déroulé.
        La valeur retournée par fopen est elle traité a l'intérieur du programme. Si fopen renvoit NULL il y a eu une erreur, erreur que le programme doit pouvoir gérer !
        Dans l'exemple ci-dessus, pour l'ouverture du fichier, la valeur retournée par fopen est d'abord affecté a "input" puis cette meme valeur est comparé a NULL. Si la condition est vrai, elle vaut 1, si elle est fausse elle vaut 0.

        Ainsi si l'on écrit :

        j += (j<4)*5 - (j>4)*2;
        (j<4) est d'abord évalué, si l'expression est vrai elle vaut 1 et alors l'instruction est équivalente à
        j = j + 5;
        sinon si j est supérieur a 4 l'expression est équivalente à
        j = j - 2;

        si j est égal à 4, rien ne se passe. On aurait aussi très bien pu par exemple remplacer une des conditions par une fonction renvoyant un entier, la fonction aurait tout d'abord été exécuté puis la valeur de retour aurait été utilisée dans l'expression.
        • Partager sur Facebook
        • Partager sur Twitter
        Inkamath on GitHub - Interpréteur d'expressions mathématiques. Reprise du développement en cours.
          12 octobre 2006 à 22:04:02

          Ok merci des reponses.

          Si je comprends bien :


                  // Si ce n'était PAS la bonne lettre
                  if (!rechercheLettre(lettre, motSecret, lettreTrouvee))
                  {
                      coupsRestants--; // On enlève un coup au joueur
                  }


          correpond a:


                  if (rechercheLettre(lettre, motSecret, lettreTrouvee))
                  {
                      coupsRestants = coupsRestants;
                  }
                  else
                  {
                      coupsRestants--; // On enlève un coup au joueur
                  }


          Et donc le premier code est mieux optimiser non?

          iNaKoll c'est mieux ca non? :

          int main()
          {
              FILE* input;
              if(input = fopen("fichier.txt" "r") != NULL)
              {
                     // Instructions...
              }
              else // input == NULL et on quite la fonction
              {
                 return EXIT_FAILURE; // 1 signifie qu'il y a eu une erreur pour l'OS
              }
               
              return EXIT_SUCCESS; // tout c'est bien passé, on quitte le programme normalment
          }


          Je parlais pas de l'operateur d'affectation mais de l'appel d'une fonction dans une condition iNaKoll ...

          Kurapix
          • Partager sur Facebook
          • Partager sur Twitter
            12 octobre 2006 à 22:08:11

            Ouai voilà je crois que tu as compris le principe, EXIT_SUCCESS et EXIT_FAILURE sont des macros défini dans stdlib si mes souvenirs sont bon, je crois bien que ca permet d'assurer la portabilité des programmes sur linux car sous linux success = 1 et failure = 0, ou quelque chose comme ça... alors que sous windows c'est l'inverse merci de confirmer :]
            • Partager sur Facebook
            • Partager sur Twitter
            Inkamath on GitHub - Interpréteur d'expressions mathématiques. Reprise du développement en cours.
              12 octobre 2006 à 22:13:30

              Merci grace a vous ca m'as permis d'eclaircir ce point.

              Je sais pas c'est quoi le nombre pour le succes sous linux et autres mais ce que je sais c'est que c'est different de Windows ;).
              Si on code autant faire un code portable c'est mieux et toujours + "pro" ;).

              Bon je vais retaffer la manipulation de fichier parce que la j'ai oublier ... lol

              Kurapix
              • Partager sur Facebook
              • Partager sur Twitter
                13 octobre 2006 à 0:14:55

                Citation : iNaKoll


                int main()
                {
                    FILE* input;
                    if(input = fopen("fichier.txt" "r") != NULL)
                    /*...*/
                }



                Attention, cette écriture n'est pas correcte. input, ici, ne pourrait jouer que le rôle de booléen.
                En effet, ce code sera lu ainsi :
                if(input = (fopen("fichier.txt" "r") != NULL))

                '!=' a priorité sur '='.
                Il faut donc y placer des parenthèses :
                if((input = fopen("fichier.txt" "r")) != NULL)
                • Partager sur Facebook
                • Partager sur Twitter
                  13 octobre 2006 à 0:20:09

                  Au temps pour moi :-°
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Inkamath on GitHub - Interpréteur d'expressions mathématiques. Reprise du développement en cours.

                  Appel de fonction!

                  × 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