我试图计算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;
}
Run Code Online (Sandbox Code Playgroud)
您需要添加该行#include <stdlib.h>以便malloc()正确声明.
就目前而言,编译器非常宽松(C89模式)并允许隐式函数声明,因此当编译器遇到时malloc(),它假定它是一个返回an int而不是正确的函数void *.
您需要更改编译选项,直到编译器更大声地抱怨.例如,如果您使用GCC,您应该考虑:
gcc -std=c99 -Wall -Wextra -Wstrict-prototypes -Wmissing-prototypes ...
Run Code Online (Sandbox Code Playgroud)
你可能喜欢,甚至需要,使用-std=gnu99代替-std=c99; 在使用C99核心语言的同时实现了许多扩展.但是在这些方面使用选项并确保没有编译警告是良好的纪律.使用-Werror强制执行纪律; 它会将编译器的任何警告消息转换为错误,因此编译失败.
| 归档时间: |
|
| 查看次数: |
1685 次 |
| 最近记录: |