如何简洁地将一个数组的范围分配给另一个数组的范围?

时间:2018-07-24 13:22:17

标签: c++ c arrays

背景知识

我正在用C / C ++重写一些Verilog代码,在Verilog中,您可以执行以下操作:

for (i = 0; i < N; i = i + 1) begin
     if (condition(i)) begin
          data_out[index*WIDTH +: WIDTH] = data_in[i*WIDTH +: WIDTH];
          index = index + 1;
     end
end

此行的位置:

data_out[index*WIDTH +: WIDTH] = data_in[i*WIDTH +: WIDTH];

我们要说的是将data_in的从位置i*WIDTH开始直到i*WIDTH + WIDTH - 1的部分分配给data_out的从位置index*WIDTH开始直到直到index*WIDTH + WIDTH - 1

类似地,在Python中,我可以做这样的事情:

>>> arr1 = ['a', 'b', 'c', 'd']
>>> arr2 = [1, 2, 3, 4, 5]
>>> 
>>> arr1[1:3] = arr2[0:2]
>>> 
>>> print arr1, arr2
['a', 1, 2, 'd'] [1, 2, 3, 4, 5]       

我知道我可以使用一个额外的循环用C编写此代码:

for (i = 0; i < N; i = i + 1) {
      if (condition(i)) {
           for (k = 0; k < WIDTH; k = k + 1) {
               data_out[index*WIDTH + k] = data_in[i*WIDTH + k];
           }
           index = index + 1;
      }
 }

但是,当这些分配非常频繁且嵌套循环进行时,这有点乏味。我希望有一种更聪明的方法。

问题

有一种简洁的书写方式吗?

arr1[INDEX_A to INDEX_B] = arr2[INDEX_C to INDEX_D];

arr1[STARTING_POSITION_A to SOME_WIDTH] = arr2[STARTING_POSITION_B to SOME_WIDTH];

如果这简化了问题,我特别对 booleans 数组感兴趣。

我也可以使用C ++,但是如果代码使用简单的数据类型和数组而不是向量,则更喜欢使用C ++,因为它已经与硬件合成,并且越简单越容易。

2 个答案:

答案 0 :(得分:6)

您可以使用memcpy复制多个数组元素:

memcpy(&data_out[index*WIDTH], &data_in[i*WIDTH], WIDTH*sizeof(*data_in));

第一个参数是目标内存地址,第二个参数是源地址,第三个参数是要复制的字节数。

请注意,您需要将元素数量乘以元素大小(以字节为单位)才能获得总字节数。

答案 1 :(得分:4)

遵循以下原则:

std::copy(data_in + i*WIDTH, data_in + (i+1)*WIDTH, data_out + index*WIDTH);

或等效地

std::copy(&data_in[i*WIDTH], &data_in[i*WIDTH]+WIDTH, &data_out[index*WIDTH]);