如何简洁地将一个数组的范围分配给另一个数组的范围?
Posted
技术标签:
【中文标题】如何简洁地将一个数组的范围分配给另一个数组的范围?【英文标题】:How to succinctly assign a range of one array to a range of another array? 【发布时间】:2018-07-24 13:22:17 【问题描述】:背景阅读
我正在用 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];
我们说的是,将从位置 i*WIDTH
到 i*WIDTH + WIDTH - 1
的 data_in
部分分配给从位置 index*WIDTH
到 index*WIDTH + WIDTH - 1
的 data_out
部分。
同样,在 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++,但如果代码使用简单的数据类型和数组而不是向量,我会更喜欢,因为它会被综合到硬件上,而且越简单就越容易。
【问题讨论】:
“分配”数组的唯一方法是memcpy
(或循环)。
您想要 C(dbushs 答案)还是 C++(Igors 答案)方式?
使用 Verilog,您可以使用硬件,使用编程语言,您可以使用 CPU,而 CPU 通常没有指令来执行此类位操作(通常没有必要)。将逻辑从 Verilog 一个一个迁移到 C 可能不是一个好主意。
@hellow 他两个都有了 :)
除了@Slava 所说的 - 用 C 重写 Verilog 代码的目的可能是什么(除非它是 SystemC)?
【参考方案1】:
您可以使用memcpy
复制多个数组元素:
memcpy(&data_out[index*WIDTH], &data_in[i*WIDTH], WIDTH*sizeof(*data_in));
第一个参数是目标内存地址,第二个是源地址,第三个是要复制的字节数。
请注意,您需要将元素的数量乘以元素的大小(以字节为单位)才能得到总字节数。
【讨论】:
请注意,在 C++ 中,如果数组元素的类型不是可简单复制的,这将不起作用。当然,在 C 中,一切都可以轻松复制。【参考方案2】:类似的东西:
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]);
【讨论】:
这是 C++ 的首选答案。但它不适用于C。以上是关于如何简洁地将一个数组的范围分配给另一个数组的范围?的主要内容,如果未能解决你的问题,请参考以下文章
如何将一个对象数组的一个属性的值分配给另一个对象数组的同名属性? - Javascript
如何一次循环遍历 2 个数组并将数组中的颜色分配给另一个数组的每个值