2013-11-21 391 views
0

我努力使工作在二維數組的一些功能:使用二維數組作爲參數

void display_matrix(int**, int, int); 
void gen_matrix(int**, int, int); 

int main() 
{ 
    srand(time(0)); 
    int m=5, n=3; 

    int my_matrix[m][n]; 
    gen_matrix(my_matrix, m, n); 
    display_matrix(my_matrix, m, n); 
} 

我不知道什麼是錯呢,但我得到以下錯誤,當我調用的函數: [Error]無法將參數'1'的int()[(((sizetype)(((ssizetype)n)+ -1))+ 1)]''int' *'轉換爲void void gen_matrix(int **,int,int)'

我知道我可以使用矢量,但我正在嘗試練習並記住使用指針和數組。

+0

您也可以考慮使用尺寸爲整型參數的模板類。 – Pete

+1

'int **'不是一個二維數組。所以,這是你的問題。 – AnT

+0

「我試圖練習和記住指針和數組的使用」然後,編寫代碼的方式應該將它編譯爲C,因爲至少通過C++ 11,語言不像您那樣支持可變長度數組'在main()中使用。一些供應商通過擴展支持它,但它不是標準的一部分。如果你在'main'中使用它們,你有什麼理由決定*不*在你的參數列表中使用它們? – WhozCraig

回答

1

聲明形式<type> <name>[<dim1>][<dim2>]矩陣定義的內存塊暗含着dim1的大步。通過使用dim1的倍數來訪問內部元素,以達到正確的行,並通過第二維來抵消。

類型<type> <name>**是指向指針數組的指針 - 非常不同。該結構由指向數據行的指針數組組成。在調用子程序之前,必須正確分配和鏈接這些參數。也沒有要求它們連續分配,並且需要對每個新行上的每個元素進行間接查找。

優點是行可以是不同的長度,適合一些不具有矩形結構的算法。

+0

所以我應該只聲明my_matrix爲一個int **,分配它,然後所有的行? int ** my_matrix =(int **)malloc(n * sizeof(int *));對於(int i = 0; i kpagcha

+0

就是這樣。然後您可以保留原始功能簽名。 – Pekka

0

更改代碼如下方式

const int n = 3; 

void display_matrix(int (*)[n], int); 
void gen_matrix(int (*)[n], int); 

int main() 
{ 
    srand(time(0)); 
    const int m = 5; 

    int my_matrix[m][n]; 
    gen_matrix(my_matrix, m); 
    display_matrix(my_matrix, m); 
} 

或者你可以讓你的功能定義,但稱它們例如作爲

gen_matrix(reinterpret_cast<int **>(my_matrix), m, n); 
+0

爲什麼n必須保持不變?我無法如我所願在主要功能中設定其價值。 – kpagcha

+0

因爲它必須是類型的一部分。二維數組NxM只是一個包含N * M個元素(逐行)的一維數組,但它有特殊的類型,指向編譯器允許雙重索引。編譯器應該知道除了第一個元素之外,有多少元素可以正確計算偏移量。 – yeputons

+0

您可以嘗試使用C11標準或單獨傳遞數組及其維數,然後將其轉換爲函數內的相應類型。這可以幫助超越極限。你也可以自己做索引。 – yeputons