2015-06-09 75 views
-2

我有一个数组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中的数据存储在内存中,对于一维或二维数组,我能够只投射指针吗?

+0

你不能使用矢量?更容易操作...只需编写一个结构,如'struct Data {const char * channel; double val};'并将其添加到向量中,并在需要时拔出所需的通道数据。 – macroland

+1

您可以投射指针......但是,首先可能更容易声明2D数组('float64 arr [6] [10]'而不是'float64 arr [60]')。 – Dmitri

+1

问题是回调函数填充一维数组,我无权修改该函数。 –

回答

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],而是“真的”一个double*

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

如果同一阵列(在内存中的相同位置)正在与反复样品重新填充,你可以做make_2d调用一次:

这可以与周围有点创意铸造来得到并每次使用它。

+0

模板变量大小错字3。也许应该是N? –

+0

@MattStokes是的。修正并改进了:'count'计算现在已移至'template'参数。 – Yakk

+0

如果我想以相反的顺序访问 - 相同的频道顺序,但数值相反,那么怎么办?例如。 [channel0] {val 9,val 8,val 7 ...}? –