We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
At the risk of receiving a good thrashing, I need to ask a basic C code beginner's question: I want to declare/define an array of struct in a .h file that assigns it to xdata memory. /* Struct.h */ xdata struct mode { int x,y,z; }; struct mode xdata type[5]; main.c () { struct_init(); modify_struct(); } struct_init () { type[0].x = 1; type[0].x = 2; type[0].x = 3; etc... } modify_struct() { type[0].x = newvalue; etc... } I'm confused as to how to make the struct visible to multiple files without getting: "Multiple Public Definitions" or "Unresolved External Symbol" etc... Any guidance from the experienced would be appreciated. Thanks
1. Declare and define the struct in exactly one C file. 2. Create an extern declaration in the header file that is included in each C file. Jon
"I want to declare/define" STOP RIGHT THERE! The terms "declare" and "define" have distinct meanings in 'C'; they are not synonyms; they are not interchangeable. A correct understanding of the distinction is fundamental to answering your question. See this thread: http://www.keil.com/forum/docs/thread1847.asp (read it right through) And yes, you were right - this is a basic, standard, plain vanilla 'C' question - nothing specifically to do with 'struct', Keil or their C51 implementation. Consider yourself goodly thrashed! ;-)
Thank you Jon for the simple and brief description of the solution. I was declaring and defining as you described with one exception. In main.c I DEFINED the struct and the array of struct. In a global.h file I only DECLARED the array of struct. I assumed that since I had already DEFINED the struct mode, all the other files would recognize it. Thank you Andy for the additional information and the introductory thrashing!
In a global.h file I only DECLARED the array of struct Wrong. You did not just declare the array of structs --- you defined it, because there's no extern keyword in your supposed declaration. Technically, that makes this a "tentative definition", but effectively, this turns into a definition of the array in every module you #include "struct.h" in. You should almost certainly drop the "xdata" qualifier from the definition of the struct type itself.