在C中初始化结构数组的紧凑方式?



我有一个相当混乱的方法来初始化结构数组,我希望有人能帮我找到一个更紧凑的方法。我的结构是:

struct Vertex_t {
int i; /* Label */
int n; /* Order (number of 2D simplicies it is contained within) */
int r[3]; /* Position of vertex, for plotting */
}; 

我需要很多这样的元素,所以我准备了一个数组

struct Vertex_t v_list[VERT_MAX]

所以现在我需要设置我最初使用的那些(这里是4个,但原则上,它会更多):

int N_t=4;
for (i=0;i<N_v;i++){
v_list[i].i=i;
v_list[i].n=1;
}
v_list[0].r[0]=0;
v_list[0].r[1]=1;
v_list[0].r[2]=0;
.../* for each i*/

所以我可以循环设置初始数字,但是对于数组r(在这里扮演3D向量的角色),我必须单独设置每个数字(r[]的每个值必须手动设置....我认为)。上面的代码可以工作,但是我更愿意使用像

这样的代码
v_list[0].r[]={0,1,0};

或者

v_list[i]={.i=i,.n=1, .r={0,1,0}};

但是我知道它们都不能工作,因为我已经为v_list[I]预留了内存。

有没有人有办法得到我想要的?我在数组中需要大量的结构,并且我希望像初始化它们一样对它们进行设置。

对于数组r(在这里扮演3D向量的角色),我必须设置每个单独(r[]的每个值必须手动设置....I认为)。上面的代码可以工作,但我更喜欢像

这样的代码。
v_list[0].r[]={0,1,0};

或者

v_list[i]={.i=i,.n=1, .r={0,1,0}};

C有数组初始化,但没有(整-)数组赋值。如果你想避免单独的元素赋值,那么这些是你更好的选择:

  1. 在声明中使用真正的初始化器,而不是初始化代码:
    struct Vertex_t v_list[VERT_MAX] = {
    { .i = 0, .n = 1, .r = {0, 0, 0} },
    { .i = 1, .n = 1, .r = {1, 1, 0} },
    { .i = 2, .n = 1, .r = {0, 1, 1} },
    { .i = 3, .n = 1, .r = {1, 0, 1} }
    // other elements will be default-initialized
    };
    
  2. 从复合文字结构中赋值(里面的数组不会阻止这个):
    struct Vertex_t v_list[VERT_MAX];
    // Possibly this can be looped:
    v_list[0] = (struct Vertex_t) { .i = 0, .n = 1, .r = {0, 0, 0} };
    v_list[1] = (struct Vertex_t) { .i = 1, .n = 1, .r = {1, 1, 0} };
    v_list[2] = (struct Vertex_t) { .i = 2, .n = 1, .r = {0, 1, 1} };
    v_list[3] = (struct Vertex_t) { .i = 3, .n = 1, .r = {1, 0, 1} };
    // other elements of `v_list` are not initialized
    
  3. memcpy()来自复合字面值的数组成员:
    for (i = 0; i < 4; i++) {
    v_list[i].i=i;
    v_list[i].n=1;
    }
    memcpy(v_list[0].r, (int[]) {0, 0, 0}, sizeof(v_list[0].r));
    memcpy(v_list[1].r, (int[]) {1, 1, 0}, sizeof(v_list[1].r));
    memcpy(v_list[2].r, (int[]) {0, 1, 1}, sizeof(v_list[2].r));
    memcpy(v_list[3].r, (int[]) {1, 0, 1}, sizeof(v_list[3].r));
    
  4. 与(3)类似,但从const int的本地static数组中复制,而不是从复合文字中复制。

相关内容

  • 没有找到相关文章

最新更新