Re: void* passed as funtion parameters?
Robby <Robby@discussions.microsoft.com> wrote:
Bare in mind
What a disturbing image. Though I suppose "bear in mind" is not much
better. Now I'm going to have nightmares involving clean-shaved bears.
=================================
typedef struct tag_lb_table
{ long LKdct__F1;}lb_table;
typedef struct tag_ab_table
{ long LKdct__F1;}ab_table;
typedef struct tag_ab_table
{ long LKdct__F1;}cd_table;
These three structs are still identical. Why again are you having three
of them?
//============================
typedef struct tag_pc {
long LK__F1;
struct tag_pc_table *dc; // Pointer to an array of tag_pc_table
structs } pc;
typedef struct tag_ab {
long LK__F1;
struct tag_ab_table *dc; // Pointer to an array of tag_ab_table
structs } ab;
typedef struct tag_cd {
long LK__F1;
struct tag_cd_table *dc; // Pointer to an array of tag_cd_table
structs } cd;
And three more nearly identical structs. Why, oh why?
void f1(void *x, int type)
{
pc *p = x;
ab *q = x;
cd *r = x;
switch(type)
{
case 1: p->LK__F1 = 10; p->dc[0].LKdct__F1 = 20; break;
case 2: q->LK__F1 = 10; q->dc[0].LKdct__F1 = 20; break;
case 3: r->LK__F1 = 10; r->dc[0].LKdct__F1 = 20; break;
}
}
Just make it
void f1(void *x)
{
pc *p = x;
p->LK__F1 = 10;
p->dc[0].LKdct__F1 = 20;
}
int main()
{
void *x;
lb_table alb[] = { 100, 200};
ab_table aab[] = { 101, 201};
cd_table acd[] = { 102, 202};
x = malloc (sizeof (struct tag_pc));
x->dc = alb;
f1(x, 1);
x = malloc (sizeof (struct tag_ab));
x->dc = aab;
f1(x, 2);
x = malloc (sizeof (struct tag_cd));
x->dc = acd;
f1(x, 3);
free(x);
Note that you have three calls to malloc(), but only one call to free().
You are leaking two blocks of memory.
So how would I do a base structure for the 3 structs above (tag_pc,
tag_ab and tag_cd) given this scenario?
I say you get rid of three identical structures, and declare just one.
Here in f1(), I had to cast every possible type and put it through a
switch/case statement, which is what I am trying to get rid of. But
if I want to get rid of the casts
how would f1() know what type we are passing in so it accesses
the correct array of structs for the following line:
p->dc[0].LKdct__F1 = 20;
Why would it care? They all have the same layout.
--
With best wishes,
Igor Tandetnik
With sufficient thrust, pigs fly just fine. However, this is not
necessarily a good idea. It is hard to be sure where they are going to
land, and it could be dangerous sitting under them as they fly
overhead. -- RFC 1925