3

私は現在、来週の月曜日に行われるテストの模擬試験を行っていますが、私を混乱させる何かに出くわしました!

私は次の構造体を持っています:

struct shape2d {
   float x;
   float y;
};

struct shape3d {
   struct shape2d base;
   float z;
};

struct shape {
   int dimensions;
   char *name;
   union {
      struct shape2d s1;
      struct shape3d s2;
   } description;
};

typedef struct shape Shape;

次のシグネチャを持つ形状を「作成」する関数を作成する必要があります。

Shape *createShape3D(float x, float y, float z, char *name);

構造体の結合を扱っているため、必要なすべてのフィールドを初期化する方法がよくわかりません!

これが私がこれまでに持っているものです:

Shape *createShape3D(float x, float y, float z, char *name) {
   Shape *s = (Shape *) malloc(sizeof(Shape));
   s->dimensions = 3;
   s->name = "Name..."; 

   // How can I initialize s2? 

   return s;
}

どんな助けでも感謝します!

4

3 に答える 3

2

次のように実行できます。

 s->description.s2.base.x=1;
 s->description.s2.base.y=2;
 s->description.s2.z=3;

ご覧のとおり、構文は時々少し重くなります。そのため、構造体へのポインターから個々の座標にアクセスするための関数を定義することは理にかなっています。

float getX(Shape *s) {
    if (dimensions == 2) {
        return s->structure.s1.x;
    } else {
        return s->structure.s2.base.x;
    }
}
void setX(Shape *s, float x) {
    if (dimensions == 2) {
        s->structure.s1.x = x;
    } else {
        s->structure.s2.base.x = x;
    }
}
// Define similar functions for Y and Z

これで、初期化ルーチンがより読みやすいものに変わります

setX(s, 1);
setY(s, 2);
setZ(s, 3);
于 2013-03-02T02:59:03.987 に答える
2

まず、名前を s->name に strcpy する必要があります。

strcpy(s->name, "Name ...");

s2を次のように初期化できます

s->description.s2.z = 0;
s->description.s2.base.x = 0;
s->description.s2.base.y = 0;

ユニオンの詳細については、本を参照してください。ここでも見ることができます

http://c-faq.com/struct/union.html

http://c-faq.com/struct/initunion.html

http://c-faq.com/struct/taggedunion.html

于 2013-03-02T02:56:10.017 に答える
1
Shape *createShape3D(float x, float y, float z, char *name) {
   Shape *s = (Shape *) malloc(sizeof(Shape));
   s->dimensions = 3;
   s->name = malloc (strlen(name) + 1);
   strcpy(s->name, name); // Copy the value of name
   s->description.s2.base.x = x;
   s->description.s2.base.y = y;
   s->description.s2.z = z;

   return s;
}

s->nameまた、解放する前に必ずメモリを解放してくださいShape* s

于 2013-03-02T02:59:41.590 に答える