首页 > 解决方案 > 将#define 创建的宏传递给函数/数组

问题描述

我收到错误:在数字常量之前出现预期的 ';'、',' 或 ')',我认为这是由于我使用宏所致。该代码旨在根据 MxM 的矩阵计算此公式的答案, 其中 M < 10。在此示例中,给出了一个 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

}

标签: c

解决方案


预处理器通过在实际编译发生之前替换代码中的宏来工作。

这意味着,您的函数声明

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,而是可变的,那么它也很容易解决。然后我们需要先传递大小使用它来将矩阵创建为可变长度数组

float pfa(size_t size, int CM[size][size], int index)

请注意,即使当前代码的大小始终为M.


推荐阅读