私は以下を持っています
typedef struct{
GLfloat x;
GLfloat y;
GLfloat z;
}Vertex3D;
forループを使用したいと思います。構造体のインデックスに基づいて、構造体から必要なプリミティブを指定することは可能ですか。たとえば、配列のように、xに0をyに、2をzに使用したい場合はどうでしょうか。
ご回答ありがとうございます。代わりに配列を使用すると思います。それを避けたいと思っていましたが、まあまあ。GC
あなたが使うことができます
((GLfloat *)&Vertex3D)[i];
しかし、それはただ醜いです。
編集:以下の答えが指摘しているように、これは技術的には機能しない可能性があります。(この特定の状況ではあり得ないことですが)要素がパディングされ、メモリ内で連続していない可能性があります。
法的にではありません。構造体の要素はメモリ内で整列される可能性がありますが、このようにしないことを強くお勧めします。特に、構造体が後で追加のメンバーを必要とする場合は、後で多くの頭痛の種になる可能性があります。
代わりに試してください:
typedef struct
{
GLfloat c[3];
}Vertex3D;
と
#define VERTEX_X 0
#define VERTEX_Y 1
#define VERTEX_Z 2
次に、次の方法でアクセスします。
Vertex3D v;
v.c[VERTEX_X] = 5.5;
いいえ、きれいではありません。あなたができる
Vertex3D v;
float *pv = (float*)&v;
/* use pv[0],pv[1],pv[2] */
技術的には未定義の動作ですが、この特定のケースでは、広範囲にわたるコンパイラ/ OS/CPUの組み合わせで問題が発生することはないと思います。
構造体がメモリに格納される方法を利用できますが、それはお勧めしません。すべての要素がメモリ内で隣り合って配置されているため、技術的には未定義の動作である配列として扱うことができますが、構造体のすべてが同じタイプである限り、問題は発生しません。 (それは基本的に配列だからです)。
これを証明するために私が作成したテストプログラムは次のとおりです
#include <stdio.h>
typedef struct {
int x;
int y;
int z;
} Point;
int main() {
Point test = {1, 2, 3};
printf("x: %d\ty: %d\tz: %d\n", test.x, test.y, test.z);
int *ptest = (int *) &test;
for (int i = 0; i < 3; i++)
printf("%d\n", ptest[i]);
return 0;
}
期待どおりに動作します