0

所以我想知道为什么我收到以下错误:

错误 1 ​​未定义对“MIN_COUNTER”的引用 C:\Users\Wyatt Crosby\Dropbox\Atmel 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并且还没有任何类型的原型(如果它是一个函数)。. .

各位聪明人有什么想法吗?

谢谢!

4

1 回答 1

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++)不会)

于 2013-06-30T22:59:36.883 回答