0

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

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

这是我的非编译伪代码:

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

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

我想一定有更好的解决方案?

4

3 回答 3

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;
}
于 2012-05-08T17:02:24.200 回答
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;
}
于 2012-05-08T16:56:53.267 回答
0

一些选项:

1)您可能想要使用的所有这些数组在其他地方的堆栈上声明,并将指针“数组”分配给您实际想要的任何一个。我认为这太复杂了,尽管让这些毫无意义的数组四处飘荡。

2) 为什么 memcpy 不起作用?请记住,它考虑的是字节而不是数组元素,因此如果目标更大, memcpy(target, source, sizeof(source)) 应该可以正常工作。我会用 if(sizeof(target) > sizeof(source)) { handle error } 这样包装:

case 3:
float temp[] = {1.0,2.0,3.0};
memcpy(array, temp, sizeof(temp));

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

于 2012-05-08T17:09:14.620 回答