我正在尝试计算NxN矩阵的行列式。这段代码在我尝试动态分配内存的行中给出了错误。
错误:无法将类型为“int”的值分配给“float *”
类型的实体错误:无法将类型为“int”的值分配给“float **”类型的实体
double CalcDeterminant( float **mat, int order)
{
float **minor;
unsigned short i;
float det = 0;
// order must be >= 0
// stop the recursion when matrix is a single element
if( order == 1 )
return mat[0][0];
// the determinant value
// allocate the cofactor matrix
**minor = malloc((order-1) * sizeof(float *));
for(i=0;i<order-1;i++)
minor[i] = malloc((order-1) * sizeof(float));**
//float *mat2d = malloc( rows * cols * sizeof( float ));
for(i = 0; i < order; i++ )
{
// get minor of element (0,i)
GetMinor( mat, minor, 0, i , order);
// the recusion is here!
det += (i%2==1?-1.0:1.0) * mat[0][i] * CalcDeterminant(minor,order-1);
//det += pow( -1.0, i ) * mat[0][i] * CalcDeterminant( minor,order-1 );
}
// release memory
for(i=0;i<order-1;i++)
free(minor[i]);
free(minor);
return det;
}
答案 0 :(得分:5)
您需要添加第#include <stdlib.h>
行,以便正确声明malloc()
。
目前,编译器非常宽松(C89模式)并允许隐式函数声明,因此当编译器遇到malloc()
时,它假定它是一个返回int
的函数而不是正确的void *
。
您需要更改编译选项,直到编译器更大声抱怨。例如,如果您使用GCC,则应考虑:
gcc -std=c99 -Wall -Wextra -Wstrict-prototypes -Wmissing-prototypes ...
您可能更喜欢甚至需要使用-std=gnu99
代替-std=c99
;在使用C99核心语言的同时实现了许多扩展。但是在这些方面使用选项并确保没有编译警告是良好的纪律。使用-Werror
强制执行纪律;它会将编译器的任何警告消息转换为错误,因此编译失败。
答案 1 :(得分:3)
您需要包含头文件stdlib.h
。