这似乎是一个简单的问题,但我无法理解它......
我想以最优雅的方式根据某些条件设置数组的元素。
这是我的非编译伪代码:
float*array=NULL;
switch(elements) {
case 1: array={1}; break;
case 2: array={7, 1}; break;
case 3: array={3, 2, -1}; break;
case 4: array={10, 20, 30, 40}; break;
default:break;
}
数组的大小是有限的,所以我可以做一些像'float array [16];'同样,但问题显然是案例陈述中的分配。
我真的不想做类似的事情:
case 2: array[0]=1; array[1]=2;
我当前(笨拙)的实现是:
#define ARRAYCOPY(dest, src) for(int i=0;i<sizeof(src)/sizeof(*src);i++)dest[i]=src[i]
// ...
case 2: do {float*vec={1, 2}; ARRAYCOPY(array, vec); } while(0); break;
我正在使用ARRAYCOPY定义,因为memcpy()似乎不起作用。至少在做
float*vec={1, 2}; memcpy(array, vec, sizeof(vec)/sizeof(*vec);
没有将任何值填充到数组中。
我想必须有一个更好的解决方案?
答案 0 :(得分:2)
memcpy
中有<string.h>
个功能,与您ARRAYCOPY
的功能类似。它会复制给定大小的内存块,在这种情况下,此大小是数组中元素的数量*数组中元素的大小。
http://www.cplusplus.com/reference/clibrary/cstring/memcpy/
memcpy(destination_array, source_array, number_of_elements * size_of_element);
所以,你有
// let's allocate exactly as much space as is needed
float* array = (float*)malloc(elements * sizeof(float));
// and now copy the elements we want
switch(elements) {
case 1: memcpy(array, (float[]){1}, 1 * sizeof(float)); break;
case 2: memcpy(array, (float[]){1, 2}, 2 * sizeof(float)); break;
case 3: memcpy(array, (float[]){1, 2, 3}, 3 * sizeof(float)); break;
case 4: memcpy(array, (float[]){10, 20, 30, 40}, 4 * sizeof(float)); break;
default:break;
}
答案 1 :(得分:1)
怎么样:
float *global[] = {
NULL,
(float[]){1},
(float[]){1, 2},
(float[]){7, 8, 9},
};
/* ... make sure `elements` is in range */
float *array = global[elements];
你显然可以继续使用开关:
switch(elements) {
case 1:
array = (float[]){1};
break;
}
答案 2 :(得分:0)
一些选项:
1)你可能想要使用的所有数组都在其他地方的堆栈上声明,并将指针“array”分配给你真正想要的那个。我认为这个过于复杂,但要让这些相当无意义的数组浮动。
2)为什么memcpy没有工作?只记得它用字节而不是数组元素来思考,所以如果目标更大,memcpy(target,source,sizeof(source))应该可以正常工作。我会用if(sizeof(target)&gt; sizeof(source)){handle error}这样包装:
case 3:
float temp[] = {1.0,2.0,3.0};
memcpy(array, temp, sizeof(temp));
确保分配内存(堆栈或堆)并跟踪数组的语义大小。