Android 为什么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

我正在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中的一个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])
在我自己的编码惯例中,但有些人喜欢将“提示”作为文档的一种形式。对不起,这只是我头脑中写的示例中的内容。我修好了。