为什么IDE会说:参数类型不匹配:数组不可分配

时间:2016-02-09 12:24:44

标签: 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 red and says: parameter type mismatch: array is not assignable
}

所以在行testB(buff) buff下划线为红色并在悬停时显示上述错误

代码编译并运行正常。这是IDE中的错误,还是我在这里做错了什么。我可以摆脱这个不错的错误吗?

更新:我从评论中得到了答案。谢谢Ian Abbott,Lundin& juanchopanza! 我会稍等一下,让别人写一个全面的答案,如果没有,我会在以后以这些评论为基础自己回答这个问题。

2 个答案:

答案 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;
}