Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C Programming (http://www.velocityreviews.com/forums/f42-c-programming.html)
-   -   question on structures. (http://www.velocityreviews.com/forums/t601845-question-on-structures.html)

broli 03-26-2008 04:07 AM

question on structures.
 

typedef struct y
{
x1 *c;
x2 *c;
} y;

typedef struct x1
{
y *a;
}x1;

typedef struct x2
{
y *b;
}x2;


^^ If I want to have declarations like that in my program, then what
should I do ? Would it work if I put these two lines before the
declaration of y -

typedef struct x1 x1;
typedef struct x2 x2;

Peter Nilsson 03-26-2008 05:56 AM

Re: question on structures.
 
broli <Brol...@gmail.com> wrote:
> typedef struct y
> {
> * x1 *c;
> * x2 *c;
> } y;
>
> typedef struct x1
> {
> * y *a;
> }x1;
>
> typedef struct x2
> {
> * y *b;
>
> }x2;
>
> ^^ If I want to have declarations like that in my
> program, then what should I do ?


Read the FAQ.

http://www.c-faq.com/decl/mutrefstructs.html

> Would it work if I put these two lines before the
> declaration of y -
>
> typedef struct x1 x1;
> typedef struct x2 x2;


Yes, but you don't need the typedefs...

struct y
{
struct x1 *c;
struct x2 *c;
};

struct x1
{
struct y *a;
};

struct x2
{
struct y *b;
};

--
Peter

broli 03-26-2008 06:09 AM

Re: question on structures.
 
On Mar 26, 10:56 am, Peter Nilsson <ai...@acay.com.au> wrote:
> broli <Brol...@gmail.com> wrote:
> > typedef struct y
> > {
> > x1 *c;
> > x2 *c;
> > } y;

>
> > typedef struct x1
> > {
> > y *a;
> > }x1;

>
> > typedef struct x2
> > {
> > y *b;

>
> > }x2;

>
> > ^^ If I want to have declarations like that in my
> > program, then what should I do ?

>
> Read the FAQ.
>
> http://www.c-faq.com/decl/mutrefstructs.html
>
> > Would it work if I put these two lines before the
> > declaration of y -

>
> > typedef struct x1 x1;
> > typedef struct x2 x2;

>
> Yes, but you don't need the typedefs...
>
> struct y
> {
> struct x1 *c;
> struct x2 *c;
> };
>
> struct x1
> {
> struct y *a;
> };
>
> struct x2
> {
> struct y *b;
> };
>


Why is it wrong to use typedef here ? Or are you trying to say that if
I precede the struct x1 and x2 declarations with following two
statements -
typedef struct x1 x1;
typedef struct x2 x2;

Then I don't need to add the typedef keyword again when declaring the
structs ?

broli 03-26-2008 09:02 AM

Re: question on structures.
 
Specifically, this is my problem -

typedef struct VertexData VertexData;
typedef struct EdgeData EdgeData;
typedef struct TriangleData TriangleData;

typedef struct HalfData{
HalfData *next;
HalfData *previous;
HalfData *next;
VertexData *origin;
TriangleData *left;
EdgeData *edge;
}HalfData;

struct VertexData{
HalfData* half;
};

struct EdgeData{
HalfData* half;
};

struct PolygonData{
HalfData* half;
};

Have I used a wrong notation over here ?

Nick Keighley 03-26-2008 09:26 AM

Re: question on structures.
 
On 26 Mar, 06:09, broli <Brol...@gmail.com> wrote:
> On Mar 26, 10:56 am, Peter Nilsson <ai...@acay.com.au> wrote:
> > broli <Brol...@gmail.com> wrote:


> > > typedef struct y
> > > {
> > > * x1 *c;
> > > * x2 *c;
> > > } y;

>
> > > typedef struct x1
> > > {
> > > * y *a;
> > > }x1;

>
> > > typedef struct x2
> > > {
> > > * y *b;

>
> > > }x2;

>
> > > ^^ If I want to have declarations like that in my
> > > program, then what should I do ?

>
> > Read the FAQ.

>
> >http://www.c-faq.com/decl/mutrefstructs.html

>
> > > Would it work if I put these two lines before the
> > > declaration of y -

>
> > > typedef struct x1 x1;
> > > typedef struct x2 x2;

>
> > Yes, but you don't need the typedefs...

>
> > * struct y
> > * {
> > * * struct x1 *c;
> > * * struct x2 *c;
> > * };

>
> > * struct x1
> > * {
> > * * struct y *a;
> > * };

>
> > * struct x2
> > * {
> > * * struct y *b;
> > * };

>
> Why is it wrong to use typedef here ?


he's not saying the typedefs are "wrong" he's saying
they are unnecessary. Many C programmers don't like
typedefing structs. Many do. It's a style thing.
(I'm a typedefer myself, I thing making struct
part of the type name is ugly).


> Or are you trying to say that if
> I precede the struct x1 and x2 declarations with following two
> statements -
> typedef struct x1 x1;
> typedef struct x2 x2;
>
> Then I don't need to add the typedef keyword again when declaring the
> structs?


you can declare structs without using typedef.


--
Nick Keighley

santosh 03-26-2008 09:48 AM

Re: question on structures.
 
broli wrote:

> Specifically, this is my problem -
>
> typedef struct VertexData VertexData;
> typedef struct EdgeData EdgeData;
> typedef struct TriangleData TriangleData;
>
> typedef struct HalfData{
> HalfData *next;
> HalfData *previous;
> HalfData *next;


This is a duplicate member.

> VertexData *origin;
> TriangleData *left;
> EdgeData *edge;
> }HalfData;


I would define the above as a plain struct declaration and later typedef
it.

struct HalfData {
/* ... */
};

typedef struct HalfData HalfData;

Also I don't like the practise of giving same names for both the struct
tags and the corresponding typedef, but that is a style issue.

> struct VertexData{
> HalfData* half;
> };
>
> struct EdgeData{
> HalfData* half;
> };
>
> struct PolygonData{
> HalfData* half;
> };
>
> Have I used a wrong notation over here ?


Yes, for HalfData declaration.


broli 03-26-2008 10:47 AM

Re: question on structures.
 
On Mar 26, 2:48 pm, santosh <santosh....@gmail.com> wrote:
> broli wrote:
> > Specifically, this is my problem -

>
> > typedef struct VertexData VertexData;
> > typedef struct EdgeData EdgeData;
> > typedef struct TriangleData TriangleData;

>
> > typedef struct HalfData{
> > HalfData *next;
> > HalfData *previous;
> > HalfData *next;

>
> This is a duplicate member.
>
> > VertexData *origin;
> > TriangleData *left;
> > EdgeData *edge;
> > }HalfData;

>
> I would define the above as a plain struct declaration and later typedef
> it.
>
> struct HalfData {
> /* ... */
> };
>
> typedef struct HalfData HalfData;
>
> Also I don't like the practise of giving same names for both the struct
> tags and the corresponding typedef, but that is a style issue.
>
> > struct VertexData{
> > HalfData* half;
> > };

>
> > struct EdgeData{
> > HalfData* half;
> > };

>
> > struct PolygonData{
> > HalfData* half;
> > };

>
> > Have I used a wrong notation over here ?

>
> Yes, for HalfData declaration.


Ok so I take your suggestions -

typedef struct VertexDataStruct VertexData;
typedef struct EdgeDataStruct EdgeData;
typedef struct TriangleDataStruct TriangleData;

struct HalfDataStruct{
struct HalfDataStruct *next;
struct HalfDataStruct *previous;
struct HalfDataStruct *next;
};

typedef struct HalfDataStruct HalfData;

( I still don't see how this is different from what i did previously
ie typedef struct HalfData{
......}Halfdata;)

struct VertexDataStruct{
....
};

struct EdgeDataStruct{
....
};

struct TriangleDataStruct{
....
};

broli 03-26-2008 10:50 AM

Re: question on structures.
 
On Mar 26, 3:47 pm, broli <Brol...@gmail.com> wrote:
> On Mar 26, 2:48 pm, santosh <santosh....@gmail.com> wrote:
>
>
>
> > broli wrote:
> > > Specifically, this is my problem -

>
> > > typedef struct VertexData VertexData;
> > > typedef struct EdgeData EdgeData;
> > > typedef struct TriangleData TriangleData;

>
> > > typedef struct HalfData{
> > > HalfData *next;
> > > HalfData *previous;
> > > HalfData *next;

>
> > This is a duplicate member.

>
> > > VertexData *origin;
> > > TriangleData *left;
> > > EdgeData *edge;
> > > }HalfData;

>
> > I would define the above as a plain struct declaration and later typedef
> > it.

>
> > struct HalfData {
> > /* ... */
> > };

>
> > typedef struct HalfData HalfData;

>
> > Also I don't like the practise of giving same names for both the struct
> > tags and the corresponding typedef, but that is a style issue.

>
> > > struct VertexData{
> > > HalfData* half;
> > > };

>
> > > struct EdgeData{
> > > HalfData* half;
> > > };

>
> > > struct PolygonData{
> > > HalfData* half;
> > > };

>
> > > Have I used a wrong notation over here ?

>
> > Yes, for HalfData declaration.

>
> Ok so I take your suggestions -
>
> typedef struct VertexDataStruct VertexData;
> typedef struct EdgeDataStruct EdgeData;
> typedef struct TriangleDataStruct TriangleData;
>
> struct HalfDataStruct{
> struct HalfDataStruct *next;
> struct HalfDataStruct *previous;
> struct HalfDataStruct *next;
> };
>
> typedef struct HalfDataStruct HalfData;
>
> ( I still don't see how this is different from what i did previously
> ie typedef struct HalfData{
> .....}Halfdata;)
>
> struct VertexDataStruct{
> ...
>
> };
>
> struct EdgeDataStruct{
> ...
>
> };
>
> struct TriangleDataStruct{
> ...
>
> };



^^ oops im sorry there i repeated the same mistake (duplicate member)
in half data but please ignore it as it is not signifcant to the
discussion

broli 03-26-2008 10:59 AM

Re: question on structures.
 
I believe this is even a clearer approach as given in C FAQ 1.15 -

struct VertexDataStruct;
struct EdgeDataStruct;
struct TriangleDataStruct;

struct HalfDataStruct{
struct HalfDataStruct *next;
struct HalfDataStruct *previous;
struct VertexDataStruct *origin;
struct TriangleDataStruct *left;
struct EdgeDataStruct *edge;
};

struct VertexDataStruct{
struct HalfDataStruct *half;
};

struct EdgeDataStruct{
struct HalfDataStruct *half;
};

struct TriangleDataStruct{
struct HalfDataStruct *half;
};

typedef struct HalfDataStruct HalfData;
typedef struct VertexDataStruct VertexData;
typedef struct EdgeDataStruct EdgeData;
typedef struct TriangleDataStruct TriangleData;


All times are GMT. The time now is 05:21 AM.

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