Array Element Type Problem - Smaug 1.4a

Posted by Rash on Thu 10 Dec 2009 10:20 PM — 8 posts, 35,798 views.

United Kingdom #0
OK I have by far the strangest problem I've ever encountered. Back in march this was compiling clean and without a problem. Just moved it to my new laptop running Cygwin and out pop's this error. The code in question hasn't been changed (Nothing has since March). Any clue's on what may of caused this and how to correct it?

Notes: Codebase is Smaug 1.4a, pretty heavily modified now.

Compile Errors:

make[1]: Entering directory `/home/talairina/src'
gcc -c  -O -g3 -Wall -Wuninitialized    -Dsmaug  -DTIMEFORMAT  act_comm.c
In file included from act_comm.c:32:
mud.h:3868: error: array type has incomplete element type
mud.h:3876: error: array type has incomplete element type
mud.h:3884: error: array type has incomplete element type
mud.h:3892: error: array type has incomplete element type
mud.h:3900: error: array type has incomplete element type
mud.h:3907: error: array type has incomplete element type
mud.h:3909: error: array type has incomplete element type
make[1]: *** [act_comm.o] Error 1
make[1]: Leaving directory `/home/talairina/src'
make: *** [all] Error 2


Lines in question are:


extern const struct  weight_type     weight_type_table[];

struct weight_type
{
    char *weight_type_list[1];
};

/* height table */
extern const struct  height_type     height_type_table[];

struct height_type
{
    char *height_type_list[1];
};


There are more, but all are vastly similar to the above segments.

All compile attempts were on Cygwin under Windows XP SP 3 (Cygwin release is 05 Dec 2009) and Windows 7 (Same Cygwin package). I also attempted this on my Ubuntu box but same error outputs (Ubuntu Linux 8.04.3).
Australia Forum Administrator #1
I presume these are in different files as you are using extern. Or, if they are in the same file they are in that order.

The compiler cannot determine the size of the array:


extern const struct  weight_type     weight_type_table[];


This compiles and has a similar meaning:


extern const struct  weight_type  *   weight_type_table;


Now all the compiler has to do is allocate space for a pointer.
Amended on Thu 10 Dec 2009 11:09 PM by Nick Gammon
United Kingdom #2
What would cause the compiler to give since an error now and not before? I can't seem to get it working at all even with the changes noted above by yourself Nick. (I may be missing something needing done here?)

I just can't wrap my head around why it would give such an error now, months after its been compiled cleanly with the strucs been set like that.
Canada #3
Odd structs aside, if your code hasn't changed has your Cygwin changed? Perhaps some updates have made Cygwin more rigid thus noticing the errors now.
USA #4
Yes, there was most likely a compiler upgrade, causing it to be more strict about these things.
Australia Forum Administrator #5
Rash said:


I just can't wrap my head around why it would give such an error now, months after its been compiled cleanly with the strucs been set like that.


If you Google your error message you will find you are not the only one. "But ... it used to work!" is a common theme.

The compiler has tightened up its checks. It now refuses to allocate an array of somethings when it doesn't know what size they are.

This code compiled OK for me:


struct weight_type
{
    char *weight_type_list[1];
};

extern const struct  weight_type     weight_type_table[];

int main ()
{
  return 0;
}


So you may solve your problem by including a .h file that defines what weight_type is, then the extern definition to an array of weight_type can be processed.
Amended on Fri 11 Dec 2009 07:17 PM by Nick Gammon
United Kingdom #6
After some digging, it does indeed seem like Cygwin has been updated with tighter checks. Guess that means I'll be ding a lot of debugging =) At least I'll learn to write much cleaner code.

I'll have to look in to your solution Nick once back on the *nix box.
#7
Thanks for you information i newly join and your post help me.