1

我有以下

typedef struct{

GLfloat x;

GLfloat y;

GLfloat z;


}Vertex3D;

我想使用一个 for 循环。是否可以根据其索引从结构中指定您想要的原语。例如,如果我想使用数字 0 表示 x 1 表示 y 和 2 表示 z 就像一个数组?

感谢您的所有回复。我想我会改用数组。希望避免它,但很好。GC

4

4 回答 4

2

你可以使用

((GLfloat *)&Vertex3D)[i];

但这很丑陋。

编辑:正如下面的答案所指出的,这在技术上甚至可能行不通。有可能(尽管对于这种特殊情况不太可能)元素将被填充并且在内存中不连续。

于 2012-08-06T17:00:27.550 回答
2

不合法。结构的元素可能会在内存中对齐,但我强烈建议不要这样做,这可能会在以后引起很多麻烦,尤其是当您发现结构以后需要其他成员时。

请尝试:

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;
于 2012-08-06T17:06:10.317 回答
0

不,不干净。你可以做

Vertex3D v;
float *pv = (float*)&v;
/* use pv[0],pv[1],pv[2] */

从技术上讲,这是未定义的行为,但在这种特殊情况下,我不希望任何广泛使用的编译器/OS/CPU 组合出现问题。

于 2012-08-06T17:02:29.067 回答
0

您可以利用结构存储在内存中的方式,但我建议不要这样做。因为所有元素在内存中彼此相邻,您可以将其视为一个数组,这在技术上是一种未定义的行为,但只要您的结构中的所有内容都是相同的类型,就不会导致任何问题(因为它基本上是一个数组)。

这是我为证明这一点而制作的测试程序

#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;
}

按预期工作

于 2012-08-06T17:06:34.700 回答