我在C ++多维数组指针地狱中。我有一个函数,它指向两个多维数组的两个指针。该函数将输入数组转换为输出数组。
void transpose(float * in, float * out) throw() {
size_t numvars = dataset.getVariables().size()
size_t numsegs = dataset.getSegments().size();
...
我无法为输出数组动态分配缓冲区。我认为以下内容可行,因为数组会自动衰减为指针:
size_t numvars = dataset.getVariables().size()
size_t numsegs = dataset.getSegments().size();
float tData[numvars][numsegs];
transpose(data, tData);
但我收到错误:
参数2的已知转换来自'float [(((sizetype)(((ssizetype)numvars)+ -1))+ 1)] [(((sizetype)(((ssizetype)numsegs)+ -1 ))+ 1)]'到'浮动*'
那为什么会失败呢?什么是动态分配二维数组大小的正确/最佳方法,以便transpose
函数可以做到这一点?
答案 0 :(得分:2)
void transpose(float * in, float * out)
...
float tData[numvars][numsegs];
transpose(data, tData);
tData
的类型为float[numvars][numsegs]
,只能衰减到float (*)[numsegs]
如果out
需要此2D数组中第一个元素的地址,那么您可以执行以下操作:
transpose(data, &tData[0][0]);
即:
void foo(float* pF){}
int main()
{
float f, arr[10], arr2d[5][7];
foo(&f); // perfectly straightforward
foo(arr); // float[10] decays to float*
foo(arr2d[0]); // float[7] decays to float*
foo(&arr2d[0][0]); // perfectly straightforward
foo(arr2d); // float[5][7] decays to float (*) [7] ~> float* ???
// ERROR: can't convert decayed float (*) [7] to float *
}
另请注意,float tData[numvars][numsegs];
不会“动态分配”数组。它是一个具有自动存储持续时间的可变长度数组(a.k.a.VLA)。
但是,您可以考虑使用std::vector
而不是基于指针的C风格方法:
typedef std::vector<std::vector<float> > FloatMatrix;
void transpose(const FloatMatrix& in, FloatMatrix& out);
...
FloatMatrix data;
...
FloatMatrix fm = FloatMatrix(numvars, std::vector<float>(numsegs));
transpose(data, fm);