gpt4 book ai didi

c - 一维数组作为二维数组传递给函数

转载 作者:行者123 更新时间:2023-11-30 20:25:03 25 4
gpt4 key购买 nike

我有一个一维数组 float64 arr[60]用于存储来自 DAQ 的电压值。该数组的填充方式如下:

10 SAMPLES_PER_CHANNEL, 6 CHANNELS, grouped by channel
transducer_0 transducer_1 ... transducer_6
[0, 1 ..., 9, 10, 11 ..., 19 ... 50, 51 ..., 59]

我想将此数据存储到一维指针数组中,并传递给定义为:bool func2(int samples, double* const* arr2) 的函数。

[channel 0]                 [channel 1]                       [channel 5]
{val 0, val 1 ...val 9}, {val 10, val 11 ...val 19}, ...

这些值正在〜5000Hz更新,因此我想知道最有效的方法是什么,这样我就不会复制任何数据。

由于 arr 中的数据存储在内存中,对于 1D 或 2D 数组来说,我可以只转换指针吗?

最佳答案

template<size_t stride, class T, size_t N, size_t count = N/stride>
std::array<T*, count> make_2d( T(&raw)[N] ) {
std::array<T*, count> retval;
for (size_t i = 0; i < count; ++i)
retval[i] = raw + i*stride;
return retval;
}

这将返回一个指向较低维度的指针的数组

要调用func2,只需执行以下操作:

func2( 10, make_2d<10>(arr).data() );

这假设样本数量是固定的,并且您需要一个指向每个样本的指针数组。

上面的代码没有动态分配。

请注意,arr 必须是 double arr[60] 类型才能使上述工作正常进行。 float64 希望是 double 的别名。如果 arr 是一个函数参数,即使它的数字是 60,它也不是真正的 double arr[60],而是“真的”一个双*

这可以通过一些创意选角来解决:

using parr_t = double(*)[60];
func2( 10, make_2d<10>(*(parr_t)(arr)).data() );

如果重复使用样本重新填充同一数组(位于内存中的同一位置),您可以执行 make_2d 调用一次,然后每次都使用它。

关于c - 一维数组作为二维数组传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30721425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com