2014-03-03 31 views
0

任何人都可以幫助我嗎?我想通過firstMatrix,secondMatrix和finalMatrix。到目前爲止,我有這個。我可以讓它變成一個全局變量,但我仍然不會知道它的實際大小傳遞2d數組而不知道大小?

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); 
} 
+0

你正在得到什麼錯誤? – brokenfoot

+0

@brokenfoot使用未聲明的標識符'matrixSize',候選函數不可行:對於第一個參數沒有從'int [matrixSize] [matrixSize]'到'int *'的已知轉換 – user66167

+0

OK,使'matrixSize'成爲一個全局。 – brokenfoot

回答

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

這是無法完成的。在編譯時,函數

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]; 
0

最重要的事情在這裏被初始化動態分配的2-d陣列。我推薦使用「矢量」,但是我展示了一個指針方法。沒有必要將大小的設定值傳遞給函數。

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

} 
1

問題的根源在於,這不是在標準C++允許:

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

一些編譯器讓這個通,到目前爲止;然而,當你嘗試使用firstMatrix時,你會遇到困難。例如,您嘗試將它傳遞給函數的問題。

事實上,這在標準C++中是不允許的,因爲迄今爲止,沒有人能夠提出一個遲早不會遇到困難的提議。

最好的方法是以不同的方式聲明你的數組,以一種與標準C++兼容的方式。

在標準C++中,C風格的數組必須在編譯時已知它們的維數。因此您必須使用不同的容器。


的版本是寫看起來像最簡單的代碼:

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

它創建每個維度是matrixSize 2-d數組,然後你可以以同樣的方式訪問它,你將訪問一個C風格的數組。

重要的是,您可以將firstMatrix傳遞給一個函數,其方式與傳遞任何其他變量完全相同,並且其大小可以通過向量的成員函數(例如, firstMatrix.size()是行數,firstMatrix[0].size()是列數。


由於每行存儲在單獨的分配中,該版本在運行時效率稍低。爲了有一個連續的存儲,你可以這樣寫:

vector<int> firstMatrix(matrixSize * matrixSize); 

然後你模擬行和列的分配中,例如前面的代碼的firstMatrix[2][3]將在此解決方案是firstMatrix[2 * matrixSize + 3]