所以我想知道为什么我收到以下错误:
错误1对“MIN_COUNTER”C:\ Users \ Wyatt的未定义引用 克罗斯比\ Dropbox的\爱特梅尔 Studio \ ReflowController \ ReflowController \ ReflowController \ Debug /.././ ReflowController.c 146 1 ReflowController
在PID.h中我有:
#ifndef PID_H
#define PID_H
#define LCD_SCREEN_SIZE 16
#define MAX_COUNTS 180
#define OVEN_MAX_TEMP 260
#define OVEN_MIN_TEMP 0
#define MIN_COUNTER(x,a) tempLookupArray[x] < a ? x : MIN_COUNTER(x+1,a)
#define FIND_COUNTER(a) a <= OVEN_MIN_TEMP ? MAX_COUNTS : MIN_COUNTER(0,a)
const float tempLookupArray[MAX_COUNTS];
...
其中tempLookupArray在PID.c中进一步定义:
const float tempLookupArray[MAX_COUNTS] = {
260.00,
260.00,
260.00,
259.99,
259.98,
259.96,
...
在ReflowController.c中我包含PID.h并写:
TriggerCounter = FIND_COUNTER(PIDgain);
其中PIDgain是局部的并且类型为'float',而TriggerCounter是全局的并且类型为'volatile int'
似乎是我试图从MIN_COUNTER 内部调用MIN_COUNTER,并且还没有任何原型(如果它是一个函数)。 。 。
你们那些聪明人的想法吗?
谢谢!
答案 0 :(得分:2)
预处理器完成代码后,
TriggerCounter = FIND_COUNTER(PIDgain);
变为
TriggerCounter = PIDgain <= 0 ? 180 : tempLookupArray[0] < PIDgain ? 0 : MIN_COUNTER(0+1,PIDgain);
此时,预处理器将代码交给编译器和链接器,后者寻找名为MIN_COUNTER
但无法找到的方法。在这种情况下,预处理器不会递归地工作。想象一下,如果它做了:你编写的代码会在无限循环中发送编译器;它需要扩展MIN_COUNTER
并且为此,需要扩展另一个MIN_COUNTER
等等......
尝试使用实际功能而不是宏
int min_counter(int x, float a) {
return tempLookupArray[x] < a ? x : min_counter(x+1,a);
}
int find_counter(float a) {
return a <= OVEN_MIN_TEMP ? MAX_COUNTS : min_counter(0,a);
}
除了正确递归之外,它还会避免一些宏的警告(例如,FIND_COUNTER(i++)
会多次递增i,而find_counter(i++)
则不会)