96 lines
1.6 KiB
C
96 lines
1.6 KiB
C
// struct definition and declaration
|
|
struct a {
|
|
int a;
|
|
int b;
|
|
} c;
|
|
|
|
// Useless, but legal struct declaration
|
|
struct {
|
|
int x;
|
|
};
|
|
|
|
// Useful anonymous struct declaration
|
|
struct {
|
|
int y;
|
|
} anon1, anon2;
|
|
|
|
// forward declarations
|
|
struct a;
|
|
struct b;
|
|
struct c;
|
|
|
|
struct b {int a; int b; };
|
|
|
|
// struct c {b g; }; // syntax error.
|
|
|
|
// struct s {float c,a,b,c;} s; // duplicate struct member
|
|
|
|
struct c {struct b g; };
|
|
|
|
// struct a { int w; }; // error
|
|
|
|
void testCopying() {
|
|
struct a {int a[10]; char c;} a, b;
|
|
a.c = 37;
|
|
b.c = 38;
|
|
b = a;
|
|
printf("testCopying: %d == %d\n", a.c, b.c);
|
|
}
|
|
|
|
void testUnion() {
|
|
union u;
|
|
union u {float f;int i;} u;
|
|
u.f = 1.0f;
|
|
printf("testUnion: %g == 0x%08x\n", u.f, u.i);
|
|
}
|
|
|
|
struct v {float x, y, z, w; };
|
|
|
|
void add(struct v* result, struct v* a, struct v* b) {
|
|
result->x = a->x + b->x;
|
|
result->y = a->y + b->y;
|
|
result->z = a->z + b->z;
|
|
result->w = a->w + b->w;
|
|
}
|
|
|
|
void set(struct v* v, float x, float y, float z, float w) {
|
|
v->x = x;
|
|
v->y = y;
|
|
v->z = z;
|
|
v->w = w;
|
|
}
|
|
|
|
void print(struct v* v) {
|
|
printf("(%g, %g, %g, %g)\n", v->x, v->y, v->z, v->w);
|
|
}
|
|
|
|
void testArgs() {
|
|
struct v a, b, c;
|
|
set(&a, 1.0f, 2.0f, 3.0f, 4.0f);
|
|
set(&b, 5.0f, 6.0f, 7.0f, 8.0f);
|
|
add(&c, &a, &b);
|
|
printf("testArgs: ");
|
|
print(&c);
|
|
}
|
|
|
|
int main() {
|
|
anon1.y = 3;
|
|
anon2.y = anon1.y;
|
|
|
|
testCopying();
|
|
testUnion();
|
|
testArgs();
|
|
|
|
struct c cc;
|
|
cc.g.a = 3;
|
|
c.a = 1;
|
|
c.b = 3;
|
|
struct a {int x, y; } z;
|
|
// struct a {int x, y; } z2;
|
|
z.x = c.a;
|
|
struct a *pA;
|
|
pA = &z;
|
|
pA->x += 5;
|
|
return pA->x;
|
|
}
|