【问题标题】:how to code multi-dimensional array in a function prototype in c++如何在 C++ 中的函数原型中编写多维数组
【发布时间】:2014-06-20 14:31:07
【问题描述】:

当我创建一个像 value[][] 这样的多维数组并将其传递给函数时。但是我对如何为这个函数编写原型感到很困惑,因为有如下错误消息:

   error: declaration of 'value' as multidimensional array must have bounds for all dimensions except the first|


   //function prototype;
  void matrix(double s[],int j,int n,double value[][],double alpha[], double beta[], double gamma[]);
  //function
   void matrix(double s[],int j,int n,double value[][],double alpha[], double beta[],double gamma[]){...}

求助,如何正确写法?

【问题讨论】:

  • 错误相当明显。您必须为方法签名中的第一个维度以外的所有维度提供值。
  • ty,但是如果我不知道第二维的确切数字呢?比如说,int k;int j;双值[k][j];我需要将这个二维数组传递给一个函数,而 j 是由我事先不知道的专家给出的。

标签: c++ multidimensional-array prototype


【解决方案1】:

编译器已经告诉你了 错误:将“值”声明为多维数组必须对除第一个维度之外的所有维度都有边界|

你需要指定长度,例如:double s[3], double[3][3] etc.

【讨论】:

    【解决方案2】:

    编译器的错误信息非常有说服力。参数 double value[][] 需要更改为 double vale[][N] 其中 N 是整数。例子:

    double value[][20] // A matrix in which each row has 20 columns.
    double value[][10] // A matrix in which each row has 10 columns.
    

    【讨论】:

    • ty,但是如果我不知道第二维的确切数字呢?比如说,int k;int j;双值[k][j];我需要将这个二维数组传递给一个函数,而 j 是一个变量,可以由专家给出,我事先不知道。
    • @user3570984 如果用户传入这样的值,你不妨改用double **value
    【解决方案3】:

    上面的人已经给出了技术解释。

    背后的原因是 C 和 C++ 将数组视为内存块。当一个数组被传递给一个函数时,所发送的只是一个指向该数组的指针。这与将数组描述符发送到函数的 Ada、Pascal 和 Fortran 形成鲜明对比。

    您的声明必须提供足够的信息来处理仅传递一个指针的数组。这意味着需要除最后一个(第一个指定的)数组维度之外的所有维度。

    可变大小的多维数组通常是糟糕设计的标志。如果您有固定的数组大小(4x4 在 3D 变换中很常见),那么 2D 数组效果很好。对于像通用矩阵运算这样的东西,二维数组不能很好地工作。

    为此,您需要定义一个类: 1) 管理一维数组 2) 提供将二维引用转换为一维索引的机制。

    你会做类似的事情

    class Matrix 
    {
      unsigned int range1 ;
      unsigned int range2
      double *values ; // Could use a template
    
      double &valueAt (unsigned int x, unsigned int y) { return values [range1 * x + y] ; }
    } ;
    

    【讨论】:

    • ty,但是如果我不知道第二维的确切数字,那就说吧,int k;int j;双值[k][j];我需要将这个二维数组传递给一个函数,而 j 是一个可以由专家给出的变量,我事先不知道。那么,在这种情况下,我该如何编写这个函数数组参数?
    • 你不能真正做到你要求的直接。
    • 我可以写一个函数模板来指示第二个参数的任意数字吗?
    • 是的,先生。我得到了如下解决方案,并且有效!模板 void compare(string name, double value[][N]){ }
    猜你喜欢
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多