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 :

Problème avec les timers


Sujet :

SDL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Problème avec les timers
    Bonjour, j'ai codé un petit programme pour m'habituer aux timers, et j'ai un problème dans le code suivant :

    ( je code en C sous windows XP SP 2 avec code::blocks et son compilateur gcc fourni, et la dernière version stable de SDL)

    J'ai cru comprendre qu'une pause de thread ne coupait pas les timers ? (exécutés dans un autre thread)

    Mais ici la fenêtre s'affiche et disparaît rapidement...je ne comprends pas pourquoi.

    Merci de votre aide.
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include <time.h>
     
    typedef struct surfaces{
     
        SDL_Surface* surface1;
        SDL_Surface* surface2;
        SDL_Surface* surface3;
     
        SDL_Rect* position;
     
    }SURFACES;
     
    Uint32 mouvement(Uint32 intervalle, void* param){
     
        SDL_Rect* pos = param;
        pos->x+=5;
        pos->y+=5;
     
        return intervalle;
    }
     
    Uint32 afficher(Uint32 intervalle, void* param){
     
        SURFACES* surface = param;
     
        SDL_Rect p;
        p.x=0;
        p.y=0;
     
        SDL_BlitSurface(surface->surface1,NULL,surface->surface2,&p);
     
          SDL_BlitSurface(surface->surface3,NULL,surface->surface2,surface->position);
     
        SDL_Flip(surface->surface2);
     
        return intervalle;
    }
     
    int main(int argc, char *argv[]){
     
        SDL_Surface* ecran=NULL;
        SDL_Surface* fond=NULL;
        SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);
     
     
        ecran=SDL_SetVideoMode(750,500,32,SDL_HWSURFACE | SDL_DOUBLEBUF);
     
        SDL_Rect position, posi;
     
        position.x=200;
        position.y=100;
     
        posi.x=0;
        posi.y=0;
     
        SDL_WM_SetCaption("Test timer",NULL);
     
        fond=SDL_LoadBMP("fond.bmp");
     
        SDL_BlitSurface(fond,NULL,ecran,&posi);
     
        SDL_Flip(ecran);
     
     
     
        SDL_Surface* piques;
        piques = SDL_LoadBMP("boulepique.bmp");
     
        SURFACES* surfaces;
     
        surfaces->surface1=fond;
        surfaces->surface2=ecran;
        surfaces->surface3=piques;
     
     
     
        SDL_TimerID timer = SDL_AddTimer(500, mouvement, &position);
        SDL_TimerID frame = SDL_AddTimer(400, afficher, surfaces);
     
    SDL_Delay(10000);
     
        SDL_RemoveTimer(timer);
        SDL_RemoveTimer(frame);
     
        SDL_FreeSurface(piques);
        SDL_FreeSurface(fond);
        SDL_FreeSurface(ecran);
     
        SDL_Quit();
     
        return EXIT_SUCCESS;
    }

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Mouse Slider
    Bonjour, j'ai codé un petit programme pour m'habituer aux timers, et j'ai un problème dans le code suivant :

    ( je code en C sous windows XP SP 2 avec code::blocks et son compilateur gcc fourni, et la dernière version stable de SDL)
    D'accord mais visiblement, il faudrait d'abord travaillé son C, il y a des erreurs assez énormes dans le code présenté...

    J'ai cru comprendre qu'une pause de thread ne coupait pas les timers ? (exécutés dans un autre thread)
    C'est exact (du moins à ma connaissance)

    Mais ici la fenêtre s'affiche et disparaît rapidement...je ne comprends pas pourquoi.
    C'est du à une erreur de segmentation dûe au C...

    Il faudrait d'abord revoir son C... Toutes les erreurs sont dûes à des erreurs C et non à un problème SDL...

    Voici mes commentaires du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include <time.h>
    time.h et stdio.h sont inutiles dans le code présenté....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct surfaces{
        SDL_Surface* surface1;
        SDL_Surface* surface2;
        SDL_Surface* surface3;
     
        SDL_Rect* position;
    }SURFACES;
    Pas de majuscules pour le nom d'une structure... Du moins c'est déconseillé... C'est mieux de garder ce genre d'écriture pour les macros et constantes...

    Et une nommenclature plus explicite que surface1 surface2 et surface3 serait plus adaptée..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        SDL_Rect p;
        p.x=0;
        p.y=0;
     
        SDL_BlitSurface(surface->surface1,NULL,surface->surface2,&p);
    La déclaration et utilisation de p est inutile ici... Cela revient au même de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        SDL_BlitSurface(surface->surface1,NULL,surface->surface2,NULL);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);
    Il faut tester le retour de SDL_Init...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        ecran=SDL_SetVideoMode(750,500,32,SDL_HWSURFACE | SDL_DOUBLEBUF);
    Il faut tester la valeur de ecran avant de continuer...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        SDL_Rect position, posi;
    Je trouve plus propre de déclarer les variables au début de la fonction (subjectif)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        posi.x=0;
        posi.y=0;
     
        ....
        SDL_BlitSurface(fond,NULL,ecran,&posi);
    Même remarque qu'avant, posi ne sert à rien ici mais je suppose que tu voulais le changer après...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        fond=SDL_LoadBMP("fond.bmp");
    Il faut tester le retour de SDL_LoadBMP...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        SDL_Surface* piques;
        piques = SDL_LoadBMP("boulepique.bmp");
    Il faut tester le retour de SDL_LoadBMP...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        SURFACES* surfaces;
     
        surfaces->surface1=fond;
        surfaces->surface2=ecran;
        surfaces->surface3=piques;
    Si tu compilais avec les options -Wall -Wextra -O2 tu aurais comme message :

    timer.c:74: warning: ‘surfaces’ is used uninitialized in this function
    Ceci devrait t'interpeler et te dire... Ou est-ce que j'ai alloué de l'espace pour cette structure ?? Plus simple et correct vu que t'as oublié de mettre position en place :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        SURFACES surfaces;
     
        surfaces.surface1=fond;
        surfaces.surface2=ecran;
        surfaces.surface3=piques;
        surfaces.position = &position;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        SDL_TimerID timer = SDL_AddTimer(500, mouvement, &position);
        SDL_TimerID frame = SDL_AddTimer(400, afficher, surfaces);
    Bien sûr, le deuxième appel devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        SDL_TimerID frame = SDL_AddTimer(400, afficher, &surfaces);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        SDL_FreeSurface(ecran);
    Non! SDL_Quit s'en occupe de la surface de l'ecran...

    Jc

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Ah oui en effet !

    J'ai oublié certaines choses que je connaissais , mais d'autres que je ne connais pas ...

    Désolé j'apprends le C depuis deux semaines, et SDL depuis quelques jours...avant je faisais du java. Je vais donc apprendre plus avant de continuer à coder !

    Mais en tout cas merci pour ta réponse, car il m'est difficile d'identifier mes lacunes.

  4. #4
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 528
    Points : 5 198
    Points
    5 198
    Par défaut
    Citation Envoyé par fearyourself
    Je trouve plus propre de déclarer les variables au début de la fonction (subjectif)
    De ce que je me souviens des contraintes du C, il falait déclarer les variables au début de la fonction.
    La déclaration de variables en plein milieu d'une source n'est-elle pas une spécificité du C++ ?

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    La déclaration de variables en plein milieu d'une source n'est-elle pas une spécificité du C++ ?
    Et du C99 il me semble. Lorsque l'on peut déclarer les variables n'importe où, une bonne pratique est de ne pas les déclarer avant d'en avoir besoin. Surtout en C++, où on pourra utiliser le constructeur adéquat directement.

  6. #6
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par shenron666
    De ce que je me souviens des contraintes du C, il falait déclarer les variables au début de la fonction.
    La déclaration de variables en plein milieu d'une source n'est-elle pas une spécificité du C++ ?
    Comme le dit Laurent :

    Et du C99 il me semble.
    et c'est une des choses que les compilateurs C acceptent de nos jours si on ne met pas les options adéquates...

    Lorsque l'on peut déclarer les variables n'importe où, une bonne pratique est de ne pas les déclarer avant d'en avoir besoin. Surtout en C++, où on pourra utiliser le constructeur adéquat directement.
    Je suis d'accord sauf qu'il faut bien aérer le code pour que cela soit lisible. Souvent, je trouve que cela allourdi le code et le rend indigeste (lorsque c'est mal fait)...

    Jc

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

Discussions similaires

  1. [Problème avec les Timers]
    Par ARachid dans le forum MFC
    Réponses: 4
    Dernier message: 11/05/2007, 18h47
  2. [Débutant]Problème avec les timers
    Par mickael777 dans le forum MFC
    Réponses: 1
    Dernier message: 11/04/2005, 11h00
  3. Problème avec les apostrophes
    Par misterbillyboy dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/07/2003, 16h39
  4. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44
  5. []Problème avec les formulaires Outlook
    Par davidinfo dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 09h59

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