我收到错误:我认为这是我使用宏导致的数值常量之前的预期';',','或')'。该代码旨在根据MxM的矩阵(其中M <10)计算此formula的答案。对于此示例,给出了一个3x3矩阵来测试该代码,因此我尝试将M定义为3。
#include "stdio.h"
#define M 3
float pfa(int CM[M][M], int M ,int index)
{
int i,j,k;
int numerator;
int denominator;
int answer;
for (i=0; i< M; i++){
if (i != index){
numerator += CM[i][index];
}
}
for (j=0;j<index;j++){
for (k=0; k<M; k++){
if (j != index){
denominator += CM[j][k];
}
}
}
answer = numerator/denominator;
return answer;
}
int main(void)
{
// Variable definitions
int index;
// Note: different initialisation list is needed for different M
int CM[M][M]={{60,2,3},{11,47,7},{27,14,24}};
for (index=0; index<M; index++){
printf("%f \n", pfa(CM,M,index));
}
//0.292308 answers if code is done correctly
//0.123077
//0.076923
}
答案 0 :(得分:3)
在实际编译发生之前,预处理器通过替换代码中的宏来工作。
这意味着您的函数声明
float pfa(int CM[M][M], int M ,int index)
将被编译为
float pfa(int CM[3][3], int 3 ,int index)
那当然不是有效的函数声明。
相反,由于您不会传递大小不同的矩阵,因此不需要M
参数:
float pfa(int CM[M][M], int index)
或者,如果矩阵的大小可以不同于MxM
而是可变的,那么也很容易解决。然后,我们需要传递大小 first 并将其用于创建variable-length array矩阵:
float pfa(size_t size, int CM[size][size], int index)
请注意,即使当前代码的大小始终为M
,也可以使用它。
答案 1 :(得分:0)
问题在于函数pfa
的第二个参数为int M
,在预处理期间,M
被3
替换,并且参数变为{{1} },这是无效的,只需将函数参数更改为
int 3
,它应该可以正常工作。
此外,您返回的是float pfa(int CM[M][M], int size ,int index)
,其中函数的返回类型为integer
。可能会导致编译器警告。
答案 2 :(得分:0)
用现代C语言编写此程序的最佳方法是不使用全局常量,而要使用“指向可变长度数组的指针”功能:
float pfa (size_t n, int CM[n][n], int index);
...
pfa(M, CM, index)
这消除了常量和函数之间的紧密耦合(不必要的强依赖性)。