我有以下功能。我很久以前就已经写好了并且使用得很好,但现在它在Codevision软件中给我一个语法错误.... 错误发生在函数的声明中,可能来自参数....
void ReadGainPots(void);
void RxGetChannels(void);
void read_adc(uint8_t channel);
void output_motor_ppm(void);
void Initial_EEPROM_Config_Load(void);
void Save_Config_to_EEPROM(void);
void Set_EEPROM_Default_Config(void);
void eeprom_write_byte_changed( uint8_t * addr, uint8_t value );
void eeprom_write_block_changes( const char * src, void * dest, size_t size );
void eeprom_write_block_changes( const uint8_t * src, void * dest, size_t size )
{
size_t len;
for(len=0;len<size;len++)
{
eeprom_write_byte_changed( dest, *src );
src++;
dest++;
}
}
答案 0 :(得分:3)
嗯,没有错误本身,诊断有点困难: - )
第一个我要看的是“Codevision软件”是否理解uint8_t
数据类型。这种类型是在C99中引入的,如果某些嵌入式开发环境仍然使用C90,我也不会感到惊讶。
可以包含stdint.h
标题。或者,如果编译器不支持它,您可以使用另一种兼容的数据类型(可能是unsigned char
)。
一种简单的测试方法是暂时将uint8_t
更改为char
并查看错误是否消失(或者可能会移动到其他地方)。如果确实如此,那么您需要根据uint8_t
对您的实施是否有效来确定哪种方法最佳。
如果您某些支持它,那么请告诉我们生成的实际完整错误。没有它,我们就会陷入困境。
还有一些事情需要检查。
首先,之前之前的文本可能会导致问题。它也应该检查。
第二个(这可能是在你混合UNIX / Windows的环境中),检查行结尾。我在编译器需要基于UNIX的LF结尾的环境中看到了基于Windows的CR / LF行结尾的问题。
注释掉该函数并查看错误是否在其他地方持续存在(例如在以下函数中)。这将为原因(功能本身或某些环境问题)提供有价值的线索。
对于它的价值,该代码本身是非常有效的。以下程序编译正常:
#include <stddef.h>
#include <stdint.h>
void eeprom_write_byte_changed (void *dest, uint8_t ch ) {}
void eeprom_write_block_changes( const uint8_t * src, void * dest, size_t size )
{
size_t len;
for(len=0;len<size;len++)
{
eeprom_write_byte_changed( dest, *src );
src++;
dest++;
}
}
int main(void) {
eeprom_write_block_changes ("hello", NULL, 42);
return 0;
}
答案 1 :(得分:1)
将uint8_t
更改为unsigned char
或者,尝试加入stdint.h
或#define
uint8_t
自己。