繁体   English   中英

如何将未知大小的二维数组传递给函数

[英]How to pass two dimensional array of an unknown size to a function

我想创建类库,一个函数,其参数是一个未知大小的矩阵,用户将创建自己的矩阵,并使用自己的大小并将其传递给此函数,对其矩阵进行如下操作,将是功能

calculateDeterminantOfTheMatrix( int matrix[][])
{
   some Operations to do on matrix 
}

C和C ++的内置组件不能很好地支持多维数组。 只有在编译时知道N-1维度时,才能传递N维数组:

calculateDeterminantOfTheMatrix( int matrix[][123])

但是,标准库提供了std::vector容器,它非常适用于多维数组:在您的情况下,传递vector<vector<int> > &matrix将是在C ++中处理任务的正确方法。

int calculateDeterminantOfTheMatrix(vector<vector<int> > &matrix) {
    int res = 0;
    for (int i = 0 ; i != matrix.size() ; i++)
        for(int j = 0 ; j != matrix[i].size() ; j++)
            res += matrix[i][j];
    return res;
}

作为额外的好处,您不需要将矩阵的维度传递给函数: matrix.size()表示第一维, matrix[0].size()表示第二维。

C解决方案:

在C中,当作为函数参数传递时,不能省略数组大小(除了最左边)。

你可以写:int a []

但不能:int a [] []

仅举例:int a [] [20]

此约束在此处,因为编译器需要确定用于访问数组元素的正确偏移量。 但是,你可以这样做:

void print_arbitrary_2D_array(void *arr, int y, int x)
{
    /* cast to 2D array type */
    double (*p_arr)[y][x] = (double (*)[y][x]) arr;

    int i, j;

    for (i = 0; i < y; ++i) {
        for (j = 0; j < x; ++j)
            printf(" %lf", (*p_arr)[i][j]);
        putchar('\n');
    }
}

double arr_1[4][3] = {
    { 3.3, 5.8, 2.3 },
    { 9.1, 3.2, 6.1 },
    { 1.2, 7.9, 9.4 },
    { 0.2, 9.5, 2.4 }
};
double arr_2[2][5] = {
    { 3.6, 1.4, 6.7, 0.1, 4.2 },
    { 8.4, 2.3, 5.9, 1.4, 8.3 }
};

print_arbitrary_2D_array(arr_1, 4, 3);
putchar('\n');
print_arbitrary_2D_array(arr_2, 2, 5);

您可以采取多种方法。

  1. 做事的方式 - >传递int**但在这里要非常谨慎。 这不是一个二维数组。 您必须正确地为此指针分配内存,或者,您需要在编译时知道大小。 (例如,静态分配大小为M * N的数组,然后禁止任何更大的数组)。 为了动态分配内存,您需要知道行数和列数。

  2. C ++方法 - > #include <vector>之后你可以简单地使用vector<vector<int> > &matrix (小心<int>之后的空格,除非你使用c ++ 11编译器。),这将分配一个int矢量的矢量,基本上是一个二维数组。 在这种情况下,将为您处理内存管理。

我会为矩阵编写一个简单的类包装器,其中定义了列和行。

template <typename T>
class Mat {
  std::size_t _row;
  std::size_t _col;

  T *_mat_elem;
public:
  Mat(std::size_t r, std::size_t c)
   :  _row(r), _col(c), _mat_elem(new T[r*c] {}
  ~Mat() {/* remember to do delete [] here */}

  // element access, for example
  T& at(std::size_t r, std::size_t c)
  {
    return *(_mat_elem+r*_col+c);
  }
};

但实际上你正在重新发明轮子。 那里有很好的矩阵处理库。

使用此方法声明一个指针数组ex: int *a[n]; 然后使用for循环ex为它们分配内存:

for( int i=0 ; i<n ; i++ )
        a[i] = new int[n];

现在像普通数组一样传递参数。 例如:print_array(a,n); 而且print_array函数看起来像

print_array(int **a,int n)//the prototype for the print_array
{
 //access the array using index such as
std:: cout<<a[1][1]<<endl;
}

上面的例子是针对nxn的数组,需要mxn然后分配内存就好了

for( int i=0 ; i<m ; i++ )
        a[i] = new int[n];

然后将m,n传递给函数并访问for循环中的数组。

在我到目前为止找到的函数中使用2D数组的最佳方法是使用Mapping Function。 如下例所示,我使用映射函数来打印2D数组

void Print2D(int x[],int ROWS,int COLS)
{
    for(int i=0;i<ROWS;i++)
{
    for(int j=0;j<COLS;j++)
    cout << x[i*COLS+j] << ' ';
    cout << endl;

}
}

这是如何在main中使用它

int main(){

    int x[3][3];
    Print2D(&x[0],3,3);

}

这里&x [0]是2D阵列的第一行的起始地址,或者更准确地说是2D阵列的起始地址

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM