IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Bug de la fonction SDL_Delay sous OS X ?


Sujet :

SDL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 16
    Points : 13
    Points
    13
    Par défaut Bug de la fonction SDL_Delay sous OS X ?
    Bonjour,

    Sous OS X El Capitan, j'ai voulu m'initier à la bibliothèque SDL 2 en C grâce au cours : Installation et configuration de la SDL2. Mais problème dès la vérification du code :
    Lorsque j'exécute le code (avec la fonction SDL_Delay) qu'on nous demande de copier-coller, je n'ai aucune erreur d'indiquée, le programme se lance correctement et dur bien 3 secondes, mais la fenêtre ne s'affiche pas à l'écran...

    En revanche, j'ai copier coller la fonction "pause" qu'on peut trouver sur un autre site, et là la fenêtre s'affiche comme prévu.


    Code avec la fonction SDL_Delay :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #include <SDL2/SDL.h>
    #include <stdio.h>
     
    int main(int argc, char** argv)
    {
        /* Initialisation simple */
        if (SDL_Init(SDL_INIT_VIDEO) != 0 )
        {
            fprintf(stdout,"Échec de l'initialisation de la SDL (%s)\n",SDL_GetError());
            return -1;
        }
     
        {
            /* Création de la fenêtre */
            SDL_Window* pWindow = NULL;
            pWindow = SDL_CreateWindow("Ma première application SDL2",SDL_WINDOWPOS_UNDEFINED,
                                                                      SDL_WINDOWPOS_UNDEFINED,
                                                                      640,
                                                                      480,
                                                                      SDL_WINDOW_SHOWN);
     
            if( pWindow )
            {
                SDL_Delay(3000); /* Attendre trois secondes, que l'utilisateur voit la fenêtre */
     
                SDL_DestroyWindow(pWindow);
            }
            else
            {
                fprintf(stderr,"Erreur de création de la fenêtre: %s\n",SDL_GetError());
            }
        }
     
        SDL_Quit();
     
        return 0;
    }

    Code sans la fonction SDL_Delay :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #include <SDL2/SDL.h>
     
    #include <stdio.h>
     
     
    void paus()
    {
        int continuer = 1;
        SDL_Event event;
     
        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
            }
        }
    }
     
     
    int main(int argc, char** argv)
    {
        /* Initialisation simple */
        if (SDL_Init(SDL_INIT_VIDEO) != 0 )
        {
            fprintf(stdout,"Échec de l'initialisation de la SDL (%s)\n",SDL_GetError());
            return -1;
        }
     
        {
            /* Création de la fenêtre */
            SDL_Window* pWindow = NULL;
            pWindow = SDL_CreateWindow("Ma première application SDL2",SDL_WINDOWPOS_UNDEFINED,
                                                                      SDL_WINDOWPOS_UNDEFINED,
                                                                      640,
                                                                      480,
                                                                      SDL_WINDOW_SHOWN);
     
            if( pWindow )
            {
                paus(); /*Appelle de la fonction pause - SDL_Delay(3000); */
     
                SDL_DestroyWindow(pWindow);
            }
            else
            {
                fprintf(stderr,"Erreur de création de la fenêtre: %s\n",SDL_GetError());
            }
        }
     
        SDL_Quit();
     
        return 0;
    }
    Même si il y a une solution à ce petit problème, j'aimerais bien savoir utiliser SDL_Delay...

    Merci d'avance !

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Je spécule mais peut-être que la création effective de la fenêtre est différée, et comme SDL_Delay bloque le thread et que la fenêtre est détruite juste après tu ne la vois jamais instanciée.

    Tu peux constater le fonctionnement de SDL_Delay par exemple en plaçant ton appel juste avant la ligne continuer = 0; dans le second exemple. Ainsi la fenêtre se fermera trois secondes après avoir reçu la commande de fermeture d'application.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    Effectivement, j'ai pu constater le fonctionnement de SDL_Delay, merci !
    Mais si la fonction pause n'existait pas, où devrais-je appeler SDL_Delay pour pouvoir voir la fenêtre ?

  4. #4
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Il faut laisser le temps / la possibilité au système de fenêtrage d'instancier la fenêtre. Peut-être au sein d'une boucle (« tant que l'évènement SDL_QUIT n'est pas reçu, on dort 2 secondes puis on recommence », de mémoire il faut utiliser SDL_PollEvent..) ? De toute manière personne n'appelle SDL_Delay juste après la création de la fenêtre en pratique, ça ne sert pas à grand chose hors du cadre de l'exercice.

    Tu as correctement suivi les consignes, ce comportement n'est pas de ton fait mais spécifique à ton système. Tu verrais peut-être la fenêtre s'ouvrir sous Linux ou Windows. Ce n'est pas très important au final. Passe aux exercices suivants qui te feront faire des choses plus passionantes.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    Très bien, merci beaucoup pour ton aide !
    Je testerai sur Linux une prochaine fois.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. bug fonction each() sous IE
    Par gambic dans le forum jQuery
    Réponses: 5
    Dernier message: 30/09/2010, 09h46
  2. Existe-t-il une fonction Eval() sous Delphi ?
    Par Hell dans le forum Langage
    Réponses: 5
    Dernier message: 20/12/2004, 17h45
  3. Fonction "Format" sous SQL
    Par Fabby69 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 08/10/2004, 09h07
  4. fonction "inb" sous linux; port parallele
    Par be_net dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 09/06/2004, 11h39
  5. Fonction EXTRACT sous Informix
    Par lord_of_ankou dans le forum Informix
    Réponses: 3
    Dernier message: 20/08/2003, 17h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo