question on structures.

B

broli

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;
 
P

Peter Nilsson

broli said:
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;
};
 
B

broli

Read the FAQ.

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



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 ?
 
B

broli

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 ?
 
N

Nick Keighley

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.
 
S

santosh

broli said:
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.
 
B

broli

This is a duplicate member.


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.





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{
....
};
 
B

broli

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
 
B

broli

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;
 

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

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,009
Latest member
GidgetGamb

Latest Threads

Top