C编译报错#5无法打开DC_MOTOR.h、#513指针类型不匹配问题咨询
编译报错原因及解决办法
第一类报错:无法打开DC_MOTOR.h头文件
报错原文:
../Core/Src/main.c(25): error: #5: 无法打开源输入文件 "DC_MOTOR.h": 没有该文件或目录。
报错原因
- DC_MOTOR.h文件不存在于项目中,可能是被误删、移动位置,或者include语句中的文件名拼写、大小写和实际文件不符
- 头文件所在目录未添加到编译器的头文件搜索路径中,编译器无法定位到文件位置
解决建议
- 首先核对项目目录中是否存在DC_MOTOR.h,确认include语句中的文件名和实际文件名完全一致
- 若文件存在,在IDE的编译器配置中添加该头文件所在目录到头文件搜索路径:Keil可在C/C选项卡的Include Paths中添加,STM32CubeIDE可在C/C General->Paths and Symbols->Includes中添加
第二类报错:指针类型不匹配
报错原文:
BUTTONS.c(57): error: #513: a value of type "uint8_t *" cannot be assigned to an entity of type "float *"
相关代码:
typedef struct { uint16_t Filter_Order; uint16_t Buffer_Index; FILTER_DATA_TYPE* Data_Buffer; float* Filter_Coeffecients; }FIR_Filter_cfg; FIR_Filter_cfg BTNS_Filters[BTN_UNITS] = {0}; uint8_t Filters_Buffers[BTN_UNITS][BTNS_FILTER_ORDER+1] = {0}; BTNS_Filters[i].Data_Buffer = Filters_Buffers[i];
报错原因
结构体成员Data_Buffer的类型为FILTER_DATA_TYPE*,结合报错信息可知你项目中定义的FILTER_DATA_TYPE是float类型;而你定义的缓冲区Filters_Buffers是uint8_t类型数组,Filters_Buffers[i]得到的是uint8_t*类型指针,两种指针类型不兼容,因此编译器抛出类型不匹配错误。且uint8_t占用1字节,float占用4字节,即使强转也会导致后续数据读写时出现内存越界、解析错误的问题。
解决建议
- 优先修改缓冲区类型和
FILTER_DATA_TYPE保持一致,将uint8_t Filters_Buffers[BTN_UNITS][BTNS_FILTER_ORDER+1] = {0};修改为FILTER_DATA_TYPE Filters_Buffers[BTN_UNITS][BTNS_FILTER_ORDER+1] = {0};即可解决报错,同时避免内存访问异常 - 若业务场景必须使用
uint8_t类型存储缓冲区,赋值时需添加显式强制类型转换:BTNS_Filters[i].Data_Buffer = (FILTER_DATA_TYPE*)Filters_Buffers[i];,必须保证uint8_t缓冲区的总字节数≥FILTER_DATA_TYPE大小 × 元素个数,避免内存越界
内容的提问来源于stack exchange,提问作者Mohamad
相关产品推荐
相关产品推荐

