我正在Android Studio中编写一些JNI代码,我在IDE中反复出现同样的错误:
parameter type mismatch: array is not assignable
总是出现类似的情况:
void testB(uint8_t buff[4]) {
//some code
}
void testA() {
uint8_t buff[4] = { 0, 1, 2, 3 };
testB(buff); //buff is underlined red and says: parameter type mismatch: array is not assignable
}
所以在行testB(buff)
buff下划线为红色并在悬停时显示上述错误
代码编译并运行正常。这是IDE中的错误,还是我在这里做错了什么。我可以摆脱这个不错的错误吗?
更新:我从评论中得到了答案。谢谢Ian Abbott,Lundin& juanchopanza! 我会稍等一下,让别人写一个全面的答案,如果没有,我会在以后以这些评论为基础自己回答这个问题。
答案 0 :(得分:0)
结束}
后忘记了分号。编译器只是在混淆了一段时间后继续并报告错误:
void testA() {
uint8_t buff[4] = { 0, 1, 2, 3 }; // semi-colon here
testB(buff);
}
答案 1 :(得分:0)
好的,正如我所承诺的那样,我将尝试使用评论中收集的各种信息自行回答。
代码是否正确?
是的,代码是正确的。 uint8_t[4]
将衰减到uint8_t *
并由编译器处理。 (谢谢Lundin)
IDE有问题吗?
是。该错误至少具有误导性。最好是一个警告,数组规范没有效果,并且没有强制执行但是衰减到uint8_t *
或Ian Abbot把它放了:
如果使用数组类型声明函数的参数,则C将 自动将其转换为指针类型。这可以抓住人, 特别是如果他们使用参数作为sizeof的操作数 运营商。这将产生指针的大小,而不是大小 阵列。 (默认情况下,GNU GCC编译器会发出警告。)
juanchopanza的其他一些细节:
......有时候那些不熟悉C的陌生人的人 语法认为这样的函数会使数组的本地副本 和/或仅使用正确长度的数组进行编译。这个事实 函数将接受任何uint8_t *使这些假设变得危险, 并且IDE试图阻止这种情况。我不允许foo(int a [N]);在我的 自己的编码惯例,但有些人喜欢把“提示”作为一个 文件形式
如何摆脱此错误?
不幸的是,Android Studio 1.5.1似乎没有这个参数的配置(至少它在检查列表中找不到正确的条目)
但您可以将方法签名更改为
void testB(uint8_t *buff) {
或建议Lundin以及我更喜欢的内容:
bool_t testB(size_t buff_len, uint8_t buff[buff_len]) {
if (buff_len != 4) return false;
//code
return true;
}