函数的隐式声明和冲突类型 - AVR

时间:2015-06-02 06:41:50

标签: c++ c compiler-errors avr atmega16

这是我的第一个AVR计划。构建时,代码显示错误: “编码”的冲突类型 隐含声明'编码'

我写了以下代码:

#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>

#define SegDataPort PORTC
#define SegDataPin PINC
#define SegDataDDR DDRC

#define SegCntrlPort PORTD
#define SegCntrlPin PIND
#define SegCntrlDDR DDRD

int main(void)
{
   SegDataDDR = 0xFF;
   SegCntrlDDR = 0xF3;
   SegCntrlPort = 0xF3;
   SegDataPort = 0x00;
   unsigned char adc_value;
   float volt = adc_value/1023;
   int temp = floor(volt*10 + 0.5);

   SegDataPort = Encode(temp1%10);

   //^^^^ implicit declaration of 'Encode' 

   SegCntrlPort = ~0x01;
   SegDataPort = Encode((temp1/10)%10);
   SegCntrlPort = ~0x02;
   SegDataPort = Encode(temp1/100);
   SegCntrlPort = ~0x04;
}

unsigned char Encode(int digit)
{
   unsigned char val;
   switch(digit)
   {
      case 0 : Val = 0b00111111;
      case 1 : val = 0b00000110;

      /// so on till case 9
   }
   return val;
}

我使用ATmega16作为微控制器。我还添加了更多的库,例如地板功能的数学和其他。我已经尝试将int更改为unsigned int,unsigned char和其他,但它仍然无法正常工作并显示相同的错误。 请帮帮我。

2 个答案:

答案 0 :(得分:2)

  

隐含声明'编码'

C中,函数在被使用(被调用)之前需要声明定义

无论

  • Encode()
  • 之前移动main()函数的定义
  • Encode()之前向main()添加转发声明。

尽管如此,floor()是一个函数,在math.h中定义并在math库中定义。要使用它,您需要#include <math.h>并在编译时链接-lm

关于此处使用的程序逻辑,

unsigned char adc_value;
float volt = adc_value/1023;
int temp = floor(volt*10 + 0.5);

非常有问题,因为

  1. adc_value未经初始化使用,会导致undefined behaviour
  2. adc_value的类型为char。将其除以值1023将始终得到0的结果,因为除法将作为整数除法进行,并且不会生成一个float结果本身,正如你所期待的那样。
  3. 我的建议,将代码块更改为

    int adc_value = <some value to initialize>;  //or some input function
    float volt = (float)adc_value/1023;          //enforce floating point division
    int temp = floor(volt*10 + 0.5);
    

答案 1 :(得分:0)

第一个错误:

 unsigned char adc_value;
 float volt = adc_value/1023;

您将adc_value定义为unsigned char,在下一行中,您尝试将其除以1023,并将结果分配给float类型变量。您无法使用C语言执行此操作。 (更多关于你没有为adc_value分配任何值!它将为零或随机值)

第二个错误:

您的第二个问题是,您在Encode中调用main()函数后定义了该main()函数。您必须在main()函数之前移动整个函数,或者只在unsigned char Encode(int digit);函数之前添加其原型。

即在main()

之前添加#define

口渴错误:

您尝试为使用#define SegDataPort PORTC #define SegDataPin PINC #define SegDataDDR DDRC #define SegCntrlPort PORTD #define SegCntrlPin PIND #define SegCntrlDDR DDRD int main(void) { SegDataDDR = 0xFF; SegCntrlDDR = 0xF3; SegCntrlPort = 0xF3; SegDataPort = 0x00; . . . 声明的变量指定一些值:

#define

这也是非法的。那些用#recents ul { position:absolute; } 定义的变量是常量,你不能试图在程序体中更改它们。