我在SO上看过很多关于这种类型的问题,但没有什么真正有用。我是C ++的新手。
#include<iostream>
using namespace std;
int func(int i,int j,int r,int c,int **A)
{
//do something
}
int main(void)
{
int r,c;
cin>>r>>c;
int A[r][c];
//read array
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
cin>>A[i][j];
}
}
if(func(0,0,r,c,A)){
cout<<1<<endl;
}
else{
cout<<0<<endl;
}
}
这会产生以下错误
错误:无法将参数'5'的'int(*)[c]'转换为'int **'为'int func(int,int,int,int,int **)' 如果(FUNC(0,0,R,C,A)){
答案 0 :(得分:2)
不使用其他模板库的最简单方法是指向指针。
int **A;
A = new int *[r];
for(int i = 0; i <r; i++)
array[i] = new int[c];
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
cin>>A[i][j];
}
}
if(func(0,0,r,c,A)){
cout<<1<<endl;
} else {
cout<<0<<endl;
}
答案 1 :(得分:1)
对于初学者,可变长度数组不是标准的C ++特性。它可以是其他编译器无法支持的编译器的语言扩展。
因此,使用标准容器std::vector
而不是可变长度数组。
要解决使用数组的问题,可以定义模板函数。例如
template <size_t M, size_t N>
int func( int i, int j, int ( &a )[M][N] )
{
//do something
}
如果要使用支持VLA的编译器,那么至少该函数可能看起来像
int func(int i,int j,int r,int c, int A[r][c] )
{
//do something
}
答案 2 :(得分:0)
老式的方法是将数组分配为一维数组,然后将其索引为2d数组:
int * my_array = new int[m * n];
接下来,传递给一个函数,你可以通过指针传递给第一个元素,然后传递行和列的容量:
void Process_Array(int * array, size_t max_rows, size_t max_columns);
//...
Process_Array(my_array, m, n);
索引可以计算为:
size_t array_index = row * n + column;
答案 3 :(得分:0)
这不是一个直接的答案,因为其他人已经提出了实际的解决方案,但更多地解释了为什么它如此复杂以及什么是动态多维数组的惯用C ++替代方案。
C ++研究员表示原始数组管理不适用于普通程序员,但应保留给库实现者。出于这个原因,没有做任何事情来轻松地将多维数组及其大小传递给函数,而它曾经在80年代的Fortran IV中很常见。
C ++的方式是(从简单到更难):
vector<vector<int>>
矢量可以像动态大小数组一样使用,因此如果不需要连续分配,矢量可以像2D数组一样使用围绕一个大小为r * c的连续1D数组实现一个包装类,该数组通过返回引用的函数提供对单元格的访问:
int& cell(int i, int j) { return (arr + i * c)[j]; }
我说它更容易,因为它可以扩展到多维数组(超过2D)
arr[i][j] = x;
)。实际上,实现一个返回指向行的第一个元素的指针的operator[]
就足够了。它仍然可以扩展到n-D阵列(n> 2),但它变得更加困难。最后,其中一个主要原因是可变大小的连续n-D数组的实际用例很少。所以你应该想知道vector<vector>
或者大小为r * c的普通1D数组是不够的。
答案 4 :(得分:0)
如果您将矩阵视为向量的向量,并在其上放置一些内存分配,则可以在C ++的运行时创建矩阵。
使用一点C:
int **createMatrix(int cols, int rows) {
int **matrix = malloc(sizeof(int*) * cols);
for(int i = 0; i < cols; ++i) {
matrix[i] = malloc(sizeof(int) * rows;
}
return matrix;
}
然后您可以使用新创建的矩阵,只需使用[] []。
创建的任何其他矩阵