将#define创建的宏传递给函数/数组

时间:2018-08-28 06:06:21

标签: c

我收到错误:我认为这是我使用宏导致的数值常量之前的预期';',','或')'。该代码旨在根据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

}

3 个答案:

答案 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,在预处理期间,M3替换,并且参数变为{{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)

这消除了常量和函数之间的紧密耦合(不必要的强依赖性)。