IAR 编译失败,CCS 编译正常。类型不兼容
IAR compilation failure, CCS compilation works. Types Incompatibility
在为我的 CC2538 使用 CCS 开发新固件(主固件和库)后,所有错误都已调试,现在设备工作正常。
从 CCS 开始,我无法永久刷新固件,我正在与 IAR 合作开发此操作。
在 IAR 上,我已经创建了工作区、项目并包含了编译固件所需的所有库和文件。但是,由于类型不兼容错误导致编译失败。
错误[Pe144]:类型"int"的值不能用于初始化
"signed short *"
类型的实体
int16_t *accData[3] = malloc(sizeof(int16_t));
错误[Pe513]:类型"int"的值无法分配给实体
类型 "signed short *"
int16_t *accData[3] = malloc(sizeof(int16_t));
错误[Pe120]: return 值类型 ("signed short **") 不匹配
函数类型 ("signed short*")
int16_t * lsm303d_readAccData(void)
{
int16_t *accData[3] = malloc(sizeof(int16_t));
...
return accData;
}
这些错误的根本原因是什么?
也许,编译器的任何选项?我需要添加任何文件吗?还是原型上的代码?
韩国!
第一个错误有点误导。这似乎表明您忘记包含 <stdlib.h>
,因此 malloc
未定义,编译器假定它 returns 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
。
Which is the root cause of these errors?
"a value of type "int"" 是根本原因。这里应该没有int
!只是 signed short*
(这是你的 int16_t*)和来自 malloc 的 void*
。
这是因为您使用的是 C90 编译器而忘记了 #include <stdlib.h>
。在找到没有原型的函数后,C90 会隐含地假设您想要一个返回 int 的函数,这解释了编译器错误 "a value of type "int""。但是malloc实际上returns一个void*
,所以这是一个严重的bug。通过在找到 malloc
的地方包含 header stdlib.h
来解决此问题。
语言的这种不受欢迎和不合理的行为在 17 年前就已修复。考虑改用现代编译器,或将编译器配置为使用当前的 C 语言标准 (ISO 9899:2011)。
也就是说,这段代码也没有任何意义:
int16_t *accData[3] = malloc(sizeof(int16_t));
你的意思可能是
int16_t *accData = malloc( sizeof(int16_t[3]) );
在为我的 CC2538 使用 CCS 开发新固件(主固件和库)后,所有错误都已调试,现在设备工作正常。
从 CCS 开始,我无法永久刷新固件,我正在与 IAR 合作开发此操作。
在 IAR 上,我已经创建了工作区、项目并包含了编译固件所需的所有库和文件。但是,由于类型不兼容错误导致编译失败。
错误[Pe144]:类型"int"的值不能用于初始化 "signed short *"
类型的实体int16_t *accData[3] = malloc(sizeof(int16_t));
错误[Pe513]:类型"int"的值无法分配给实体 类型 "signed short *"
int16_t *accData[3] = malloc(sizeof(int16_t));
错误[Pe120]: return 值类型 ("signed short **") 不匹配 函数类型 ("signed short*")
int16_t * lsm303d_readAccData(void) { int16_t *accData[3] = malloc(sizeof(int16_t)); ... return accData; }
这些错误的根本原因是什么? 也许,编译器的任何选项?我需要添加任何文件吗?还是原型上的代码?
韩国!
第一个错误有点误导。这似乎表明您忘记包含 <stdlib.h>
,因此 malloc
未定义,编译器假定它 returns 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
。
Which is the root cause of these errors?
"a value of type "int"" 是根本原因。这里应该没有int
!只是 signed short*
(这是你的 int16_t*)和来自 malloc 的 void*
。
这是因为您使用的是 C90 编译器而忘记了 #include <stdlib.h>
。在找到没有原型的函数后,C90 会隐含地假设您想要一个返回 int 的函数,这解释了编译器错误 "a value of type "int""。但是malloc实际上returns一个void*
,所以这是一个严重的bug。通过在找到 malloc
的地方包含 header stdlib.h
来解决此问题。
语言的这种不受欢迎和不合理的行为在 17 年前就已修复。考虑改用现代编译器,或将编译器配置为使用当前的 C 语言标准 (ISO 9899:2011)。
也就是说,这段代码也没有任何意义:
int16_t *accData[3] = malloc(sizeof(int16_t));
你的意思可能是
int16_t *accData = malloc( sizeof(int16_t[3]) );