我有一个相当混乱的方法来初始化结构数组,我希望有人能帮我找到一个更紧凑的方法。我的结构是:
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有数组初始化,但没有(整-)数组赋值。如果你想避免单独的元素赋值,那么这些是你更好的选择:
- 在声明中使用真正的初始化器,而不是初始化代码:
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 };
- 从复合文字结构中赋值(里面的数组不会阻止这个):
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
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));
- 与(3)类似,但从
const int
的本地static
数组中复制,而不是从复合文字中复制。