c - 将#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
}
解决方案
预处理器通过在实际编译发生之前替换代码中的宏来工作。
这意味着,您的函数声明
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
.
推荐阅读
- apache-spark - 第一次执行 spark 大约需要 13 秒,但第二次,每隔一次执行需要 3.5 秒
- python - 在python中获取特定包的依赖树
- c# - 如何检查 API 请求中的价值声明 (ASP.NET Core 2.2)
- python - Python3:如何将 PRINTed 项目转换为变量,以及如何将 VARIABLE 打印到 Excel 中的单元格中?
- mongodb - mongoDB 找到一个引发警报的查询
- sql - 当列数发生变化时将数据插入 SQLite 表的动态方式
- c# - 统一库函数总是返回 0
- firebase - Firestore DocumentSnapshot 存在安全规则问题
- javascript - react-router-dom 中带有 BrowserRouter 的动态基本名称
- go - 在 Golang 中管理多种返回类型