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 étrange SDL_Surface


Sujet :

SDL

  1. #1
    Membre expérimenté

    Profil pro
    Étudiant
    Inscrit en
    Août 2009
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2009
    Messages : 130
    Par défaut Problème étrange SDL_Surface
    Salut à tous, je commence à étudier la SDL et je rencontre une erreur bizarre :

    error C2275: 'SDL_Surface'*: utilisation non conforme de ce type comme expression

    qui correspond à la ligne SDL_Surface *rectangle = NULL;
    dans le main.c

    Je ne comprend d'où ca provient. Voilà mon code :

    Ce bout de code créer une surface rectangle centré sur l'écran. Bon ca sert strictement à rien c'est juste pour me faire la main.

    main.c
    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
     
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include "fonction.h"
     
     
    int main(int argc, char *argv[])
    {
     
    	initSDL();
     
    	SDL_Surface *rectangle = NULL;
    	SDL_Rect position;
     
    	position.x = (800/2) - (220/2);
    	position.y = (600/2) - (180/2);
     
    	rectangle = SDL_CreateRGBSurface(SDL_HWSURFACE, 220, 180, 32, 0, 0, 0, 0); // Allocation de la surface
    	SDL_FillRect(rectangle, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));	
     
    	SDL_BlitSurface(rectangle, NULL, ecran, &position);		// Colle la surface sur ecran 
     
    	SDL_Flip(ecran);
     
        pause();
     
    	SDL_FreeSurface(rectangle);
     
        return EXIT_SUCCESS;
    }
    fonction.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <stdlib.h>
    #include <SDL/SDL.h>
     
    SDL_Surface *ecran = NULL;
     
    void initSDL(void);
    void pause(void);

    fonction.c

    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
     
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include "fonction.h"
     
     
     
    void initSDL(void)
    {
    	if (SDL_Init(SDL_INIT_VIDEO) < 0) 
    	{
    		fprintf(stderr, "Erreur à l'initialisation de la SDL : %s\n", SDL_GetError());
    		exit(EXIT_FAILURE);
    	}
     
    	atexit(SDL_Quit);
     
    	ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE);
     
    	if (ecran == NULL) 
    	{
    		fprintf(stderr, "Impossible d'activer le mode graphique : %s\n", SDL_GetError());
    		exit(EXIT_FAILURE);
    	}
     
    	SDL_WM_SetCaption("Titre de mon programme SDL", NULL);
     
    	SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 17, 206, 112));		// Colorisation surface ecran
    }
     
     
    void pause(void)
    {
    	int continuer = 1;
    	SDL_Event event;
     
    	while (continuer)
    	{
    		SDL_WaitEvent(&event);
    		switch(event.type)
    		{
    			case SDL_QUIT:
    				continuer = 0;
    			break;
    		}
    	}
    }

    Merci de votre aide

  2. #2
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Les variables globales c'est le mal !
    Essaye ton code sans initialiser ta variable ecran :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdlib.h>
    #include <SDL/SDL.h>
     
    SDL_Surface *ecran;
     
    void initSDL(void);
    void pause(void);

  3. #3
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 087
    Par défaut
    Bonsoir,

    J'ai tester tel quel votre code en C/C, je n'est aucun probleme.

    Juste une chose, il est inutile de mettre ecran en variable global, car "SDL_SetVideoMode" genere une sorte de singleton, qui est en relaité une variable globale.

    Mettez SDL_Surface *ecran dans InitSDL et a cahque fois que vous voulez "ecran", il suffit de mettre au debut de la fonction :


    SDL_Surface *ecran = SDL_GetVideoSurface();


    Sinon, verifier la version de la SDL ainsi que le include et si vous avez lié la bibliotheque. (meme si ca m'etonnerai que le probleme vienne des deux dernier conseils).

  4. #4
    Membre expérimenté

    Profil pro
    Étudiant
    Inscrit en
    Août 2009
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2009
    Messages : 130
    Par défaut
    Bonsoir et merci de votre aide

    @Pouet_forever : Merci, le code marche bien maintenant. J'ai aussi déclaré les variables avant l'appel de la fonction dans le main.

    @SofEvans: Je ne comprend pas comment peut-on accéder aux attributs d'une variable ( ecran ) si on la met en local dans la fonction. Pour retrouver la valeur ecran->format par exemple, comment fait-on puisque la variable sera locale à la fonction ?

    Je n'ai pas bien compris :
    "car "SDL_SetVideoMode" genere une sorte de singleton, qui est en relaité une variable globale."
    pourrais-tu m'expliquer si ca ne te dérange pas ?

    Merci

  5. #5
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 087
    Par défaut
    Je peux tout a fait t'expliquer.


    En realité, dans SDL.h il y a une variable global de type SDL_Surface*
    Cette variable represente la surfce d'ecran.
    Au debut, elle est initialiser a NULL, mais un appel a SDL_SetVideoMode permet de la creer. Des lors, l'ecran est une variable global (caché aux yeux du programmeur, mais c'est bien une variable global).

    Donc, en faisant appel a la fonction SDL_GetVideoSurface(), tu demande a obtenir le pointeur de surface, soit NULL si tu n'as jamais creer de fenetre, soit le pointeur vers ta fenetre.

    Un singleton est "quelque chose" (variable/structure/... d'apres mes connaissance) d'on on a pour but qu'il soit unique et disponible partout. C'est a dire que la creation a deux reprise ne se fera pas, il peut y en avoir qu'un.

    C'est le cas, dans la SDL, de la variable SDL_Surface *screen qui represente ton ecran.

  6. #6
    Membre expérimenté

    Profil pro
    Étudiant
    Inscrit en
    Août 2009
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2009
    Messages : 130
    Par défaut
    Merci pour votre aide

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

Discussions similaires

  1. [Bug IE ?] Problème étrange, pas de titre explicite, désolée
    Par Huntress dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 04/10/2005, 17h44
  2. [PEAR][HTML_QuickForm] Problème étrange
    Par jeanvincent dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 28/09/2005, 18h27
  3. [VB.NET] Problème étrange lors de la création de BDD
    Par Playmo dans le forum Windows Forms
    Réponses: 5
    Dernier message: 28/03/2005, 23h25
  4. [JMF] Problème étrange probablement dépendant de l'OS
    Par Farias dans le forum Multimédia
    Réponses: 4
    Dernier message: 31/10/2004, 18h35
  5. [FLASH MX2004 PRO] Problème étrange avec LoadClip...
    Par josemoroide dans le forum Flash
    Réponses: 6
    Dernier message: 04/08/2004, 16h41

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