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

问题描述 投票:0回答:1

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

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] 保留了内存。

有人有办法得到我想要的东西吗?我需要一个数组中的大量结构,我想像初始化它们一样设置它们。

arrays c initialization structure
1个回答
0
投票

对于数组 r(在这里扮演 3D 矢量的角色),我必须设置 每个单独的(r[] 的每个值都必须手动设置....我 思考)。上面的作品,但我更愿意像

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

甚至

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

C 有数组 initialization 但没有(整个)数组 assignment。如果你想避免单独的元素分配,那么这些是你更好的选择:

  1. 在声明中使用 bona fide 初始化程序而不是初始化代码:
    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),但从
    static
    的本地
    const int
    数组复制,而不是从复合文字复制。
© www.soinside.com 2019 - 2024. All rights reserved.