Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > Help getting this to compile

Reply
Thread Tools

Help getting this to compile

 
 
Allan M. Bruce
Guest
Posts: n/a
 
      07-20-2006
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(3: 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;
}


 
Reply With Quote
 
 
 
 
Richard Bos
Guest
Posts: n/a
 
      07-20-2006
"Allan M. Bruce" <(E-Mail Removed)> 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(3: 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
 
Reply With Quote
 
 
 
 
Allan M. Bruce
Guest
Posts: n/a
 
      07-20-2006

"Richard Bos" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed)4all.nl...
> "Allan M. Bruce" <(E-Mail Removed)> 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(3: 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


 
Reply With Quote
 
Martin Ambuhl
Guest
Posts: n/a
 
      07-20-2006
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;

 
Reply With Quote
 
Peter Shaggy Haywood
Guest
Posts: n/a
 
      07-24-2006
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"?
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
compile directive for conditional compile for Java 1.4 versus Java 5 timjowers Java 7 02-02-2011 12:08 AM
How to compile the following source code in VC6// I have error inVC++6 but compile ok in GCC fAnSKyer C++ 2 06-07-2009 07:57 AM
computation at compile time i.e. compile time functions usingtemplates Carter C++ 2 03-04-2009 06:43 PM
Compile versus not compile (VS 2005)?? stupid48@gmail.com ASP .Net 1 04-11-2008 08:24 PM
cant compile on linux system.cant compile on cant compile onlinux system. Nagaraj C++ 1 03-01-2007 11:18 AM



Advertisments