在不知道大小的情况下传递2d数组?

时间:2014-03-03 02:13:24

标签: c++ multidimensional-array

任何人都可以帮助我吗?我想通过firstMatrix,secondMatrix和finalMatrix。到目前为止,我有这个。我可以把它变成一个全局变量,但我仍然不知道实际的大小

int matrixSummation(int firstMatrix[][matrixSize],int secondMatrix[][matrixSize], int finalMatrix[][matrixSize], int matrixSize){
for(int row=0; row< matrixSize; row++){
    for(int col=0; col< matrixSize; col++){
        finalMatrix[row][col]=firstMatrix[row][col]+secondMatrix[row][col];
    }
}
}
  int main(int argc, char** argv) {


int matrixSize;

cout << "Enter size of your matrices: " <<endl;
cin >> matrixSize;

int firstMatrix[matrixSize][matrixSize];
int secondMatrix[matrixSize][matrixSize];
int finalMatrix[matrixSize][matrixSize];

cout <<"Enter numbers for the 1st matrix: "<<endl;
for(int row = 0; row < matrixSize; row++){
    for(int col=0; col< matrixSize; col++){
        cin >> firstMatrix[row][col];
    }
}

cout <<"Enter your numbers for the 2nd matrix: "<<endl;
for(int row = 0; row < matrixSize; row++){
    for(int col=0; col< matrixSize; col++){
        cin >> secondMatrix[row][col];
    }
}
matrixSummation(firstMatrix,secondMatrix,finalMatrix,matrixSize);
}

5 个答案:

答案 0 :(得分:1)

您可以使用功能模板:

template<std::size_t A, std::size_t B>
int matrixSummation(int (&firstMatrix)[A][B], int (&secondMatrix)[A][B], int (&finalMatrix)[A][B])

因此,在您的功能中,您可以访问A的行数和B的列数,而不会传递大小。

答案 1 :(得分:1)

这无法完成。在编译时,函数

int matrixSummation(int firstMatrix[][matrixSize],int secondMatrix[][matrixSize], int finalMatrix[][matrixSize], int matrixSize){

应该知道矩阵的尺寸(至少是列)。

见这里:Passing array with unknown size to function


您可以使一维数组代表您的二维数组:

而不是

array[ROW][COL];

使用

array[ROW*COL];

访问时:

a[r][c]; //r<5,c<5

使用:

a[r*ROW+c];

答案 2 :(得分:1)

我一直在研究我的图像文件的动态数组大小,最后我只是使用int **传递数组。

#include <iostream>

using namespace std;

void printMatrix(int** val, int row, int col)
{
    int new_val[row][col];
    int i, j;
    for(i = 0; i < row; i++)
    {
        for(j = 0; j < col; j++)
        {
            new_val[i][j] = val[i][j];
            cout<<new_val[i][j]<<" ";
        }cout<<endl;
    }
    cout<<"test!"<<endl;
}

int main ()
{
    int i, j, k;
    int row, col;
    row = 3;
    col = 5;
    int** array = new int*[row];
    for(int i = 0; i < row; ++i)
    {
        array[i] = new int[col];
    }
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            array[i][j] = k;
            k++;
            cout << array[i][j]<< " ";
        }
        cout<<endl;
    }
    cout<<endl;
    printMatrix(array, row, col);

    return 0;

}

答案 3 :(得分:1)

问题的根源是标准C ++中不允许这样做:

cin >> matrixSize;
int firstMatrix[matrixSize][matrixSize];

到目前为止,有些编译器让这个通过了。但是在尝试使用firstMatrix时遇到困难。例如,您尝试将其传递给函数的问题。

事实上,标准C ++中不允许这样做的原因是到目前为止还没有人能够提出一个迟早不会遇到困难的提案。

最好的做法是以与标准C ++兼容的方式声明您的数组。

在标准C ++中,C风格的数组必须在编译时知道它们的维度。因此,您必须使用其他容器。

最简单的代码编写方式如下:

vector< vector<int> > firstMatrix(matrixSize, vector<int>(matrixSize));

创建一个二维数组,每个维度为matrixSize,然后您可以像访问C风格数组一样访问它。

重要的是,您可以将firstMatrix传递给函数的方式与传递任何其他变量的方式完全相同,并且可以通过向量的成员函数访问其大小,例如: firstMatrix.size()是行数,firstMatrix[0].size()是列数。

由于每行存储在单独的分配中,因此该版本在运行时的效率稍差。要拥有连续存储,您可以写:

vector<int> firstMatrix(matrixSize * matrixSize);

然后您模拟该分配中的行和列,例如此解决方案中的前一代码firstMatrix[2][3]将为firstMatrix[2 * matrixSize + 3]

答案 4 :(得分:0)

这里最重要的是初始化动态分配的二维数组。我建议使用“向量”,但我会显示指针方法。无需将大小的设定值传递给函数。

int[][] matrixSummation(int firstMatrix[][],int secondMatrix[][]){
    if(firstMatrix.length != secondMatrix.length 
          || firstMatrix[].length !=secondMatrix[].length)
          return NULL;

    int **finalMatrix;
    finalMatrix= new int*[firstMatrix.length]; 

    for (int i = 0; i < 10; ++i) {
        finalMatrix[i] = new int[firstMatrix.length]; 
        //make sure you initialize each int[]__ with proper length.
    }

    for(int row=0; row< matrixSize; row++){
        for(int col=0; col< matrixSize; col++){
            finalMatrix[row][col]=firstMatrix[row][col]+secondMatrix[row][col];
        }
    }
    return finalMatrix;
}