无法将double [] []转换为double**

sna*_*ken 4 c++ double

我有一个功能,需要3个参数,第一个是**双.

 normalizeDataZeroMeanUnitSD(double ** trainingActions, int numberOfTrainingActions, int descriptorDimension)
Run Code Online (Sandbox Code Playgroud)

当我从main调用它时,我正在尝试使用normalizeDataZeroMeanUnitSD(data,68​​1,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)

有没有办法使用**数据做同样的事情?

ten*_*our 6

错误很明显:数据类型double [681][24]不一样double **.虽然它double[681]可以衰减到指向其第一个元素的指针(因此double*),但这并不意味着它double[681][24]可以衰减double**.

以这种方式思考:double**暗示指向许多指针的指针.但double[][]它没有任何指针.充其量,任何维度的数组仍然只有一个指针:到其连续存储的开头.


Rik*_*yay 3

使用以下任何声明。两者是等价的。

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它是一个指针而不是一个二维数组。