Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C Programming (http://www.velocityreviews.com/forums/f42-c-programming.html)
-   -   Help getting this to compile (http://www.velocityreviews.com/forums/t443619-help-getting-this-to-compile.html)

Allan M. Bruce 07-20-2006 10:31 AM

Help getting this to compile
 
I have a small implementation of a queue which I am trying to get to compile
but cant figure out why it doesnt work. I have copied the minimum
compilable code below. On gcc I get

temp2.c: In function `pop':
temp2.c:24: warning: initialization from incompatible pointer type
temp2.c:25: warning: assignment from incompatible pointer type
temp2.c: In function `destroy':
temp2.c:38: error: dereferencing pointer to incomplete type

In line 24, I am trying to intialise e which is an (entry *) to *xiQueue
which is a *(entry **) which should be an (entry *), no?
In line 38, I am dereferencing xiQueue which should give me an (entry *) so
I can access the members of the struct with ->, no?

In Visual C I get even more errors:

queue.c(24): error C2275: 'entry' : illegal use of this type as an
expression
queue.c(24): error C2065: 'e' : undeclared identifier
queue.c(25): error C2223: left of '->nextNode' must point to struct/union
queue.c(26): error C2223: left of '->data' must point to struct/union
queue.c(27): warning C4022: 'free' : pointer mismatch for actual parameter 1
queue.c(38): error C2037: left of 'nextNode' specifies undefined
struct/union 'entry'

Perhaps I am misunderstanding how to use typedef to make the queue
effectively an entry *. Can anybody help?
Thanks
Allan



#include <stdio.h>
#include <stdlib.h>

/*****************************************/
enum ERROR_CODES {ERROR, SUCCESS};

typedef struct entry *queue;

int pop(queue *, int *);
void destroy(queue *);
/*****************************************/

typedef struct tagEntry
{
int data;
struct tagEntry *nextNode;
} entry;

int pop(queue *xiQueue, int *xoData)
{
if (xiQueue == NULL)
return ERROR;

entry *e = *xiQueue;
*xiQueue = e->nextNode;
*xoData = e->data;
free(e);

return SUCCESS;
}

void destroy(queue *xiQueue)
{
if (xiQueue == NULL)
return;

int lDummy;
while ((*xiQueue)->nextNode != NULL)
pop(xiQueue, &lDummy);
xiQueue = NULL;
}

int main(void)
{
return 0;
}



Richard Bos 07-20-2006 10:47 AM

Re: Help getting this to compile
 
"Allan M. Bruce" <allanmb@TAKEAWAYdsl.pipex.com> wrote:

> In Visual C I get even more errors:
>
> queue.c(24): error C2275: 'entry' : illegal use of this type as an
> expression
> queue.c(24): error C2065: 'e' : undeclared identifier
> queue.c(25): error C2223: left of '->nextNode' must point to struct/union
> queue.c(26): error C2223: left of '->data' must point to struct/union
> queue.c(27): warning C4022: 'free' : pointer mismatch for actual parameter 1


Compiling as C++, are you?

> queue.c(38): error C2037: left of 'nextNode' specifies undefined
> struct/union 'entry'


> #include <stdio.h>
> #include <stdlib.h>
>
> /*****************************************/
> enum ERROR_CODES {ERROR, SUCCESS};
>
> typedef struct entry *queue;

^^^^^^^^^^^^

> int pop(queue *, int *);
> void destroy(queue *);
> /*****************************************/
>
> typedef struct tagEntry

^^^^^^^^^^^^^^^
> {
> int data;
> struct tagEntry *nextNode;
> } entry;

^^^^^

That's your problem. There's no such thing as a struct entry. It's
either an entry, but you can't use that before it's defined; or it's a
struct tagEntry. It should be

typedef struct tagEntry *queue;

Alternatively, you could replace struct tagEntry with struct entry in
the struct definition. Structure tags live in a namespace of their own,
so struct entry and typedef entry do not clash.

Richard

Allan M. Bruce 07-20-2006 11:12 AM

Re: Help getting this to compile
 

"Richard Bos" <rlb@hoekstra-uitgeverij.nl> wrote in message
news:44bf5e60.676627919@news.xs4all.nl...
> "Allan M. Bruce" <allanmb@TAKEAWAYdsl.pipex.com> wrote:
>
>> In Visual C I get even more errors:
>>
>> queue.c(24): error C2275: 'entry' : illegal use of this type as an
>> expression
>> queue.c(24): error C2065: 'e' : undeclared identifier
>> queue.c(25): error C2223: left of '->nextNode' must point to struct/union
>> queue.c(26): error C2223: left of '->data' must point to struct/union
>> queue.c(27): warning C4022: 'free' : pointer mismatch for actual
>> parameter 1

>
> Compiling as C++, are you?
>
>> queue.c(38): error C2037: left of 'nextNode' specifies undefined
>> struct/union 'entry'

>
>> #include <stdio.h>
>> #include <stdlib.h>
>>
>> /*****************************************/
>> enum ERROR_CODES {ERROR, SUCCESS};
>>
>> typedef struct entry *queue;

> ^^^^^^^^^^^^
>
>> int pop(queue *, int *);
>> void destroy(queue *);
>> /*****************************************/
>>
>> typedef struct tagEntry

> ^^^^^^^^^^^^^^^
>> {
>> int data;
>> struct tagEntry *nextNode;
>> } entry;

> ^^^^^
>
> That's your problem. There's no such thing as a struct entry. It's
> either an entry, but you can't use that before it's defined; or it's a
> struct tagEntry. It should be
>
> typedef struct tagEntry *queue;
>
> Alternatively, you could replace struct tagEntry with struct entry in
> the struct definition. Structure tags live in a namespace of their own,
> so struct entry and typedef entry do not clash.
>
> Richard


Hehe, as easy as that - I thought it might be!
Thanks Richard
Allan



Martin Ambuhl 07-20-2006 08:22 PM

Re: Help getting this to compile
 
Allan M. Bruce wrote:
>
> Perhaps I am misunderstanding how to use typedef to make the queue
> effectively an entry *.


Yes, you are:

> typedef struct entry *queue;

The above is wrong. 'struct entry' is meaningless. Try, if you _must_
use promiscuous typedefs,

typedef struct tagEntry *queue;


> typedef struct tagEntry
> {
> int data;
> struct tagEntry *nextNode;
> } entry;


Peter Shaggy Haywood 07-24-2006 04:07 AM

Re: Help getting this to compile
 
Groovy hepcat Allan M. Bruce was jivin' on Thu, 20 Jul 2006 11:31:31
+0100 in comp.lang.c.
Help getting this to compile's a cool scene! Dig it!

>In Visual C I get even more errors:
>
>queue.c(24): error C2275: 'entry' : illegal use of this type as an
>expression
>queue.c(24): error C2065: 'e' : undeclared identifier
>queue.c(25): error C2223: left of '->nextNode' must point to struct/union
>queue.c(26): error C2223: left of '->data' must point to struct/union


These errors result from the fact that you are declaring a variable
after executing statements. Move declarations to the top of the block
in which they are declared.

--

Dig the even newer still, yet more improved, sig!

http://alphalink.com.au/~phaywood/
"Ain't I'm a dog?" - Ronny Self, Ain't I'm a Dog, written by G. Sherry & W. Walker.
I know it's not "technically correct" English; but since when was rock & roll "technically correct"?


All times are GMT. The time now is 12:08 PM.

Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57