This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Access Struct variable from

Hello,

My project contains several files:

main.c
routines.c
config.h
etc.

In the main.c I make a structure like:

xdata struct StructUserRec{
		BYTE	XPIDNr[9];
		char	UserName[15];
		BYTE	ContrHour;
		BYTE	ContrMin;
		BYTE	WorkedHour;
		BYTE	WorkedMin;
		};

xdata struct StructUserRec UserRec[10];

In Config.H is the declaration:
extern struct StructUserRec UserRec[10];

How can I access this structure from Routines.C? I know how to do this with other variables. But it doesn't work.

My compiler gives an error like:
ROUTINES.C(75): error C230: 'StructUserRec': unknown struct/union/enum tag

How can you make structures accessible from different .C files?

Thanks in advance,

M. Joosse

Parents
  • Another thought on this issue:

    If one of the structure members is a variable of which the type is an enum, then the enum also has to be put in the header file.

    Example:

    structdef( NvmItem )
    {
    #ifdef TESTING_MODULE_NVM
        Nat16   address;
    #else
        Nat8    address;
    #endif
        NvmType type;
        Nat8    length;
    };
    
    I had this declaration in a c-file and had to move it to the h-file before compilation could take place. That was the first step...

    structdef is #define'd as follows in the corresponding h-file:
    #define structdef( type )  extern struct _##type
    

    But... And here comes the second step I had to take...
    NvmType is an enum that was declared in the c-file (just before the structure):
    typedef enum
    {
        NvmBool = 0u
    ,   NvmByte
    ,   NvmInt
    ,   NvmBlock
    } NvmType;
    
    If I wanted to have a successful compilation, I had to put the enum in the header file too!

    Is this such a nice approach?

    -- Geert

Reply
  • Another thought on this issue:

    If one of the structure members is a variable of which the type is an enum, then the enum also has to be put in the header file.

    Example:

    structdef( NvmItem )
    {
    #ifdef TESTING_MODULE_NVM
        Nat16   address;
    #else
        Nat8    address;
    #endif
        NvmType type;
        Nat8    length;
    };
    
    I had this declaration in a c-file and had to move it to the h-file before compilation could take place. That was the first step...

    structdef is #define'd as follows in the corresponding h-file:
    #define structdef( type )  extern struct _##type
    

    But... And here comes the second step I had to take...
    NvmType is an enum that was declared in the c-file (just before the structure):
    typedef enum
    {
        NvmBool = 0u
    ,   NvmByte
    ,   NvmInt
    ,   NvmBlock
    } NvmType;
    
    If I wanted to have a successful compilation, I had to put the enum in the header file too!

    Is this such a nice approach?

    -- Geert

Children
  • "If I wanted to have a successful compilation, I had to put the enum in the header file too"

    Well, of course you do!

    If you use any non-standard types, then you are obviously going to have to include the type definition with anything that relies upon that type!

    Why is this a problem to you?

    How else could it work?

  • "Why is this a problem to you?"
    Not anymore, Andy. I was confused at first since I had to move the struct into the header file.
    And of course, if a var is used in that struct that has a type defined in an enum, then that enum must be made public too!
    Otherwise, like you said, it can never work.

    -- Geert