bonjour,
j'ai le message d'erreur suivant:
Code:
1
2 src/Bmp\Anim1.h:1: error: syntax error before "char"
et si je supprimer l'unsigned de la déclaration il l'accèpte!!!:?Code:
1
2 const unsigned char anim1[]={0,20,....
Version imprimable
bonjour,
j'ai le message d'erreur suivant:
Code:
1
2 src/Bmp\Anim1.h:1: error: syntax error before "char"
et si je supprimer l'unsigned de la déclaration il l'accèpte!!!:?Code:
1
2 const unsigned char anim1[]={0,20,....
- Quel compilo ? (nom, plate-forme, version, etc.)
- On peut voir ce qu'il y a AVANT cette ligne ?
Visiblement, c'est la première ligne du header. Dans ce cas, peut-on voir ce qu'il y a à la fin du header précédent ?- Tu n'as pas quelque part une erreur de typedef remplacé par un mauvais #define ?
Compilo : gcc 3.4.3
Plate-forme : windows
Le fichier anim1.h contient :
le header précédent contientCode:
1
2
3
4 const unsigned char anim1[]={ 0,20, .. }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #ifndef _CPS_H_ #define _CPS_H_ #include "StrucGl.h" #include "Nucleus.h" #include "IntCons.h" #include "erreurs.h" #include "Dates.h" typedef struct _CartePS TCartePS; UINT16 EI96_LectureCartePS( TCartePS *cps, char *CodePS); UINT16 EncapsulePssLectureCPS(UINT8 *buffer,UINT8 *CodePS); void TraiteReponseLectureCartePS(TCartePS *cps,UINT8 *MessageRetour,UINT16 lgMessage); #endif
Salut, essaye ca pour voir :
Code:
1
2
3
4 #undef unsigned const unsigned char anim1[]={ 0,20, .. }
apparament ça marche, j'ai d'autres erreurs , mais pas l'erreur d'avant,
tu peux me donner une ptt explication sur ce que fait ce #undef unsigned :D
parmi ces erreurs:
pour la définition suivante:Code:
1
2 src/EFT_MOT.c:9: error: parse error before "UINT8"
!!!!!Code:
1
2
3
4
5
6
7
8
9
10
11
12 typedef struct { UINT8 Cpt ; UINT8 EtatFort ; UINT8 EtatFaible ; UINT8 lgAtr ; UINT8 Atr[32] ; UINT8 Iin[5] ; UINT8 Pix[2] ; } tContexte ;
essaie :
Code:
1
2
3
4
5
6
7
8
9
10
11 typedef struct _Contexte { UINT8 Cpt ; UINT8 EtatFort ; UINT8 EtatFaible ; UINT8 lgAtr ; UINT8 Atr[32] ; UINT8 Iin[5] ; UINT8 Pix[2] ; } tContexte ;
hu hu, ça marche pas!
qu'y a-t-il juste avant ?
c la prmière définition dans mon fichier .c:
Code:
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 typedef struct { UINT8 Cpt ; UINT8 EtatFort ; UINT8 EtatFaible ; UINT8 lgAtr ; UINT8 Atr[32] ; UINT8 Iin[5] ; UINT8 Pix[2] ; } tContexte ; /*!< contexte CPS*/ static tContexte _Contexte; /** \brief Fonction de préparation du contexte de carte pour la première connexion (Spécif EFT20) * * @return void * **/ void PreparerContexte(void) { if (_Contexte.lgAtr[3]==0x00){ /* Contexte par defaut */ _Contexte.Cpt=0x00; _Contexte.EtatFort=0xAF; _Contexte.EtatFaible=0x30; _Contexte.lgAtr=0; memset(_Contexte.Atr,0x00,32); memset(_Contexte.Iin,0x00,05); memset(_Contexte.Pix,0x00,02); } } ............
Citation:
Envoyé par moon93
Citation:
Envoyé par Ton maître
Il y a forcément quelque chose avant sinon UINT8 ne peut pas être compilé.Citation:
Envoyé par moon93
Ajoute devant
Code:#define UINT8 unsigned char
Non, il faut utiliser un typedef pour definir un nouveau type proprement. La longue liste d'erreurs rencontrees par moon93 est justement due a un usage abusif de #define -- a la fin, son unsigned est tres certainement re-defini a l'arrache, avec peut-etre un ; qui traine.Citation:
Envoyé par Ti-R
moon93: il faut etre rigoureux dans la definition et l'utilisation de tes nouveaux types, eviter de definir un nombre trop important de nouveaux types qui se referent a la meme chose, et se rappeler que le C fait la difference entre minuscules et majuscules.
Medinoc: evite de te citer en mettant 'Ton maître a écrit :'. C'est un forum d'entraide, pas de tutorat.
oui, ta raison, j'ai oublié un include
merci:mouarf:
merci DaZumba pour ces conseils:)
DaZumba : Je plaisantais, je suis toujours un peu sarcastique quand je dois me citer moi-même...
Une manière d'extérioriser la frustration de ne pas avoir été lu la première fois...
C'est pas de ma faute si dans un de ses fichiers unsigned est "defined" à nouveau :PCode:typedef unsigned char UINT8;
typedef est plus propre mais des #define ne font pas de mal non plus si c'est correctement utilisé, comme tout...
Mais c'est sur que j'aurais du proposer typedef...
Ah ca, je suis bien d'accord avec toi.Citation:
Envoyé par Médinoc
Ben, comme typedef signifie 'type definition', je ne vois pas pourquoi utiliser autre chose pour definir un type...Citation:
Envoyé par Ti-R
Ti-R : Et comment évites-tu ce genre de problème avec les #define ?
Code:
1
2
3
4
5
6
7 #define PINT int * void f(void) { int tab[10]; const PINT pInt = tab; }
Code:
1
2
3
4
5
6
7 typedef int * PINT; void f(void) { int tab[10]; const PINT pInt = tab; }
Je dois être mal réveillé, car je ne vois pas de problème...
Moi non plus :? Par contre :Citation:
Envoyé par Ti-R
Là oui !Code:
1
2
3
4
5
6 #define PINT int * void f(void) { PINT pInt, tab; }
Mon premier exemple, avec le #define, déclare pInt en const int * (pointeur vers un int constant).
Mon second exemple, avec le typedef, déclare pInt en int * const (pointeur constant vers un int).
Bien sûr, si on prend en permanence le réflexe de mettre const après le type, le problème est contourné. Mais vu que c'est loin d'être la tendance des débutants...
PS: Bien joué gege2061, le problème est encore plus apparent sur ton exemple.
:merci:
Sympa les révisions ! :roll:
Je mettrai par écrit 1000 fois,
Citation:
typedef est mieux que #define
:aie:Code:
1
2 for(int i=1000;i--;) printf("typedef est mieux que #define");
Citation:
Envoyé par Ti-R
Code:printf("typedef est mieux que #define\n");
:mouarf: