背景阅读
我正在用 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];
如果可以简化问题,我对 bool 值 数组特别感兴趣。
我也可以为此使用 C++,但如果代码使用简单的数据类型和数组而不是 vector ,我会更喜欢,因为它正在被合成到硬件中,而且越简单就越容易。
最佳答案
您可以使用memcpy
复制多个数组元素:
memcpy(&data_out[index*WIDTH], &data_in[i*WIDTH], WIDTH*sizeof(*data_in));
第一个参数是目标内存地址,第二个是源地址,第三个是要复制的字节数。
请注意,您需要将元素数量乘以元素大小(以字节为单位)以获得总字节数。
关于c++ - 如何简洁地将一个数组的范围分配给另一个数组的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51499747/