2014-04-23 82 views
0

我要聲明爲以下代碼是從文本文件讀出的矩陣的函數。代碼可以在下面看到。C++函數上執行操作和聲明函數

if (infile == "A.txt") 
    { 
     ifstream myfile("A.txt"); 
    string line; 
    int MatA[3][3]; 
    int i=0; 
    while (getline (myfile, line)) 
    { 
     stringstream ss(line); 
     for(int j=0; j<3; j++) 
      ss >> MatA[i][j]; // load the i-th line in the j-th row of mat 
     i++; 
    } 
    // display the loaded matrix          
     for(int i=0; i<3; i++) 
      { 
       for(int j=0; j<3; j++) 
      cout<<MatA[i][j]<<" "; 
      cout<<endl; 
      } 

     } 

現在我所試圖做的就是聲明這個矩陣的功能,所以當我在後面的代碼執行操作我就可以調用該函數,而不是重新寫整個矩陣。但是我很難做到這一點,我已經做出的將矩陣作爲函數聲明的嘗試可以在下面看到。

int display (int MatA) 
{ 
    for(int i=0; i<3; i++) 
    { 
     for(int j=0; j<3; j++) 
      cout<<MatA[i][j]<<" "; 
     cout<<endl; 
    } 
} 

但是,出現錯誤說[i]'表達式必須有一個指向對象類型的指針'。

如果有人能幫助那簡直太好了!

+0

您正在傳遞一個'int',而對於二維陣列應該能夠傳送一個'INT **' – SingerOfTheFall

回答

1

例如,該功能可以被定義如下方式

const size_t N = 3; 

void display(const int (&MatA)[N][N]) 
{ 
    for (size_t i = 0; i < N; i++) 
    { 
     for (size_t j = 0; j < N; j++) std::cout << MatA[i][j] << " "; 
     std::cout << std::endl; 
    } 
} 

另一種方法是下面

const size_t N = 3; 

void display(const int (*MatA)[N], size_t n) 
{ 
    for (size_t i = 0; i < n; i++) 
    { 
     for (size_t j = 0; j < N; j++) std::cout << MatA[i][j] << " "; 
     std::cout << std::endl; 
    } 
} 

的功能可以被稱爲

#include <iostream> 

const size_t N = 3; 

// the function definitions 

int main() 
{ 
    int a[N][N] = {}; 
    // some code to fill the matrix 

    display(a); 
    display(a, N); 
} 

,最後你可以用的帖子評論中建議的方法@boycy雖然至於我,我不喜歡這種做法。 例如

#include <iostream> 

const size_t N = 3; 

void display(const int **MatA, size_t m, size_t n) 
{ 
    for (size_t i = 0; i < m * n; i++) 
    { 
     std::cout << MatA[i] << " "; 
     if ((i + 1) % n == 0) std::cout << std::endl; 
    } 
} 

int main() 
{ 
    int a[N][N] = {}; 
    // some code to fill the matrix 

    display(reinterpret_cast<const int **>(a), N, N); 
} 
+0

兩種這些實現的並不如通用,因爲他們可以/應當[按理說]是;第一個迫使矩陣是一個平方NxN,而第二個迫使它是nxN。 @SingerOfTheFall建議將矩陣作爲int **傳遞是最靈活的(也是最常用的)方法。因此 函數簽名將'空隙顯示器(const int的** MATA,爲size_t米,爲size_t n)的'和訪問'MATA [i] [j]''用於在i''[0,M)'和' '[0,n]中的j'將按照需要工作。 – boycy

+0

@boycy在這種情況下,您可能不會將二維數組傳遞給此函數而不更改函數的主體。作者沒有詢問通用函數的定義。如果在使用模板函數或容器時需要通用方法。 –

+0

我的歉意,你當然是對的。直到我已經忘記了多維數組如何不愉快的是C++ :-) 這是值得的注意,模板上的陣列尺寸的功能將正常工作,但因爲模板是爲每一個獨特的(M,N)實例化一次配對,它可能會導致到臃腫的二進制文件。 – boycy

0

你傳遞一個int MatA到顯示器,但你要int[][]作爲參數。然而,這不起作用。所以你必須通過int**並對其執行指針算術,否則你將不得不爲這個矩陣創建一個更好的訪問器。

我建議考慮看看像OpenCV Mat類型,解決您的問題類似的實現。