Array has incomplete element type. GCC bug?

A

arcadio

Hi everyone,

I'm currently struggling to compile a large piece of legacy code. GCC
3.3 compiles it without complaining, but GCC 4.2.3 (the default in
Debian) refuses it and signals "several array has incomplete element
type" errors.

I know that since 4.0 or so, GCC is less forgiving and does not accept
any arrays of incomplete type (see http://gcc.gnu.org/ml/gcc/2005-02/msg00053.html).
However, I cannot see where the array types are incomplete here:

/* From the header */
void grphcs_enhnc_outsquare(unsigned char [][], const int, const int,
const int, const int y);

/* From the source: ERROR: Array type has incomplete element type */
void grphcs_enhnc_outsquare(unsigned char outsquare[][], const int w,
const int h, const int x, const int y)
{ /* ... */ }

/* From another header */
extern void bz_comp(int, int [], int [], int [], int *, int [][], int
*[]);

/* From the corresponding source: ERROR: Array type has incomplete
element type */
void bz_comp(
int npoints,
int xcol[ MAX_BOZORTH_MINUTIAE ],
int ycol[ MAX_BOZORTH_MINUTIAE ],
int thetacol[ MAX_BOZORTH_MINUTIAE ],

int * ncomparisons,
int cols[][ COLS_SIZE_2 ],
int * colptrs[]
)
{ /* ... */ }


Can anyone shed some light?

Thanks in advance


- Arcadio
 
L

Lew Pitcher

Hi everyone,

I'm currently struggling to compile a large piece of legacy code. GCC
3.3 compiles it without complaining, but GCC 4.2.3 (the default in
Debian) refuses it and signals "several array has incomplete element
type" errors. [snip]
/* From the corresponding source: ERROR: Array type has incomplete
element type */
void bz_comp(
int npoints,
int xcol[ MAX_BOZORTH_MINUTIAE ],
int ycol[ MAX_BOZORTH_MINUTIAE ],
int thetacol[ MAX_BOZORTH_MINUTIAE ],

int * ncomparisons,
int cols[][ COLS_SIZE_2 ],

How many cols elements are in this array? How can the compiler determine
that number?
int * colptrs[]
)
{ /* ... */ }


Can anyone shed some light?

Thanks in advance


- Arcadio

--
Lew Pitcher

Master Codewright & JOAT-in-training | Registered Linux User #112576
http://pitcher.digitalfreehold.ca/ | GPG public key available by request
---------- Slackware - Because I know what I'm doing. ------
 
A

arcadio

Thanks, I was quite obfuscated with the example shown in the GCC
forum, and didn't realize that an two-dimensional array needs the
column size in order to be considered a complete type.

In relation to the subject, I recognize that it was a bit hard to
blame GCC, especially because the code smelled wrong. The code i'm
showing isn't mine, it's from a Federal Agency, so I don't have any
problem in recognizing it's wrong.

And I've already reported 2 bugs to two different compilers (AspectJ
and ScalaC), so it's not that rare.
 
A

arcadio

Thanks, I was quite obfuscated with the example shown in the GCC
forum, and didn't realize that an two-dimensional array needs the
column size in order to be considered a complete type.

In relation to the subject, I recognize that it was a bit hard to
blame GCC, especially because the code smelled wrong. The code i'm
showing isn't mine, it's from a Federal Agency, so I don't have any
problem in recognizing it's wrong.

And I've already reported 2 bugs to two different compilers (AspectJ
and ScalaC), so it's not that rare.
 
A

arcadio

Hi everyone,
I'm currently struggling to compile a large piece of legacy code. GCC
3.3 compiles it without complaining, but GCC 4.2.3 (the default in
Debian) refuses it and signals "several array has incomplete element
type" errors. [snip]
/* From the corresponding source: ERROR: Array type has incomplete
element type */
void bz_comp(
int npoints,
int xcol[     MAX_BOZORTH_MINUTIAE ],
int ycol[     MAX_BOZORTH_MINUTIAE ],
int thetacol[ MAX_BOZORTH_MINUTIAE ],
int * ncomparisons,
int cols[][ COLS_SIZE_2 ],

How many cols elements are in this array? How can the compiler determine
that number?
int * colptrs[]
)
{ /* ... */ }
Can anyone shed some light?
Thanks in advance
- Arcadio

--
Lew Pitcher

Master Codewright & JOAT-in-training | Registered Linux User #112576http://pitcher.digitalfreehold.ca/  | GPG public key available by request
----------      Slackware - Because I know what I'm doing.          ------

The error is not there, it's:

/* From the header */
void grphcs_enhnc_outsquare(unsigned char **, const int, const int,
<-- transform into pointers
const int, const int y);

/* From the source: ERROR: Array type has incomplete element type */
void grphcs_enhnc_outsquare(unsigned char **outsquare, const int w,
<-- transform into pointers
const int h, const int x, const int y)
{ /* ... */ }

/* From another header */
extern void bz_comp(int, int [], int [], int [], int *, int []
[COLS_SIZE_2], int <- constant needed
*[]);

