1

yop,

j'ai un problème de C, pas de C++.
Un poil de code aidera tout de suite mieux à comprendre :

module.h
typedef struct
{
    SDL_Surface* background;
    SDL_Rect bgPosition;
    ICON* iconList;
} MODULE_DATA;

icon.h
typedef struct
{
    int width, height;
    SDL_Rect position;
    SDL_Surface* currentSprite;
    SDL_Surface* spriteEnabled;
    SDL_Surface* spriteDisabled;
    SDL_Surface* spriteClicked;
    int isEnabled;
    int isClicked;
    int isMouseOn;
    void (*execOnClick)(MODULE_DATA* data);
} ICON;

Comme on voit, module.h aurait besoin d'inclure icon.h et vice versa...
Zerosquare m'a donné un tip :
- void (*execOnClick)(MODULE_DATA* data);
+ void (*execOnClick)(struct MODULE_DATA* data);

Mais je me prends deux warnings à chaque inclusion de icon.h :
‘struct MODULE_DATA’ declared inside parameter list
warning: its scope is only this definition or declaration, which is probably not what you want

Comment résoudre élégamment ce genre de problème ?

2

T'as essayé avec un bête "struct MODULE_DATA;" déclaré ailleurs (au début du .h ou dans un autre header, osef tant que c'est avant), et en dehors de ta fonction ?
(C'est une bête déclaration avancée (avant C…), vive le C pour forcer à recourir à des astuces comme ça tongue)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

3

Oué en C++ si le type est juste utilisé comme un pointeur, tu peux t'en sortir avec une déclaration partielle (pas sûr du nom).
Ça donne un truc de ce genre :
ClasseA.h
class B ; // indique au compilo que B est une classe, sans avoir besoin d'inclure ClasseB.h
class A
{
   B* instanceB ;
} ;


ClasseB.h
class A ; //indique au compilo que A est une classe, sans avoir besoin d'inclure ClasseA.h
class B
{
   A* instanceA ;
} ;

Bien sûr ça ne marche pas dès que le compilo doit connaître plus spécifiquement ce que contiennent A et B (d'où l'utilisation d'un pointeur : pas besoin de connaître la taille de la classe pointée)


Ça fonctionne peut-être pareil en C.

4

Non, c'est un peu plus compliqué que ça. En C, il faut faire 2 choses:

1. Pour pouvoir utiliser struct MODULE_DATA et juste MODULE_DATA, il faut écrire:
typedef struct MODULE_DATA
{ 
    SDL_Surface* background; 
    SDL_Rect bgPosition; 
    ICON* iconList; 
} MODULE_DATA;

(Oui, il faut mettre MODULE_DATA 2 fois!)

2. Il faut effectivement une déclaraction struct MODULE_DATA; à l'avance comme en C++.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

5

bref, tant que tu utilises pas le contenu d'un struct toto, mais uniquement des pointeurs, ça pose pas de souci. Par exemple pour une liste chainée (puisqu'on a une question de C, pas de C++):


struct element;

struct element {
    struct element *next; /*contenu pas encore connu mais c'est juste un pointeur typé alors osef */
    int x;
    machin blabla;
};
typedef struct element element_t; /*pour se debarasser du mot struct a chaque utilisation */

6

Ok, merci beaucoup. J'ai juste rajouté
struct MODULE_DATA;
avant la déclaration de ICON, et j'ai laissé le
void (*execOnClick)(struct MODULE_DATA* data);

module.h inclut icon.h, et icon.h n'inclut rien.

Merci smile