在 C++ 中将二维数组作为函数参数传递时出错
Error in Passing 2d array as function argument in C++
我正在尝试将二维数组传递给函数,但编译器显示错误:
错误:无法将参数 1
转换为 int (*)[5]
到 int**
到 int max_size(int**, int, int)
我知道这个理论,但不明白为什么它不起作用。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define r 6
#define c 5
using namespace std;
int max_size(int *g[],int m,int n)
{
// Initial Structure for DP
int i,j;
int **s = (int **) malloc (r*sizeof(int *));
for(i=0;i<r;i++)
s[i]=(int *)malloc(c*sizeof(int));
memset(s,0,sizeof(s));
// Initialization for DP
for(i=0;i<r;i++)
s[i][0] = g[i][0];
for(i=0;i<c;i++)
s[0][i] = g[0][i];
// Formulation for DP
for(i=1;i<r;i++)
{
for(j=1;j<c;j++)
{
if(g[i][j])
s[i][j]= min(s[i-1][j],s[i-1][j-1],s[i][j-1])+1;
else
s[i][j]=0;
}
}
int c = 0;
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
if(s[i][j]>c) c=s[i][j];
}
}
return c;
}
int main()
{
int m[r][c] = {{1,0,1,1,1},{1,1,1,0,0},{1,0,0,0,1},{1,1,0,0,0},{1,0,0,0,1}};
cout<<max_size(m,r,c);
return 0;
}
我相当确定您必须在函数声明和初始化中声明数组的大小。
int max_size(int *g[]
应该是 int max_size(int *g[5]
或者数组的大小应该是什么。
改变
int max_size(int *g[],int m,int n)
到
int max_size(int g[][c],int m,int n)
int a[6][5];
定义支持步长语法的单个内存数组。
int * a[]
和 int ** a
不提供步长(或行或列大小,具体取决于您的想法)并定义指向其他内存的指针数组,而不是像 int a[6][5];
这样的单个内存块。
有一些方法可以做到
1) 当第二维全局可用时(作为宏或全局常量)。
int max_size(int g[][c],int m,int n)
2) 使用单个指针
void max_size(int *g, int m, int n) and call it as
max_size((int *)m,r,c)
3) 使用指针数组或双指针
void max_size(int *g[], int m, int n) and call it as
max_size((int **)m,r,c)
它们中的任何一个都会work.Its您想要的使用方式。
您正在尝试将二维数组作为 int**
类型的参数传递。这种转换是不可能的,因为它们将具有根本不同的结构。
二维数组(例如 3x3)在内存中看起来像这样:
0,0 0,1 0,2 1,0 1,1 1,2 2,0 2,1 2,2
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│ int │ int │ int │ int │ int │ int │ int │ int │ int │
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
A int**
当用作一种二维数组时(其中最外层的指针指向指针数组中的第一个元素,并且每个指针都指向整数数组中的第一个元素)看起来像这样:
┌─────┐
│ │ // The int**
└──╂──┘
┃
▼
┌─────┬─────┬┄
│ │ │ // An array of int*
└──╂──┴──╂──┴┄
┃ ┗━━━━━━━━━━┓
▼ ▼
┌─────┬─────┬┄ ┌─────┬─────┬┄
│ int │ int │ │ int │ int │ // Arrays of ints
└─────┴─────┴┄ └─────┴─────┴┄
0,0 0,1 1,0 1,1
但是,int[x][y]
类型的二维数组可以转换为 int(*)[y]
类型(这通常称为数组到指针的转换),因此您可以像这样编写函数:
int max_size(int (*g)[c],int m,int n);
这也可以用一些语法糖来编写,如下所示:
int max_size(int g[][c],int m,int n);
数组类型的参数(像这个)被转换为指针——也就是说,[]
真的根本没有说 "array"。事实上,您可以在这些括号中输入尺寸,但它会被完全忽略。
我正在尝试将二维数组传递给函数,但编译器显示错误:
错误:无法将参数 1
转换为 int (*)[5]
到 int**
到 int max_size(int**, int, int)
我知道这个理论,但不明白为什么它不起作用。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define r 6
#define c 5
using namespace std;
int max_size(int *g[],int m,int n)
{
// Initial Structure for DP
int i,j;
int **s = (int **) malloc (r*sizeof(int *));
for(i=0;i<r;i++)
s[i]=(int *)malloc(c*sizeof(int));
memset(s,0,sizeof(s));
// Initialization for DP
for(i=0;i<r;i++)
s[i][0] = g[i][0];
for(i=0;i<c;i++)
s[0][i] = g[0][i];
// Formulation for DP
for(i=1;i<r;i++)
{
for(j=1;j<c;j++)
{
if(g[i][j])
s[i][j]= min(s[i-1][j],s[i-1][j-1],s[i][j-1])+1;
else
s[i][j]=0;
}
}
int c = 0;
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
if(s[i][j]>c) c=s[i][j];
}
}
return c;
}
int main()
{
int m[r][c] = {{1,0,1,1,1},{1,1,1,0,0},{1,0,0,0,1},{1,1,0,0,0},{1,0,0,0,1}};
cout<<max_size(m,r,c);
return 0;
}
我相当确定您必须在函数声明和初始化中声明数组的大小。
int max_size(int *g[]
应该是 int max_size(int *g[5]
或者数组的大小应该是什么。
改变
int max_size(int *g[],int m,int n)
到
int max_size(int g[][c],int m,int n)
int a[6][5];
定义支持步长语法的单个内存数组。
int * a[]
和 int ** a
不提供步长(或行或列大小,具体取决于您的想法)并定义指向其他内存的指针数组,而不是像 int a[6][5];
这样的单个内存块。
有一些方法可以做到
1) 当第二维全局可用时(作为宏或全局常量)。
int max_size(int g[][c],int m,int n)
2) 使用单个指针
void max_size(int *g, int m, int n) and call it as
max_size((int *)m,r,c)
3) 使用指针数组或双指针
void max_size(int *g[], int m, int n) and call it as
max_size((int **)m,r,c)
它们中的任何一个都会work.Its您想要的使用方式。
您正在尝试将二维数组作为 int**
类型的参数传递。这种转换是不可能的,因为它们将具有根本不同的结构。
二维数组(例如 3x3)在内存中看起来像这样:
0,0 0,1 0,2 1,0 1,1 1,2 2,0 2,1 2,2
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│ int │ int │ int │ int │ int │ int │ int │ int │ int │
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
A int**
当用作一种二维数组时(其中最外层的指针指向指针数组中的第一个元素,并且每个指针都指向整数数组中的第一个元素)看起来像这样:
┌─────┐
│ │ // The int**
└──╂──┘
┃
▼
┌─────┬─────┬┄
│ │ │ // An array of int*
└──╂──┴──╂──┴┄
┃ ┗━━━━━━━━━━┓
▼ ▼
┌─────┬─────┬┄ ┌─────┬─────┬┄
│ int │ int │ │ int │ int │ // Arrays of ints
└─────┴─────┴┄ └─────┴─────┴┄
0,0 0,1 1,0 1,1
但是,int[x][y]
类型的二维数组可以转换为 int(*)[y]
类型(这通常称为数组到指针的转换),因此您可以像这样编写函数:
int max_size(int (*g)[c],int m,int n);
这也可以用一些语法糖来编写,如下所示:
int max_size(int g[][c],int m,int n);
数组类型的参数(像这个)被转换为指针——也就是说,[]
真的根本没有说 "array"。事实上,您可以在这些括号中输入尺寸,但它会被完全忽略。