int checkdiag(int arr[][100], int size)
{
int h=0,i,j,count=0;
for(i=0;i<size;i++)
for(j=0;j<size;j++)
if(arr[i][j]==arr[++i][++i])
count++;
if(count=size)
h=1;
return(h);
}
此函数应检查我的2D数组,以查看是否所有对角线都是相同的值。最大数组大小为100 x 100。
int
main(void)
{
int r,c,**m,i,j;
FILE*in;
in=fopen("matrix.txt","r");
fscanf(in,"%d",&r);
c=r;
m=(int**)malloc(r*sizeof(int*));
for(i=0;i<r;i++)
m[i]=(int*)malloc(c*sizeof(int));
for(i=0;i<r;i++)
{
for (j=0; j<c; j++)
{
fscanf(in,"%d",&m[i][j]);
}
}
fclose(in);
checkdiag(m,r)
return(0);
}
答案 0 :(得分:2)
要在C中传递2D作为函数参数,您需要指定数组的长度以及每个数组元素的长度。
您在问题中提供的代码 如果使用C99 那么。否则,您必须指定每个数组元素的长度和长度。
您不能简单地使用变量指定数组长度和元素的长度而不声明这些变量 -
void array_function(int array[][n]); //Wrong!
void array_function(int array[m][]); //Wrong!
void array_function(int array[m][n]); //Wrong!
但是,你也可以接受这些变量作为参数,或硬编码你的数组和数组元素的长度 -
void array_function(int n, array[][n]) //Correct!
void array_function(int m, int n, array[m][n]) //Correct!
void array_function(int m, array[m][100]) //Correct!
void array_function(int n, array[100][n]) //Correct!
void array_function(int array[100][100]); //Correct!
void array_function(int array[100][100]); //Correct!
要传入一个不同大小的函数(长度和元素的长度),您需要指定将数组传递给函数时长度和元素的长度。所以你的函数原型看起来像这样:
void array_function(int m, int n, array[m][n]) //Correct!
使用C99标准,您可以省略第一个大小变量,并允许未知长度的数组,但该数组中的每个数组具有相同数量的元素 -
void array_function(int m, array[][m]) //Correct, with C99!
但是使用您的代码,我不确定您为什么在您的函数中硬编码值100。如果您计划使用数组并使用对角线做某事,我假设您只会得到方形矩阵。你应该像这样编写你的函数:
void array_function(int size, array[size][size])
或强>
void array_function(int size, array[][size])
我建议使用第一个选项,因为它清楚表明您接受方形矩阵。
答案 1 :(得分:1)
多个问题:
首先,m
中的main
类型与arr
中的checkDiag
类型不符; int **
与int [][100]
(int (*)[100]
的简写)不兼容。
如果您希望匹配类型,请按以下方式声明m
:
int (*m)[100]; // m is a *pointer* to a 100-element array of int
然后,当您分配m
时,请执行以下操作:
m = malloc( r * sizeof *m ); // allocates space for an r x 100 array of int
此方法的优点是您可以在一个操作中分配整个数组,并保证行是连续的。
请注意,如果r
不是100,则不会分配“方形”矩阵。但是,对于您正在做的事情,这不应该是一个很大的问题,因为您只是通过r
元素阅读和检查r
。但是,如果你想成为一名坚持者,你可以这样做:
int r;
// get value of r
int (*m)[r] = malloc( r * sizeof *m );
这会动态分配r
x r
int
数组。我们使用可变长度数组语法(即使用变量r
来定义数组大小)。注意,可变长度数组是用C99引入的,在C2011中是可选的;你需要确保你的实现支持 1 。
在第二种情况下,您需要从
更改checkDiag
的原型
int checkDiag( int arr[][100], int size )
到
int checkDiag( int size, int arr[][size] )
size
必须先申报才能在VLA声明中使用。
在任何一种情况下,只需调用free( m );
即可在完成后取消分配数组。
第二个主要问题是checkDiag
中的这一行:
if(arr[i][j]==arr[++i][++i])
此行调用未定义的行为;你在序列点之间多次更新i
的值,并且你试图在同一个表达式中使用旧的和递增的值(即使这样,它在逻辑上也没有意义)。尝试更多类似的内容:
for ( i = 0; i < size - 1; i++ )
{
if ( arr[i][i] == arr[i+1][i+1] )
count++;
}
最后一期是
行if(count=size)
您想在此使用==
代替=
;您只是将size
分配给count
,并且由于结果不为零,因此将h
设置为1.将其更改为
if ( count == size )
h = 1;
或者,您可以完全抛弃h
变量,只需编写
return count == size;
<小时/> 1。要以编程方式执行此操作,请查找功能宏
__STDC_NO_VLA__
,如下所示:
#if defined( __STDC_NO_VLA__ )
#error "VLAs are not available for this implementation!"
#endif
答案 2 :(得分:0)
不确定你想要什么,但我想你想检查主对角线中的所有元素是否相同。在这种情况下,2D阵列在两个维度上必须具有相同的大小。我不知道你正在使用什么语言,但这段代码应该大概做你想要的:
int checkdiag(int** arr, int size)
{
int d=arr[0][0];
for(int i=1;i<size;i++)
if(arr[i][i]!=d)
return 0;
return 1;
}
如果所有对角元素都相同,则返回值为1,否则为0。
要检查所有的diagonales是否相同,你必须对每个对角线进行操作。
编辑然后你可以这样调用这个函数:
int** arr;
int size = 100;
arr=(int**)malloc(size*sizeof(int*));
for(int i=0;i<size;i++)
arr[i]=(int*)malloc(size*sizeof(int));
//fill array with values
int ret = checkdiag(arr,size);
Edit2: Sice OP分享了更多信息,我更新了checkdiag
以使用指针。