Android 为什么IDE说:参数类型不匹配:数组不可赋值
我正在Android Studio中编写一些JNI代码,在IDE中一次又一次地出现同样的错误:Android 为什么IDE说:参数类型不匹配:数组不可赋值,android,c,android-studio,java-native-interface,Android,C,Android Studio,Java Native Interface,我正在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
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中的一个bug,还是我在这里做错了什么。我能消除这个注释错误吗
更新:我从评论中得到了答案。谢谢伊恩·阿伯特、伦丁和胡安科潘扎!
我将等待有人写一个全面的答案,如果没有出现,我会回答这一点,以完成以后使用这些评论为基础 您在结束后忘记了一个分号
}
。编译器只是继续运行并在一段时间后报告一个错误,当它感到困惑时:
void testA() {
uint8_t buff[4] = { 0, 1, 2, 3 }; // semi-colon here
testB(buff);
}
好的,正如我承诺的那样,我将尝试使用评论中收集的各种信息来回答这个问题 代码正确吗? 是的,代码是正确的
uint8\u t[4]
将衰减为uint8\u t*
,并由编译器进行处理。(谢谢)
IDE有问题吗?
对。这个错误至少有误导性。最好是一个警告,即数组规范无效且未强制执行,但会衰减为uint8\u t*
,或者说:
如果函数的参数是用数组类型声明的,C将
自动将其转换为指针类型。这会让人抓狂,
尤其是当他们使用参数作为sizeof的操作数时
操作人员这将产生指针的大小,而不是指针的大小
数组。(默认情况下,GNU GCC编译器会对此发出警告。)
以下是一些其他细节:
…有时有些人不熟悉C的陌生部分
语法认为这样的函数将生成数组的本地副本
和/或仅使用正确长度的数组编译。事实上
函数将接受使这些假设变得危险的任何uint8,
IDE试图阻止这种情况。我不允许foo(inta[N]);在我的
有自己的编码约定,但有些人喜欢将“提示”作为
文件格式
如何消除此错误?
不幸的是,Android Studio 1.5.1似乎没有此参数的配置(至少在检查列表中找不到正确的条目)
但是您可以将方法签名更改为
void testB(uint8_t *buff) {
或者按照我的建议,我更喜欢:
bool_t testB(size_t buff_len, uint8_t buff[buff_len]) {
if (buff_len != 4) return false;
//code
return true;
}
错误是哪一行的?它必须在错误之前或之后编写。请参阅最后一行中的注释您的代码是有效的,但可能IDE正在尝试防止错误。将
testB
签名更改为void testB(uint8\u t*buff)
。因为这就是真实情况。@Torge不要听这些评论,它们是不正确的void testB(uint8\u t[4]buff)
与void testB(uint8\u t*buff)
是100%等价的,前者只是更具可读性。这与提到的编译器错误无关。事实上,发布的代码中没有任何内容与该错误有关。@Torge我在猜测,但有时不熟悉C语法中奇怪部分的人认为这样的函数将生成数组的本地副本和/或仅使用正确长度的数组进行编译。函数将接受任何uint8\t*
这一事实使得这些假设变得危险,IDE试图阻止这种情况。我不允许foo(inta[N])
在我自己的编码惯例中,但有些人喜欢将“提示”作为文档的一种形式。对不起,这只是我头脑中写的示例中的内容。我修好了。