C中矩阵行列式的求法
这是矩阵行列式的C代码,但它给出了编译错误 代码是:C中矩阵行列式的求法,c,determinants,C,Determinants,这是矩阵行列式的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++) { fo
#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;
}
我认为错误在于二维数组的传递。当我将其作为指针传递时,它会给出警告,但不会出现错误,但不会给出正确的结果,因为在中,行列式总是为零。所以我猜数组不是只传递的,当我在函数行列式中打印它时,它也不会打印。
请帮助我,因为我在我的项目中遇到了这个问题。您可以在C99(haccks指出的可变长度数组)中这样动态声明数组,但在早期版本中不能:
float arr[m][m];
因此,如果遇到问题,请为其声明一个指针和malloc内存:
float* arr = malloc(sizeof(float)*m*m);
此外,该定义将不起作用(在两种情况下):
您需要在传递给函数的数组中定义列
如果如我所示声明并分配指针,则只需在函数中传递一个指针:
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];
在代码中
scanf("%d",&m);
//printf("%d",m);
float arr[m][m];
这里,arr是一个具有静态内存分配的2D数组,因此您不能在运行时读取m并像这样声明arr。因此,如果您想动态定义数组,那么当您将函数的原型声明为
int foo(int arr[], int n);
然后编译器将其解释为
int foo(int (*arr), int n); // and that's why you can omit the first dimension!
int foo(int (*arr)[col], int n);
i、 您的函数期望第一个参数的类型为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), int n); // and that's why you can omit the first dimension!
int foo(int (*arr)[col], int n);
i、 您的函数期望第一个参数的类型为int(*)[col]
(指向int
数组的指针)。由于在大多数情况下,当传递给函数时,数组名衰减为指向其第一个元素的指针,因此在您的情况下,
arr
将衰减为指向其第一个元素的指针,即第一行。因此,其类型将变为float(*)[m]
。如果将函数参数声明为
float determinant(int m, float b[][m]);
电话应该是这样的
float det = determinant(m, arr);
用显式边界声明数组
浮点b[m][m]
;编译器不理解浮点b[][]
中的空边界(空边界仅适用于一维数组,原因在其他答案中解释)
所以你的行列式函数应该是这样的:
float determinant(int m, float b[m][m])
{
...
}
还有其他方法可以使代码正常工作,但我认为这种方法最接近您已有的方法。我同意您不能使用数组初始化的这种语法,您可以使用
int *p=(int*)calloc(n*n,sizeof(float));
然后访问您的元素,如下所示:-
*(p+j+n*i);//for p[i][j] element
希望有帮助:)您的答案可能重复错误。阅读有关可变长度数组的内容。是的,您可以。这就是所谓的可变长度数组。我尝试过这个方法,但不起作用,并给出了另一个错误“m”未声明?你能告诉我其他的解决办法吗