Partage
  • Partager sur Facebook
  • Partager sur Twitter

Quand faut-il appeler SDL_Quit ?

Sujet résolu
    17 juin 2022 à 20:19:28

    Bonsoir à tous, en regardant le tutoriel de zestedesavoir sur la SDL, j'ai remarqué ce code :

    #include <SDL2/SDL.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
        SDL_Window *window = NULL;
        if(0 != SDL_Init(SDL_INIT_VIDEO))
        {
            fprintf(stderr, "Erreur SDL_Init : %s", SDL_GetError());
            return EXIT_FAILURE;
        }
        window = SDL_CreateWindow("SDL2", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
                                  640, 480, SDL_WINDOW_SHOWN);
        if(NULL == window)
        {
            fprintf(stderr, "Erreur SDL_CreateWindow : %s", SDL_GetError());
            return EXIT_FAILURE;
        }
        /* On agit sur la fenêtre ici */
        SDL_Quit();
    return EXIT_SUCCESS;
    }

    Or, si la fenêtre ne peut pas être initialisée (donc window == NULL) on retourne directement EXIT_FAILURE sans appeler SDL_QUIT, mais ne faut-il pas appeler cette fonction pour "nettoyer" SDL quel que soit le chemin d'exécution (sauf si la SDL n'est pas initialisée) ?

    Est-ce que faire un atexit(SDL_Quit) en début de main est une solution ?

    • Partager sur Facebook
    • Partager sur Twitter
      17 juin 2022 à 20:23:14

      Hello,

      A mon avis, il faut toujours appeler SDL_Quit() si SDL_Init() a réussi.

      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        17 juin 2022 à 21:20:57

        Par pitié n'utilisez pas cette syntaxe de condition inversée, personne fait ça if (NULL == SDL_CreateWindow())

        Pour rejoindre l'avis de edgarjacobs est de toujours détruire dans le sens inverse les objets crées. Par exemple dans ton cas :

        • SDL_Init
        • SDL_CreateWindow
        • SDL_CreateRenderer
        • SDL_DestroyRenderer
        • SDL_DestroyWindow
        • SDL_Quit
        • Partager sur Facebook
        • Partager sur Twitter

        git is great because Linus did it, mercurial is better because he didn't.

          17 juin 2022 à 22:59:20

          La syntaxe inversée vient du code copié-collé, mais c'est une vraie horreur pas du tout intuitive.

          D'accord, ça confirme ce que je pensais, c'est logique tout nettoyer après avoir utilisé la lib, je m'étais posé la question comme je venais de voir ce code, que je n'avais jamais utilisé SDL et que je suis plus habitué au C++.

          Merci à vous deux :)

          EDIT : Au temps pour moi, le tuto en parle plus loin, je m'étais arrêté de lire trop tôt !

          Merci, j'aurais tout de même appris quelque chose.

          -
          Edité par Chi_Iroh 17 juin 2022 à 23:21:05

          • Partager sur Facebook
          • Partager sur Twitter
            18 juin 2022 à 0:39:17

            markand a écrit:

            Par pitié n'utilisez pas cette syntaxe de condition inversée, personne fait ça if (NULL == SDL_CreateWindow())


            Ça a quand même un avantage: écrire if(0=i) plutot que if(0==i) génèrera une erreur de compilation, alors que if(i=0)

            • ne génèrera aucun warning avec la ligne "classique" de compilation
            • génèrera un warning si, avec gcc, -Wall est spécifié, mais il faut encore que le programmeur lise et résolve les warnings

            Mais je suis comme toi, cette écriture me dérange. C'est sans doue l'habitude de la syntaxe classique.

            • Partager sur Facebook
            • Partager sur Twitter

            On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

              18 juin 2022 à 8:59:18

              C'est vrai que pour le coup de l'erreur ça peut être pratique mais j'ai toujours pris l'habitude de compiler avec -Wall -Wextra pour avoir le maximum de warnings et (essayer d') éviter les mauvaises surprises, donc je n'ai pas tellement d'intérêt à utiliser la syntaxe inversée.

              Surtout qu'en plus, on dit généralement "là je teste si la variable machin vaut 42" et pas "on regarde si 42 est la valeur de machin".

              Je pense que le mieux est d'activer et de corriger les warnings, au moins on a un code fonctionnel et pas besoin d'utiliser une syntaxe inversée qui peut perturber la lisibilité.

              • Partager sur Facebook
              • Partager sur Twitter
                28 juillet 2022 à 12:24:03

                Chi_Iroh a écrit:

                La syntaxe inversée vient du code copié-collé, mais c'est une vraie horreur pas du tout intuitive.

                Il n'y a pas d'intuitivité "naturelle". En fait, c'est parfaitement intuitif quand on a l'habitude de le voir et de le faire. C'est une question de **culture**, qui n'est pas la même pour tout le monde.

                En réalité c'était assez courant de faire ça à une époque. La valeur à comparer est mise devant parce qu'elle pourrait être difficile à repérer dans une  condition un peu longue

                if (Truc_Init(..............................)!=0) {
                
                }

                en la mettant en premier, ça dit de suite (en lisant de gauche à droite) qu'on veut voir si l'appel a échoué

                if (0 != Truc_Init(......................)) {
                   ...
                }
                


                Le problème, c'est plutôt qu'on ne tient aucun compte du code erreur spécifique retourné, au cas où ça plante.

                int error_code = Truc_Init(......);
                if (error_code != 0) {
                    ....
                    // afficher message correspondant au code
                }
                 

                Une très mauvaise habitude en général, même si SDL utilise une variable globale pour le code erreur (une mauvaise idée aussi !)






                -
                Edité par michelbillaud 28 juillet 2022 à 12:26:27

                • Partager sur Facebook
                • Partager sur Twitter
                  28 juillet 2022 à 23:26:07

                  michelbillaud a écrit:

                  [...]
                  en la mettant en premier, ça dit de suite (en lisant de gauche à droite) qu'on veut voir si l'appel a échoué

                  if (0 != Truc_Init(......................)) {
                     ...
                  }
                  

                  [...]
                  -

                  Edité par michelbillaud il y a environ 10 heures


                  C'était aussi bien plus courant à une époque où les compilos donnaient des messages d'erreurs moins clairs et surtout donnaient beaucoup moins de warnings. Par exemple si on utilisait par erreur = au lieu de == dans une conditionnelle le code :

                  if (0 = a) {
                      ...
                  }

                  produit un message d'erreur alors que 

                  if (a = 0) {
                      ...
                  }

                  n'en produit pas …

                  Mais je parle là d'une époque antédiluvienne.


                  • Partager sur Facebook
                  • Partager sur Twitter

                  Quand faut-il appeler SDL_Quit ?

                  × 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