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 :

[C] Problèmes de surfaces dans des structures.


Sujet :

SDL

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Octobre 2005
    Messages : 141
    Points : 135
    Points
    135
    Par défaut [C] Problèmes de surfaces dans des structures.
    Bonjour !

    Je rencontre un problème quand je veux "encapsuler" mes surfaces (comme la surface de la fenêtre) dans des structures.

    J'ai deux structures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct
    {
        SDL_Surface *Perso, *Ennemi;
    } Exemple2;
     
    typedef struct
    {
        SDL_Surface *Ecran;
        Exemple2 *Ex2;
    } Exemple1;
    Le code complet (exemple) :
    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 <SDL/SDL.h>
     
    typedef struct
    {
        SDL_Surface *Perso, *Ennemi;
    } Exemple2;
     
    typedef struct
    {
        SDL_Surface *Ecran;
        Exemple2 *Ex2;
    } Exemple1;
     
    void Exemple1_InitialiserFenetre(Exemple1 *this)
    {
        this->Ecran = SDL_SetVideoMode(640,480,32, SDL_HWSURFACE);
    }
     
    void Exemple2_InitialiserChamps(Exemple1 *this)
    {
        this->Ex2->Perso = SDL_CreateRGBSurface(SDL_HWSURFACE, 25, 25, 32, 0,0,0,0);
        this->Ex2->Ennemi = SDL_CreateRGBSurface(SDL_HWSURFACE, 25, 25, 32, 0,0,0,0);
    }
     
    int main(int argc, char *argv[])
    {
        SDL_Init(SDL_INIT_VIDEO);
     
        Exemple1 *p = NULL;
     
        Exemple1_InitialiserFenetre(p);
        Exemple2_InitialiserChamps(p);
     
        SDL_Quit();
     
        return 0;
    }
    Ce code ne marche pas.

    Je sais qu'il faut modifier un pointeur sur SDL_Surface donc il me faut un pointeur sur le pointeur de la SDL_Surface. Mais quand c'est imbriqué dans une structure (voir plusieurs), j'en ai aucune idée.

    J'ai déjà essayé beaucoup de choses, mais je vois pas. :/

    Merci pour votre aide.
    Kr00pS

    PS: Obligé de coder en C, en C++ j'aurais pu utiliser une référence, ce qui aurait simplifier la chose mais bon.

  2. #2
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    A priori, ton problème doit venir du fait que tu n'as pas alloué de mémoire pour tes objets.

    Mais pourquoi dans ta structure 1 avoir un pointeur sur ta structure 2, et dans ton main créer un pointeur vers une structure 1 et pas simplement directement une structure 1 ?

  3. #3
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Octobre 2005
    Messages : 141
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par Eusebe
    A priori, ton problème doit venir du fait que tu n'as pas alloué de mémoire pour tes objets.
    Je peux pas faire ça avec une structure automatique alors ? Bien dommage.

    Citation Envoyé par Eusebe
    Mais pourquoi dans ta structure 1 avoir un pointeur sur ta structure 2, et dans ton main créer un pointeur vers une structure 1 et pas simplement directement une structure 1 ?
    Tout simplement car dans mon code Exemple1 est une structure qui regroupe tout. Il y aura forcément des structures imbriquées.

    Merci de ta réponse.

  4. #4
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Ce que je voulais dire, c'est pourquoi utiliser des pointeurs vers tes structures, et pas, par exemple :

    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
    typedef struct
    {
        SDL_Surface *Perso, *Ennemi;
    } Exemple2;
     
    typedef struct
    {
        SDL_Surface *Ecran;
        Exemple2 Ex2;
    } Exemple1;
     
    void Exemple1_InitialiserFenetre(Exemple1 *this)
    {
        this->Ecran = SDL_SetVideoMode(640,480,32, SDL_HWSURFACE);
    }
     
    void Exemple2_InitialiserChamps(Exemple1 *this)
    {
        this->Ex2.Perso = SDL_CreateRGBSurface(SDL_HWSURFACE, 25, 25, 32, 0,0,0,0);
        this->Ex2.Ennemi = SDL_CreateRGBSurface(SDL_HWSURFACE, 25, 25, 32, 0,0,0,0);
    }
    Et dans ton main, il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Exemple1 ex1;
     
        Exemple1_InitialiserFenetre(&ex1);
        Exemple2_InitialiserChamps(&ex1);
    Mais bon, je ne suis pas un spécialiste du C...

  5. #5
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Octobre 2005
    Messages : 141
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par Eusebe
    Ce que je voulais dire, c'est pourquoi utiliser des pointeurs vers tes structures, et pas, par exemple :

    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
    typedef struct
    {
        SDL_Surface *Perso, *Ennemi;
    } Exemple2;
     
    typedef struct
    {
        SDL_Surface *Ecran;
        Exemple2 Ex2;
    } Exemple1;
     
    void Exemple1_InitialiserFenetre(Exemple1 *this)
    {
        this->Ecran = SDL_SetVideoMode(640,480,32, SDL_HWSURFACE);
    }
     
    void Exemple2_InitialiserChamps(Exemple1 *this)
    {
        this->Ex2.Perso = SDL_CreateRGBSurface(SDL_HWSURFACE, 25, 25, 32, 0,0,0,0);
        this->Ex2.Ennemi = SDL_CreateRGBSurface(SDL_HWSURFACE, 25, 25, 32, 0,0,0,0);
    }
    Et dans ton main, il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Exemple1 ex1;
     
        Exemple1_InitialiserFenetre(&ex1);
        Exemple2_InitialiserChamps(&ex1);
    Mais bon, je ne suis pas un spécialiste du C...
    On m'a toujours dis qu'en C, passer des structures sans pointeur, c'est mal.

  6. #6
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Si tu tiens à utiliser des pointeurs, il faut que tu alloues de l'espace mémoire.
    Voir http://c.developpez.com/faq/c/?page=pointeurs.

    Quelque chose comme ça (non testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Exemple1 *p = malloc(sizeof *p);
    p->Ex2 = malloc(sizeof *(p->Ex2));
    ...Et il faudra penser aussi à libérer cet espace...

  7. #7
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par Kr00pS
    On m'a toujours dis qu'en C, passer des structures sans pointeur, c'est mal.
    Une précision : dans ma proposition, je ne passais pas des structures, mais bien un pointeur vers une structure.

    Si "c'est mal" de ne pas utiliser des pointeurs pour passer des structures, je suppose que c'est parce que ça entraîne une duplication de la structure, et que de ce fait les modifications du paramètre ne changent rien sur la structure passée en paramètre.

    Mais il existe des cas où au contraire c'est ce que l'on recherche (sémantique par valeur)...

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

Discussions similaires

  1. problème d'insertion dans des tables ?
    Par Invité dans le forum Oracle
    Réponses: 7
    Dernier message: 05/08/2009, 12h29
  2. Problème de coordonnées dans des balises
    Par Zebulon777 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 06/02/2007, 07h26
  3. Problème de sélection dans des Jtables
    Par Manaka dans le forum Composants
    Réponses: 1
    Dernier message: 29/10/2006, 22h15
  4. [CSS] Problème de marge dans des listes.
    Par Istrella dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 13/09/2006, 09h16
  5. problème de syntaxe dans des boucles imbriquées
    Par deglingo37 dans le forum Access
    Réponses: 2
    Dernier message: 01/09/2006, 14h46

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