3

我正在尝试使此代码正常工作:

 #include <iostream>

void reset_2D_dbl_array(double **p, int nrows, int ncols);

int main(){
    double big_matrix[10][10];
    reset_2D_dbl_array(big_matrix,10,10);
    std::cout << big_matrix[0][0];
    std::cin.ignore();
    return 0;
}
void reset_2D_dbl_array(double **p, int nrows, int ncols){
  int n = nrows * ncols;
  while(n-- > 0){
    **p++ = 0.0;
  }
} 

我不明白为什么它不起作用。

我从新书“不耐烦的 C++”中获取了代码,但它仍然无法正常工作..

在更改没有索引和方括号的值时,我想在函数中使用两个“at”符号。

编辑:请查看我的第二条评论以获取更多信息,谢谢:)

EDIT2:粘贴了错误的代码:)

4

5 回答 5

4

因为双指针不会衰减为双数组。只需将双精度数组传递给您的函数:

void reset_double_array(double p[][10], int nrows, int ncols);

有关为什么会这样的解释,请参阅此问题及其答案

看到你已经标记了你的问题 C++,你真的应该用它std::vector<std::vector<double>>来表示你的矩阵,并为自己省去指针和原始数组的麻烦。

于 2013-08-06T12:40:07.443 回答
2

您需要将其作为double数组传递

void reset_double_array(double p[][10], int nrows, int ncols){
   for(int i=0;i<nrows;i++)
     for(int j=0;j<ncols;j++)
        p[i][j]=1.0;
}

并修复:

std::cout << big_matrix[9][9]; //instead of std::cout << big_matrix[9];
于 2013-08-06T12:46:18.777 回答
0

std::cout << big_matrix[9]; 将双精度数组发送到标准输出,因此它将打印数组地址(指针编号)

于 2013-08-06T12:42:53.047 回答
0

目前尚不清楚您要在这里做什么。看起来好像您正在尝试设置每行中的第一个双精度。在这种情况下,以下应该起作用:

void reset_double_array(double **p, int nrows, int ncols)
{
    double* val = *p;
    while(nrows-- > 0)
    {
        *val = 1.0;
        val += ncols;
    }
}
于 2013-08-06T12:44:13.990 回答
0

您可以使用指针执行此操作,如下所示:

void reset_2D_dbl_array(double *p, int nrows, int ncols) { .... }

然后,当您传递实际的二维数组时:

reset_2D_dbl_array(&big_matrix[0][0],10,10);

或者

reset_2D_dbl_array(big_matrix[0],10,10);

于 2014-11-29T20:46:54.870 回答