Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};

6 réponses
Avatar
Romain
Bonjour,

J'ai un problème avec l'utilisation d'une variable globale de type
union définie comme telle dans un header:
extern union {
struct {
unsigned int champ1:1;
unsigned int champ2:1;
unsigned int champ3:1;
unsigned int champ4:1;
unsigned int champ5:1;
unsigned int champ6:1;
unsigned int champ7:1;
unsigned int champ8:1;
unsigned int champ9:1;
unsigned int champ10:1;
unsigned int champ11:1;
unsigned int champ12:1;
unsigned int champ13:1;
unsigned int champ14:1;
unsigned int champ15:1;
unsigned int champ16:1;
}bi;
T_BYTEFLD cr;
} unionVAR;

avec:
typedef union{
struct{
T_UBYTE msb;
T_UBYTE lsb;
}by;
T_UWORD wo;
}T_BYTEFLD;
typedef unsigned char T_UBYTE;
typedef unsigned short int T_UWORD;

En voulant rajouter ma déclaration de variable dans mon source:
union {
struct {
unsigned int champ1:1;
unsigned int champ2:1;
unsigned int champ3:1;
unsigned int champ4:1;
unsigned int champ5:1;
unsigned int champ6:1;
unsigned int champ7:1;
unsigned int champ8:1;
unsigned int champ9:1;
unsigned int champ10:1;
unsigned int champ11:1;
unsigned int champ12:1;
unsigned int champ13:1;
unsigned int champ14:1;
unsigned int champ15:1;
unsigned int champ16:1;
}bi;
T_BYTEFLD cr;
} unionVAR;

J'obtient ça:
error C2371: 'unionVAR' : redefinition; different basic types
.\union.h(268) : see declaration of 'unionVAR'

Si quelqu'un pouvait m'aider, merci.

Romain

--
Ceci est une signature automatique de MesNews.
Site : http://mesnews.no-ip.com

6 réponses

Avatar
Yves ROMAN

Bonjour,

J'ai un problème avec l'utilisation d'une variable globale de type
union définie comme telle dans un header:
extern union {
struct {
unsigned int champ1:1;
unsigned int champ2:1;
unsigned int champ3:1;
unsigned int champ4:1;
unsigned int champ5:1;
unsigned int champ6:1;
unsigned int champ7:1;
unsigned int champ8:1;
unsigned int champ9:1;
unsigned int champ10:1;
unsigned int champ11:1;
unsigned int champ12:1;
unsigned int champ13:1;
unsigned int champ14:1;
unsigned int champ15:1;
unsigned int champ16:1;
}bi;
T_BYTEFLD cr;
} unionVAR;

avec:
typedef union{
struct{
T_UBYTE msb;
T_UBYTE lsb;
}by;
T_UWORD wo;
}T_BYTEFLD;
typedef unsigned char T_UBYTE;
typedef unsigned short int T_UWORD;

En voulant rajouter ma déclaration de variable dans mon source:
union {
struct {
unsigned int champ1:1;
unsigned int champ2:1;
unsigned int champ3:1;
unsigned int champ4:1;
unsigned int champ5:1;
unsigned int champ6:1;
unsigned int champ7:1;
unsigned int champ8:1;
unsigned int champ9:1;
unsigned int champ10:1;
unsigned int champ11:1;
unsigned int champ12:1;
unsigned int champ13:1;
unsigned int champ14:1;
unsigned int champ15:1;
unsigned int champ16:1;
}bi;
T_BYTEFLD cr;
} unionVAR;

J'obtient ça:
error C2371: 'unionVAR' : redefinition; different basic types
.union.h(268) : see declaration of 'unionVAR'

Si quelqu'un pouvait m'aider, merci.



Peut-être s'assurer d'avoir le même type pour les 2 déclarations de la variable
:
Dans union.h declarer un type pour l'union :

typedef union ..... T_UNION16 ;
extern T_UNION16 unionVAR ;

et dans le .c :
T_UNION16 unionVAR ;

Avatar
panpan
En fait, je ne peux pas modifier le header dans lequel est défini
l'union et donc je ne peux pas définir le type correspondant.
J'aimerais donc trouver comment faire ma déclaration de façon à ne pas
avoir cette erreur.

Yves ROMAN avait énoncé :

Bonjour,

J'ai un problème avec l'utilisation d'une variable globale de type
union définie comme telle dans un header:
extern union {
struct {
unsigned int champ1:1;
unsigned int champ2:1;
unsigned int champ3:1;
unsigned int champ4:1;
unsigned int champ5:1;
unsigned int champ6:1;
unsigned int champ7:1;
unsigned int champ8:1;
unsigned int champ9:1;
unsigned int champ10:1;
unsigned int champ11:1;
unsigned int champ12:1;
unsigned int champ13:1;
unsigned int champ14:1;
unsigned int champ15:1;
unsigned int champ16:1;
}bi;
T_BYTEFLD cr;
} unionVAR;

