这是矩阵行列式的C代码,但它给出了编译错误。
代码是:
#include<stdio.h>
#include<math.h>
int m;
float determinant(float b[][]);
int main(void)
{
int i,j,m;
printf("enter a no: ");
scanf("%d",&m);
//printf("%d",m);
float arr[m][m];
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
scanf("%f",&arr[i][j]);
//printf("%f",arr[i][j]);
}
}
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
printf("%f ",arr[i][j]);
}
printf("\n");
}
float det = determinant(arr);
printf("Determinant= %f ", det);
}
float determinant(float b[][])
{
int i,j;
int p;
float sum = 0;
float c[m][m];
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
printf("%f ",b[i][j]);
}
printf("\n");
}
if(m==2)
{
printf("Determinant for m=2");
sum = b[0][0]*b[1][1] - b[0][1]*b[1][0];
return sum;
}
for(p=0;p<m;p++)
{
int h = 0,k = 0;
for(i=1;i<m;i++)
{
for( j=0;j<m;j++)
{
if(j==p)
continue;
c[h][k] = b[i][j];
k++;
if(k == m-1)
{
h++;
k = 0;
}
}
}
m=m-1;
sum = sum + b[0][p]*pow(-1,p) * determinant(c);
}
return sum;
}
编译错误是:
det.c:5:25: error: array type has incomplete element type
det.c: In function ‘main’:
det.c:36:2: error: type of formal parameter 1 is incomplete
det.c: At top level:
det.c:45:25: error: array type has incomplete element type
det.c: In function ‘determinant’:
det.c:91:3: error: type of formal parameter 1 is incomplete
det.c:99: confused by earlier errors, bailing out
Preprocessed source stored into /tmp/cc1Kp9KD.out file, please attach this to your bug report.
我认为错误在于二维数组的传递。当我将它作为指针传递时,它会发出警告但没有错误,但它没有给出正确的结果,因为总是将行列式赋予零。所以我猜这个数组并没有被传递,当我在函数行列式中打印它时它也不会打印。 请帮忙,因为我在项目中遇到了这个问题。
答案 0 :(得分:0)
您可以在C99中动态声明数组(可变长度数组,由haccks指出),但不能在早期版本中声明:
float arr[m][m];
所以,如果它让你烦恼,那么就为它声明一个指针和malloc内存:
float* arr = malloc(sizeof(float)*m*m);
此外,该定义不起作用(在任何一种情况下):
float determinant(float b[][]);
您需要定义传递给函数的数组中的列。
如果您按照我的方式声明并分配指针,那么您只需在函数中传递一个指针:
float determinant(float *b, int size); //here size is your row dimension, in this case equal to m
在函数内部,访问您的元素,如:
*(b + size*i + j) = value // equivalent to b[i][j];
答案 1 :(得分:0)
在你的代码中,
scanf("%d",&m);
//printf("%d",m);
float arr[m][m];
这里的arr是一个带有静态内存分配的2D数组,所以你不能在运行时读取m并且像这样声明arr。
因此,如果您想动态定义数组,请使用C中的malloc()
等动态内存分配方法。
答案 2 :(得分:0)
当您将函数的原型声明为
时int foo(int arr[], int n);
然后编译器将其解释为
int foo(int (*arr), int n); // and that's why you can omit the first dimension!
即,您的函数期望第一个参数的类型为int *
。类似地,当参数是多维数组时
int foo(int arr[][col], int n); // Only first dimension can be omitted. You need to specify the second dimension.
然后编译器将其解释为
int foo(int (*arr)[col], int n);
,即你的函数期望第一个参数是int (*)[col]
类型(指向int
数组的指针)。
因为当传递给函数(在大多数情况下)数组名称衰减到指向其第一个元素的指针时,在你的情况下arr
将衰减为指向其第一个元素的指针,即第一行。因此它的类型将变为float (*)[m]
。如果您将其声明为
float determinant(int m, float b[][m]);
并且呼叫应该像
float det = determinant(m, arr);
答案 3 :(得分:0)
使用显式边界float b[m][m]
声明您的数组;编译器不理解float b[][]
中的空边界(空边界仅适用于1-D数组,原因在其他答案中有解释)。
所以你的决定性函数应该是这样的:
float determinant(int m, float b[m][m])
{
...
}
还有其他方法可以让您的代码正常工作,但我认为这种方式与您已有的方式最接近。
答案 4 :(得分:0)
我同意你不能使用这种数组初始化语法,你可以使用
int *p=(int*)calloc(n*n,sizeof(float));
然后访问您的元素: -
*(p+j+n*i);//for p[i][j] element
希望有所帮助:)