我有一个功能,需要3个参数,第一个是**双.
normalizeDataZeroMeanUnitSD(double ** trainingActions, int numberOfTrainingActions, int descriptorDimension)
Run Code Online (Sandbox Code Playgroud)
当我从main调用它时,我正在尝试使用normalizeDataZeroMeanUnitSD(data,681,24); 但是,我收到了
cannot convert parameter 1 from 'double [681][24]' to 'double **'
Run Code Online (Sandbox Code Playgroud)
这是我构建数据数组的方式:
fstream infile;
infile.open("gabor\\Data.txt");
double data[681][24];
while (!infile.eof())
{
for(int j=0;j<681;j++)
{
for(int k=0; k<24;k++)
{
infile >> data[j][k];
}
}
}
infile.close();
Run Code Online (Sandbox Code Playgroud)
有没有办法使用**数据做同样的事情?
错误很明显:数据类型double [681][24]不一样double **.虽然它double[681]可以衰减到指向其第一个元素的指针(因此double*),但这并不意味着它double[681][24]可以衰减double**.
以这种方式思考:double**暗示指向许多指针的指针.但double[][]它没有任何指针.充其量,任何维度的数组仍然只有一个指针:到其连续存储的开头.
使用以下任何声明。两者是等价的。
NormalizeDataZeroMeanUnitSD(double trainingActions[][24], int numberOfTrainingActions, int descriptorDimension)
NormalizeDataZeroMeanUnitSD(double trainingActions[681][24], int numberOfTrainingActions, int descriptorDimension)
Run Code Online (Sandbox Code Playgroud)
当您声明一个二维数组时,它会占用连续的内存位置。因此,您至少需要指定列数(在行主架构的情况下)。
有关行主和列主的定义,请查看此。
对于您编辑的问题,是的,您可以声明使用**data. 动态分配data数组。但请记住在使用完毕后将其释放。
double **data=new double*[681];
for (int i=0;i<681;i++)
{
data[i]=new double[24];
}
//do what you want to do
for (int i=0;i<681;i++)
{
delete [] data[i];
}
delete [] data;
Run Code Online (Sandbox Code Playgroud)
现在你的函数原型可以像这样,void func(double **pp)因为data它是一个指针而不是一个二维数组。