在为我的CC2538开发带有CCS的新固件(主固件和库固件)后,所有错误都进行了调试,现在,设备工作正常。
由于从CCS我无法永久刷新固件,我正在与IAR合作开发此操作。
在IAR上,我创建了工作区,项目,并包含了编译固件所需的所有库和文件。但是,由于不兼容的类型错误,编译失败。
-
错误 [Pe144]:不能使用类型为"int"的值来初始化类型为"签名短 *"的实体
int16_t *accData[3] = malloc(sizeof(int16_t));
-
错误 [Pe513]:无法将类型为"int"的值分配给实体类型为"签名短*"
int16_t *accData[3] = malloc(sizeof(int16_t));
-
错误 [Pe120]:返回值类型("有符号短 **")不匹配函数类型("有符号短*")
int16_t * lsm303d_readAccData(void) { int16_t *accData[3] = malloc(sizeof(int16_t)); ... return accData; }
这些错误的根本原因是什么?也许,编译器的任何选项?我需要添加任何文件吗?还是代码原型?
咔!
"这些错误的根本原因是什么?
类型为"int"的值是根本原因。这里应该没有int
!只是signed short*
(这是你的int16_t*)和来自malloc的void*
。
这是因为您使用的是 C90 编译器而忘记#include <stdlib.h>
.在找到一个没有原型的函数时,C90 会隐式地假设你想要一个返回 int 的函数,这解释了编译器错误"一个类型为 'int' 的值"。但是 malloc 实际上返回了一个void*
,所以这是一个严重的错误。通过在找到malloc
的位置包含标头stdlib.h
来解决此问题。
这种语言的不受欢迎和非理性的行为在17年前就得到了修复。请考虑改用现代编译器,或将编译器配置为使用当前的 C 语言标准 (ISO 9899:2011)。
话虽如此,这段代码也没有任何意义:
int16_t *accData[3] = malloc(sizeof(int16_t));
你可能的意思是
int16_t *accData = malloc( sizeof(int16_t[3]) );
第一个错误有点误导。 这似乎表明您忘记包含<stdlib.h>
,因此malloc
未定义,编译器假定它返回int
。
在任何情况下,您都在分配指向数组的指针:这是不正确的。
返回本地自动数组的地址也是不正确的。
您应该将accData
定义为指针而不是数组,并使其指向分配的int16_t
数组。 您似乎希望此数组容纳3
元素,否则相应地修改代码:
#include <stdlib.h>
int16_t *lsm303d_readAccData(void) {
int16_t *accData = malloc(sizeof(int16_t) * 3);
...
return accData;
}
应将编译器配置为发出更多警告并拒绝过时的构造,例如隐式 int。 对于gcc
,添加-std=c99
或-std=c11
并-Wall -Wextra -Werror
。