avec:
typedef union{
struct{
T_UBYTE msb;
T_UBYTE lsb;
}by;
T_UWORD wo;
}T_BYTEFLD;
typedef unsigned char T_UBYTE;
typedef unsigned short int T_UWORD;

En voulant rajouter ma déclaration de variable dans mon source:
union {
struct {
unsigned int champ1:1;
unsigned int champ2:1;
unsigned int champ3:1;
unsigned int champ4:1;
unsigned int champ5:1;
unsigned int champ6:1;
unsigned int champ7:1;
unsigned int champ8:1;
unsigned int champ9:1;
unsigned int champ10:1;
unsigned int champ11:1;
unsigned int champ12:1;
unsigned int champ13:1;
unsigned int champ14:1;
unsigned int champ15:1;
unsigned int champ16:1;
}bi;
T_BYTEFLD cr;
} unionVAR;

J'obtient ça:
error C2371: 'unionVAR' : redefinition; different basic types
.union.h(268) : see declaration of 'unionVAR'

Si quelqu'un pouvait m'aider, merci.



Peut-être s'assurer d'avoir le même type pour les 2 déclarations de la
variable

Dans union.h declarer un type pour l'union :


typedef union ..... T_UNION16 ;
extern T_UNION16 unionVAR ;

et dans le .c :
T_UNION16 unionVAR ;


--
Ceci est une signature automatique de MesNews.
Site : http://mesnews.no-ip.com


Avatar
Romain
En fait le message précédent est de Romain

Romain vient de nous annoncer :
En fait, je ne peux pas modifier le header dans lequel est défini l'union et
donc je ne peux pas définir le type correspondant. J'aimerais donc trouver
comment faire ma déclaration de façon à ne pas avoir cette erreur.

Yves ROMAN avait énoncé :

Bonjour,

J'ai un problème avec l'utilisation d'une variable globale de type
union définie comme telle dans un header:
extern union {
struct {
unsigned int champ1:1;
unsigned int champ2:1;
unsigned int champ3:1;
unsigned int champ4:1;
unsigned int champ5:1;
unsigned int champ6:1;
unsigned int champ7:1;
unsigned int champ8:1;
unsigned int champ9:1;
unsigned int champ10:1;
unsigned int champ11:1;
unsigned int champ12:1;
unsigned int champ13:1;
unsigned int champ14:1;
unsigned int champ15:1;
unsigned int champ16:1;
}bi;
T_BYTEFLD cr;
} unionVAR;

avec:
typedef union{
struct{
T_UBYTE msb;
T_UBYTE lsb;
}by;
T_UWORD wo;
}T_BYTEFLD;
typedef unsigned char T_UBYTE;
typedef unsigned short int T_UWORD;

En voulant rajouter ma déclaration de variable dans mon source:
union {
struct {
unsigned int champ1:1;
unsigned int champ2:1;
unsigned int champ3:1;
unsigned int champ4:1;
unsigned int champ5:1;
unsigned int champ6:1;
unsigned int champ7:1;
unsigned int champ8:1;
unsigned int champ9:1;
unsigned int champ10:1;
unsigned int champ11:1;
unsigned int champ12:1;
unsigned int champ13:1;
unsigned int champ14:1;
unsigned int champ15:1;
unsigned int champ16:1;
}bi;
T_BYTEFLD cr;
} unionVAR;

J'obtient ça:
error C2371: 'unionVAR' : redefinition; different basic types
.union.h(268) : see declaration of 'unionVAR'

Si quelqu'un pouvait m'aider, merci.



Peut-être s'assurer d'avoir le même type pour les 2 déclarations de la
variable

Dans union.h declarer un type pour l'union :


typedef union ..... T_UNION16 ;
extern T_UNION16 unionVAR ;

et dans le .c :
T_UNION16 unionVAR ;



--
Ceci est une signature automatique de MesNews.
Site : http://mesnews.no-ip.com



Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Romain wrote:

Bonjour,

J'ai un problème avec l'utilisation d'une variable globale de type
union définie comme telle dans un header:
extern union {
struct {
unsigned int champ1:1;
unsigned int champ2:1;
unsigned int champ3:1;
unsigned int champ4:1;
unsigned int champ5:1;
unsigned int champ6:1;
unsigned int champ7:1;
unsigned int champ8:1;
unsigned int champ9:1;
unsigned int champ10:1;
unsigned int champ11:1;
unsigned int champ12:1;
unsigned int champ13:1;
unsigned int champ14:1;
unsigned int champ15:1;
unsigned int champ16:1;
}bi;
T_BYTEFLD cr;
} unionVAR;

avec:
typedef union{
struct{
T_UBYTE msb;
T_UBYTE lsb;
}by;
T_UWORD wo;
}T_BYTEFLD;
typedef unsigned char T_UBYTE;
typedef unsigned short int T_UWORD;

