我有一个相当混乱的初始化结构数组的方法,我希望有人能帮我找到一个更紧凑的方法。我的结构是:
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[] 的每个值都必须手动设置....我 思考)。上面的作品,但我更愿意像
v_list[0].r[]={0,1,0};
甚至
v_list[i]={.i=i,.n=1, .r={0,1,0}};
C 有数组 initialization 但没有(整个)数组 assignment。如果你想避免单独的元素分配,那么这些是你更好的选择:
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));
static
的本地 const int
数组复制,而不是从复合文字复制。