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
  • But what about data hiding?

    Nothing particular about it --- hiding implementation details from users was never a prominent design aspect of C, and IMHO it shouldn't be. Let me put it like this, if your project is complex enough that the benefits of data hiding might become important, then C on the 51 almost certainly isn't the right platform anyway.

    That said, you can hide a large part of the details even in C, if you really think you have to, by means of a pointer to a struct type, whithout giving the definition of that struct.

Reply
  • But what about data hiding?

    Nothing particular about it --- hiding implementation details from users was never a prominent design aspect of C, and IMHO it shouldn't be. Let me put it like this, if your project is complex enough that the benefits of data hiding might become important, then C on the 51 almost certainly isn't the right platform anyway.

    That said, you can hide a large part of the details even in C, if you really think you have to, by means of a pointer to a struct type, whithout giving the definition of that struct.

Children
  • That said, you can hide a large part of the details even in C, if you really think you have to, by means of a pointer to a struct type, whithout giving the definition of that struct.

    Just to learn: can you show me how to do this in my specific situation, given the examples above?

  • You can cast pointers to struct types among each other, as long as one struct type is just an extended version of the other. So you can have a "dummy struct type" exported by the header, with all the private data removed from view by a pointer cast:

    lib.h:

    struct dummy {
       int magic_cookie;
    };


    lib.c:

    struct real {
       int magic_cookie;
       /* private data: */
       double whatever;
       char lotofstuff[512];
       /* ... */
    };

    The exported interface would use pointers to struct dummy, which are cast into pointers to struct real by the implementation (in lib.c) whenever the private members are needed:

    foo_func(struct dummy *this) {
      struct real *real_this = (struct real *) this;
    
      real_this->whatever = 5.25;
    }
    

    The magic cookie provides a bit of protection against the potential evil of any explicit pointer cast.

  • "as long as one struct type is just an extended version of the other"

    Nice trick, never though about this one!

    Thanks Hans!

    -- Geert