簡體   English   中英

在不知道大小的情況下傳遞2D數組?

[英]Passing 2d arrays without knowing the size?

誰能幫我? 我想傳遞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);
}

您可以使用功能模板:

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的列數,而無需傳遞大小。

無法做到這一點。 在編譯時,函數

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

應該知道矩陣的維數(至少在列中)。

參見此處: 將未知大小的數組傳遞給函數


您可以使一維數組代表您的二維數組:

代替

array[ROW][COL];

采用

array[ROW*COL];

並且在訪問時:

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

采用:

a[r*ROW+c];

我也一直在為我的圖像文件處理動態數組大小,最后我只是使用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;

}

問題的根源是在標准C ++中不允許這樣做:

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

到目前為止,有些編譯器允許這種方式通過。 但是,當您嘗試使用firstMatrix時,您會遇到困難。 例如,您曾試圖將其傳遞給函數的問題。

實際上,在標准C ++中不允許這樣做的原因是,到目前為止,沒有人能提出一個遲早不會遇到困難的建議。

最好的做法是以與Standard 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]

這里最大的事情是初始化動態分配的二維數組。 我建議使用“向量”,但是我展示了一種指針方法。 無需將大小的設置值傳遞給函數。

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM