函数的隐式声明和类型冲突 - AVR
Implicit declaration of function and conflicting type - AVR
这是我的第一个 AVR 程序。构建时,代码显示错误:
'Encode' 的类型冲突
'Encode'
的隐式声明
我写了下面的代码:
#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 作为微控制器。我还添加了更多的库,例如 floor 函数的数学等。我已经尝试将 int 更改为 unsigned int、unsigned char 和其他,但它仍然无法正常工作并显示相同的错误。
请帮助我。
implicit declaration of 'Encode'
在 C
中,函数需要在使用(调用)之前 声明 或 定义。
或者
- 将
Encode()
函数的定义移到main()
之前
- 在
main()
前向Encode()
添加前向声明。
也就是说,floor()
是一个函数,在 math.h
中定义并在 math
库中定义。要使用它,您需要在编译时 #include <math.h>
和 link 以及 -lm
。
关于这里使用的程序逻辑,
unsigned char adc_value;
float volt = adc_value/1023;
int temp = floor(volt*10 + 0.5);
问题很大,因为
adc_value
未初始化使用,导致 undefined behaviour.
adc_value
是 char
类型。将其除以 1023
的值将始终得到 0
的结果,因为除法将作为 整数除法 而不会 产生一个float
结果本身,如你所料。
我的建议,将该代码块更改为
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);
第一个错误:
unsigned char adc_value;
float volt = adc_value/1023;
您将 adc_value
定义为 unsigned char
并在下一行中尝试将其除以 1023
并将结果分配给 float
类型变量。你不能用 C
语言来做这些。 (此外,您没有为 adc_value
分配任何值!它将是零或随机值)
第二个错误:
您的第二个问题是您在 main()
中调用后定义了 Encode
函数。您必须将整个函数移动到 main()
函数之前,或者仅将其原型添加到 main()
函数之前。
即在main()
之前添加unsigned char Encode(int digit);
口渴错误:
您试图将一些值分配给您使用 #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
定义的变量是常量,您不能尝试在程序主体中更改它们。
这是我的第一个 AVR 程序。构建时,代码显示错误: 'Encode' 的类型冲突 'Encode'
的隐式声明我写了下面的代码:
#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 作为微控制器。我还添加了更多的库,例如 floor 函数的数学等。我已经尝试将 int 更改为 unsigned int、unsigned char 和其他,但它仍然无法正常工作并显示相同的错误。 请帮助我。
implicit declaration of 'Encode'
在 C
中,函数需要在使用(调用)之前 声明 或 定义。
或者
- 将
Encode()
函数的定义移到main()
之前
- 在
main()
前向Encode()
添加前向声明。
也就是说,floor()
是一个函数,在 math.h
中定义并在 math
库中定义。要使用它,您需要在编译时 #include <math.h>
和 link 以及 -lm
。
关于这里使用的程序逻辑,
unsigned char adc_value;
float volt = adc_value/1023;
int temp = floor(volt*10 + 0.5);
问题很大,因为
adc_value
未初始化使用,导致 undefined behaviour.adc_value
是char
类型。将其除以1023
的值将始终得到0
的结果,因为除法将作为 整数除法 而不会 产生一个float
结果本身,如你所料。
我的建议,将该代码块更改为
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);
第一个错误:
unsigned char adc_value;
float volt = adc_value/1023;
您将 adc_value
定义为 unsigned char
并在下一行中尝试将其除以 1023
并将结果分配给 float
类型变量。你不能用 C
语言来做这些。 (此外,您没有为 adc_value
分配任何值!它将是零或随机值)
第二个错误:
您的第二个问题是您在 main()
中调用后定义了 Encode
函数。您必须将整个函数移动到 main()
函数之前,或者仅将其原型添加到 main()
函数之前。
即在main()
unsigned char Encode(int digit);
口渴错误:
您试图将一些值分配给您使用 #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
定义的变量是常量,您不能尝试在程序主体中更改它们。