2013-11-21 59 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