我有一个1D数组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数组是相同的,我能够只是转换指针吗?
答案 0 :(得分:1)
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;
}
这将返回指向较低维度的array
指针
要致电func2
,只需执行以下操作:
func2( 10, make_2d<10>(arr).data() );
这假设样本数是固定的,并且您需要一个指向每个样本的指针数组。
以上是没有动态分配的。
请注意,arr
必须是double arr[60]
类型才能使上述工作正常。 float64
有望成为double
的别名。如果arr
是一个函数参数,即使它具有数字60
,它也不是double arr[60]
,但是&#34;真的是&#34; double*
。
这可以通过一些创意铸造来解决:
using parr_t = double(*)[60];
func2( 10, make_2d<10>(*(parr_t)(arr)).data() );
如果重复使用样本重新填充相同的数组(在内存中的相同位置),您可以执行一次make_2d
调用,并且每次都使用它。