背景知识
我正在用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 ++,因为它已经与硬件合成,并且越简单越容易。
答案 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]);