3

これはおそらく私が間違っていることは本当に愚かなことですが、それが何であるかを理解することはできません。

私は構造体を持っています、PDRectそのメンバーはとです:PDPointPDSize

typedef struct {
    GLfloat x, y;
} PDPoint;

typedef struct {
    GLfloat width, height;
} PDSize;

typedef struct {
    PDPoint origin;
    PDSize size;
} PDRect;

私が1つをインスタンス化すると、次のようになります。

PDRect rect = {
    .origin = {
        .x = 0,
        .y = 0
    },
    .size = {
        .height = .5,
        .width = .5
    }
};

デバッガーは、rect.origin.widthrect.origin.heightが両方とも存在し、0に等しくrect.size.xrect.size.y両方が存在し、.5に等しいと言います。なぜこれが起こっているのか分かりません。

明確にするための編集:私の混乱は、rect.origin(PDPoint)に高さと幅の値が関連付けられており、rect.size(PDSize)にxとyの値が関連付けられている理由です。原点はxとyだけで、サイズは高さと幅だけではいけませんか?

編集:それは実際にそれらを非匿名で宣言するように修正しました、すなわち:

typedef struct _PDPoint {
    GLfloat x, y;
} PDPoint;

typedef struct _PDSize {
    GLfloat width, height;
} PDSize;

typedef struct _PDRect {
    PDPoint origin;
    PDSize size;
} PDRect;

なぜそれが違いを生むのか、実際にはわかりませんが、問題は解決したようです。

4

1 に答える 1

1

匿名構造体と型定義を同時に使用していたために問題が発生したと思います。C コンパイラが

struct {...} name;

それが実際に変化することを構築します

struct anonymous {...} name;

今ここに私が起こっていると思うものがあります:...そして私はあなたの例を再現できないと思います。タイプを float に変更し、FreeBSD amd64/gcc バージョン 4.2.1 20070831 で実行しました。以下のコード。

#include <stdio.h>

typedef struct {
  float x, y;
} PDPoint;

typedef struct {
  float width, height;
} PDSize;

typedef struct {
  PDPoint origin;
  PDSize size;
} PDRect;

int main(int argc, char *argv[]) {
  PDRect rect = {
    .origin = {
      .x = 1,
      .y = 1
    },
    .size = {
      .height = .5,
      .width = .5
    }
  };
  printf("w:%f h:%f x:%f y:%f\n",rect.size.width,rect.size.height,
      rect.origin.x,rect.origin.y);
  return 0;
}

出力

w:0.500000 h:0.500000 x:1.000000 y:1.000000

当然のことですが...次のことを試すことができれば興味深いでしょう。構造体の 1 つを整数を保持するように変更し、スワッピングが再び発生するかどうかを確認します。また、2 つのフィールドをゼロ以外の値に初期化して、それが原因なのか、デフォルトで割り当てられた値なのかを確認してください。
私が考えているのは、あなたのコードでは、コンパイラがその順序で物事を行うということです:

a) 2 つの float を取り、それをスタックに格納し、PDPoint という名前の anonymous と呼ばれる構造体を確認します。

b) 2 つの float を取り、それをスタックに格納し、PDSize という名前の anonymous という名前の構造体を確認します。

c) PDPoint を検索して 3 番目の構造体を定義しているときに、2 つの浮動小数点数を取る匿名と呼ばれる構造体をスタックから pop() します。しかし、この時点で、これは PDSize に解決されます。

d) PDSize の場合、PDPoint のみがスタックに残され、実際には 2 つの浮動小数点数を取る匿名と呼ばれる構造体です。;)

構造体を型定義して宣言する適切な方法は次のとおりです。

typedef struct name_t { ... } name;

ただし、今日では _t 規則を捨てることができると主張する人もいます (これは POSIX 用に予約されています)。tl;dr: 匿名の構造体には注意してください。

于 2012-12-09T01:35:42.677 に答える