En voulant rajouter ma déclaration de variable dans mon source:
union {
struct {
unsigned int champ1:1;
unsigned int champ2:1;
unsigned int champ3:1;
unsigned int champ4:1;
unsigned int champ5:1;
unsigned int champ6:1;
unsigned int champ7:1;
unsigned int champ8:1;
unsigned int champ9:1;
unsigned int champ10:1;
unsigned int champ11:1;
unsigned int champ12:1;
unsigned int champ13:1;
unsigned int champ14:1;
unsigned int champ15:1;
unsigned int champ16:1;
}bi;
T_BYTEFLD cr;
} unionVAR;

J'obtient ça:
error C2371: 'unionVAR' : redefinition; different basic types
.union.h(268) : see declaration of 'unionVAR'


Il faut nommer les structures ou faire un typedef.

#ifndef H_ED_DATA_20040413221238
#define H_ED_DATA_20040413221238

#ifdef __cplusplus
extern "C"
{
#endif

/* data.h */
typedef unsigned char T_UBYTE;
typedef unsigned short int T_UWORD;

typedef union
{
struct
{
T_UBYTE msb;
T_UBYTE lsb;
}
by;
T_UWORD wo;
}
T_BYTEFLD;

extern union unionVAR
{
struct
{
unsigned int champ1:1;
unsigned int champ2:1;
unsigned int champ3:1;
unsigned int champ4:1;
unsigned int champ5:1;
unsigned int champ6:1;
unsigned int champ7:1;
unsigned int champ8:1;
unsigned int champ9:1;
unsigned int champ10:1;
unsigned int champ11:1;
unsigned int champ12:1;
unsigned int champ13:1;
unsigned int champ14:1;
unsigned int champ15:1;
unsigned int champ16:1;
}
bi;
T_BYTEFLD cr;
}
unionVAR;

#ifdef __cplusplus
}
#endif

#endif /* guard */

/* Guards added by GUARD (c) AETA 2000-2003 Jun 25 2003 Ver. 1.6 */

/* data.c */
#include "data.h"

union unionVAR unionVAR;

/* main.c */
#include "data.h"

#include <stdio.h>

int main (void)
{
unionVAR.bi.champ1 = 1;

return 0;
}

ou

#ifndef H_ED_DATA_20040413221238
#define H_ED_DATA_20040413221238

#ifdef __cplusplus
extern "C"
{
#endif

/* data.h */
typedef unsigned char T_UBYTE;
typedef unsigned short int T_UWORD;

typedef union
{
struct
{
T_UBYTE msb;
T_UBYTE lsb;
}
by;
T_UWORD wo;
}
T_BYTEFLD;

typedef union
{
struct
{
unsigned int champ1:1;
unsigned int champ2:1;
unsigned int champ3:1;
unsigned int champ4:1;
unsigned int champ5:1;
unsigned int champ6:1;
unsigned int champ7:1;
unsigned int champ8:1;
unsigned int champ9:1;
unsigned int champ10:1;
unsigned int champ11:1;
unsigned int champ12:1;
unsigned int champ13:1;
unsigned int champ14:1;
unsigned int champ15:1;
unsigned int champ16:1;
}
bi;
T_BYTEFLD cr;
}
unionVAR_u;



extern unionVAR_u unionVAR;

#ifdef __cplusplus
}
#endif

#endif /* guard */

/* Guards added by GUARD (c) AETA 2000-2003 Jun 25 2003 Ver. 1.6 */

/* data.c */
#include "data.h"

unionVAR_u unionVAR;

/* main.c */
#include "data.h"

#include <stdio.h>

int main (void)
{
unionVAR.bi.champ1 = 1;

return 0;
}


--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Eddahbi Karim
Le 2004-04-13, Romain a martirisé son clavier pour dire:
En fait le message précédent est de Romain



Je te le dis calmement avant que tu ne te fasses tuer par quelqu'un
d'autre de ce newsgroup qui n'aura pas apprécié la blague :

Evite de "quoter" 200 lignes pour en poster une...

Voilà ;-)


--

Remove 'dot' INVALID to mail me
EN-FR : dot->point :P

Avatar
Marc Boyer
panpan wrote:
En fait, je ne peux pas modifier le header dans lequel est défini
l'union et donc je ne peux pas définir le type correspondant.
J'aimerais donc trouver comment faire ma déclaration de façon à ne pas
avoir cette erreur.


Tu ne peux pas :-( En tout cas, pas proprement.
La seule chose que tu peux faire, c'est un cast. Mais
ça devient dur à maintenir puisque à la moindre modification
du header, on doit reporter le changement dans ton code.
Donc, quelles sont les exigences de maintenance de ton code ?
Pourquoi ne peux-tu pas modifier ce header ?
Au minimum, il faudrait ajouter des assertions de compilation
qui vérifient que la taille de ton type et d'une variable avec
le type de l'en-tête soient identiques, que les tailles des
membres le sont aussi, etc.

Marc Boyer
--
La contractualisation de la recherche, c'est me donner de l'argent pour
faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce
que je sais faire, je le fais sans moyens...