/* From the corresponding source: ERROR: Array type has incomplete
element type */
void bz_comp(
int npoints,
int xcol[ MAX_BOZORTH_MINUTIAE ],
int ycol[ MAX_BOZORTH_MINUTIAE ],
int thetacol[ MAX_BOZORTH_MINUTIAE ],

int * ncomparisons,
int cols[][ COLS_SIZE_2 ],
int * colptrs[]
)
{ /* ... */ }
 
K

Kaz Kylheku

Thanks, I was quite obfuscated with the example shown in the GCC
forum, and didn't realize that an two-dimensional array needs the
column size in order to be considered a complete type.

C has only one-dimensional arrays; two-dimensional arrays are
simulated by declaring an array whose elements are arrays. The element
type of an array must be a complete type, because the pointer
arithmetic needed for addressing the elements is impossible without
knowing the element size, whereas the size of an incomplete type is
unknown. An array declaration which doesn't specify a number of
elements is an incomplete type. Hence, you cannot declare an array of
such arrays.
 
K

Kenny McCormack

arcadio said:

However, I cannot see
where the array types are incomplete here:

/* From the header */
void grphcs_enhnc_outsquare(unsigned char [][]
^^^^
Right here.

Regarding your subject line, "Array has incomplete element type. GCC bug?",
it is generally wisest in the first instance[1] to assume that the bug is
in your code unless you can demonstrate from the Standard that your code
is correct.

While I agree with the sentiment here (including the footnote(s)), the
salient fact here is that OP says it worked (compiled) with the earlier
versions of GCC. Now, assuming he isn't mistaken about that, the fact
is that you can standards-jockey it all you want, it ain't gonna mean
much. Believe me, if TPTB (the ones who are paying the bills) know that
it worked before and it doesn't work now, then, for all practical
purposes, it is a bug (in the new version) - and no amount of
standards-jockeying is going to change that fact.

Or, to put it a little bit more charitably, OP's post can (and should)
be interpreted as: It worked before; it doesn't work now; is there a
workaround?
 
H

Harald van Dijk

Richard Heathfield said:
arcadio said:

However, I cannot see
where the array types are incomplete here:

/* From the header */
void grphcs_enhnc_outsquare(unsigned char [][]
^^^^
Right here.
[...]
Or, to put it a little bit more charitably, OP's post can (and should)
be interpreted as: It worked before; it doesn't work now; is there a
workaround?

Sure: declare a pointer to an array of unsigned char of unknown length.

void grphcs_enhnc_outsquare(unsigned char (*)[], ...);
void grphcs_enhnc_outsquare(unsigned char (*outsquare)[], ...) {
...
}

This is what the declaration meant with those older versions of GCC, and
what it would mean in standard C if it weren't specifically disallowed,
anyway.

I'd be surprised to find a sensible use for this type of declaration,
though. It's valid and compiles, but all the other problems of
unsigned char [][] remain, so it would still be good to find a better type
to use.
 
B

blmblm

Thanks, I was quite obfuscated

Point of English usage: Can one speak of a person being
obfuscated, or is it the code that's (possibly) obfuscated,
and the person confused by it?
with the example shown in the GCC
forum, and didn't realize that an two-dimensional array needs the
column size in order to be considered a complete type.

[ snip ]
 
W

Walter Roberson

Point of English usage: Can one speak of a person being
obfuscated,

Yes. OED has a secondary meaning that makes it clear that it can
apply to a person:

2. Of a person or his or her faculties: confused, bewildered;
amazed, flabbergasted (obs.); (U.S. slang) spec. befuddled with
alcohol, intoxicated (now rare).

There are a few examples given, such as

1860 `G. ELIOT' Mill on Floss I. I. vii. 125 As for uncle Pullet, he
could hardly have been more thoroughly obfuscated if Mr Tulliver had
said that he was going to send Tom to the Lord Chancellor.
 
B

blmblm

Yes. OED has a secondary meaning that makes it clear that it can
apply to a person:

2. Of a person or his or her faculties: confused, bewildered;
amazed, flabbergasted (obs.); (U.S. slang) spec. befuddled with
alcohol, intoxicated (now rare).

There are a few examples given, such as

1860 `G. ELIOT' Mill on Floss I. I. vii. 125 As for uncle Pullet, he
could hardly have been more thoroughly obfuscated if Mr Tulliver had
said that he was going to send Tom to the Lord Chancellor.

Huh! The entry in the online Merriam-Webster

http://www.merriam-webster.com/dictionary/obfuscated

doesn't seem to give this meaning. But okay, I've learned
something!

(If it matters, my post was meant to be possibly-useful information
for someone for whom English might not be a first language. But
maybe he(?) knows it better than I do. Sort of a :). )
 
B

blmblm

(e-mail address removed) said:

[ .... ]
Yes, you've learned that you get the dictionary you pay for. :)

:), yes, but --

It might also have to do with the two dictionaries just
having different slants in general. I haven't done a thorough
comparison, but my impression based on a few other experiences
using both dictionaries is that the OED is somewhat more
traditional/prescriptivist than Merriam-Webster, and that there
also may be {left/right}-pondian differences.

I believe it's time to change the subject line from "semi-OT"
to "OT", as well as just letting this go ....
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,053
Latest member
BrodieSola

Latest Threads

Top