将值设置为数组(post-init)

时间:2012-05-08 16:50:57

标签: c arrays variable-assignment

这似乎是一个简单的问题,但我无法理解它......

我想以最优雅的方式根据某些条件设置数组的元素。

这是我的非编译伪代码:

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);

没有将任何值填充到数组中。

我想必须有一个更好的解决方案?

3 个答案:

答案 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));

确保分配内存(堆栈或堆)并跟踪数组的语义大小。