Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C] exit, atexit et autre EXIT_FAILURE...

Sujet résolu
Anonyme
    28 février 2006 à 16:11:11

    Bonjour,
    dans de nombreux cours trouvés sur internet, je vois des fonctions du type:
    atexit(machin);
    exit(EXIT_SUCCESS);
    exit(EXIT_FAILURE);

    je voudrais donc savoir à quoi ça correspond
    Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      28 février 2006 à 16:13:50

      atexit (fonction), dit au système d'executer machin quand le programme se fermera,
      exit (EXIT_SECCES); quitte le programme et informe au système que tout s'est bien déroulée, et EXIT_FAILURE, que quelquechose a foiré
      En général man exit, man atexit te fournira plus d'infos que moi
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        28 février 2006 à 16:20:31

        Ok, mais il y a quelque chose que je comprends pas: si leprogramme se ferme, quel intêret d'appeler une fonction?
        • Partager sur Facebook
        • Partager sur Twitter
          28 février 2006 à 16:29:57

          libérer les resssources utilisées par le programme par exemple, dans le cas d'un quit assez brutal :)
          • Partager sur Facebook
          • Partager sur Twitter
            28 février 2006 à 16:30:04

            Bah si ça se ferme bien ou si y'a une erreur par exemple...enfin je pense, j'en sais rien^^
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              28 février 2006 à 16:36:37

              Ok d'accord merci!
              Edit: j'ai un problème: quand je teste ce code
              BITMAP *image = create_bitmap(50, 60);
              atexit(destroy_bitmap(image));

              ça me dit "invalid use of void expression"
              (pour info c'est de l'allegro, une BITMAP c'est comme une SDL_Surface)
              • Partager sur Facebook
              • Partager sur Twitter
                28 février 2006 à 19:08:02

                #include <stdio.h>
                #include <stdio.h>

                void destroy_bitmap(BITMAP* image);

                int main()
                {
                    BITMAP *image = create_bitmap(50, 60);

                /* Code... */

                    return 0;
                }
                /* Execute la fonction à la fin de main() : */
                #pragma exit 64
                void destroy_bitmap(BITMAP* image)
                {
                    /* Ta fonction */
                }


                Ce qui est intéressant (hého j'aime pas étaler), c'est que tu peux appeller plusieurs fonctions les unes à la suite des autres.

                Je suppose qu'il doit y avoir une différence de portabilité, mais bon après... pas dit.

                ++.
                • Partager sur Facebook
                • Partager sur Twitter
                  28 février 2006 à 19:12:49

                  La fonction prise par atexit ne retourne rien et ne doit pas prendre d'argument , ex. :


                  void exit_function (void);

                  int main ()
                  {
                     atexit (exit_function);
                     printf("blablabla\n");
                     return 0;
                  }

                  void exit_function (void)
                  {
                     printf("Le programme va se terminer");
                  }

                  Ce code n'est pas garanti, j'utilise jamais atexit :S
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    1 mars 2006 à 13:02:29

                    non destroy_bitmap c'est unr fonction prédéfinie c'est pas moi qui l'ai faite (c'est un genre de free() spéciale bitmap)
                    Sinon je crois que je vois pourquoi: comme vous l'avez dit, ça doit pas prendre d'argument, or destroy_bitmap en prend... donc ça ne marchera pas
                    Merci!
                    • Partager sur Facebook
                    • Partager sur Twitter
                      1 mars 2006 à 13:18:31

                      Je crois que la solution la plus simple dans ce cas serait d'appeller la fonction juste avant return 0; et après le getchar();
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        1 mars 2006 à 13:35:33

                        Oui ben oui on peut faire comme ça; le seul problème c'est en cas d'arrêt brutal du programme (bug etc) ben ça libère pas les ressources
                        • Partager sur Facebook
                        • Partager sur Twitter
                          1 mars 2006 à 13:40:22

                          Alors tu peux essayer avec #pragma exit, ça devrait marcher.
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            1 mars 2006 à 13:42:56

                            #pragma exit? c'est quoi la syntaxe?
                            • Partager sur Facebook
                            • Partager sur Twitter
                              1 mars 2006 à 13:51:40

                              (voir mon code ci-dessus)

                              #pragma exit nombre


                              ... où nombre est un nombre (on s'en serait douté :) ) qui définit le degré de priorité (pas trouvé plus simple) de la fonction qui suit la directive.

                              Par exemple si tu as #pragma exit 64 pour une fonction et #pragma exit 65 pour une autre, la fonction 2 sera exécutée à la fin de main et juste avant la fonction 1 puisque le nombre est plus grand. Ca permet de faire des suites de fonctions à la fin de main.

                              Attention cependant, le nombre doit être compris entre 64 et 255 (codé sur 1 octet), les nombres de 1 à 63 étant resérvés aux fonctions standard.

                              Voilà j'espère que c'était relativement clair.

                              ++
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                1 mars 2006 à 13:56:11

                                donc ce serait un truc du genre
                                void fonction(void)
                                {
                                    #pragma exit 65
                                    //Code....
                                }
                                ???
                                Mais dans ce cas ça ne marcherait pas, la fonction est prédéfinie...
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  1 mars 2006 à 14:00:31

                                  Non la directive doit être placée juste avant la fonction. Mais dans les libs tu les as les fonctions sinon...

                                  Ou tu fais ça :

                                  int main()
                                  {
                                      /* Ton code */
                                      return 0;
                                  }
                                  #pragma exit 64
                                  void ma_fonction(BITMAP* image)
                                  {
                                      destroy_bitmap(image);
                                  }
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Anonyme
                                    1 mars 2006 à 14:05:23

                                    Ok d'accord merci j'ai compris (je crois).
                                    Donc si j'ai compris, le PC va d'abord lancer tous les pragma exit avant de quitter?
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      1 mars 2006 à 14:21:34

                                      Exactement. Sauf si tu termine ton programme par abort ou _exit.

                                      Et... de rien ;)
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Anonyme
                                        1 mars 2006 à 14:41:53

                                        Merci beaucoup j'ai compris!
                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        [C] exit, atexit et autre EXIT_FAILURE...

                                        × 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