C++ 如何修复此错误<&书信电报;无法转换';双(*)[3]和#x27;至';int*';对于参数';1';至';双数负性(int*,int,int)和#x27&燃气轮机&燃气轮机;

C++ 如何修复此错误<&书信电报;无法转换';双(*)[3]和#x27;至';int*';对于参数';1';至';双数负性(int*,int,int)和#x27&燃气轮机&燃气轮机;,c++,arrays,C++,Arrays,我的代码应该计算数组中有多少个负元素。但是,我经常遇到这样的错误“无法将参数“1”的“double()[3]”转换为“int”到“double numberNegative(int*,int,int)”” #包括 使用名称空间std; 整数负性(双arr[],整数r,整数c); int计数器=0; int main(){ 双数据[2][3]={-3.0,1,4.5},{-2.2,7,1.4}; cout嗯--你应该听你的编译器--它是正确的 当您有一个2D数组(实际上是数组的and数组doubl

我的代码应该计算数组中有多少个负元素。但是,我经常遇到这样的错误“无法将参数“1”的“double()[3]”转换为“int”到“double numberNegative(int*,int,int)””

#包括
使用名称空间std;
整数负性(双arr[],整数r,整数c);
int计数器=0;
int main(){
双数据[2][3]={-3.0,1,4.5},{-2.2,7,1.4};
cout嗯--你应该听你的编译器--它是正确的

当您有一个2D数组(实际上是数组的and数组
double[3]
)时,在访问时,第一级间接寻址(第一级
[…]
)被转换为指向第一个元素的指针。因此
double arr[2][3];
被转换为指向数组
double[3]
的指针。(指向两个
double[3]
数组中的第一个数组的指针)。指向数组
double[3]
的指针的类型是
double(*)[3]
——就像编译器告诉您的那样

要使事情正常运行,您的原型应该是:

int numberNegative (double (*arr)[3], int r, int c);
然后,在函数中,可以使用以下方法计算负值的数量:

    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            if (arr[i][j] < 0)
                counter++;
        }
    }
    return counter;
您需要将
返回计数器;
从循环中移到函数的末尾(最后一条语句)

不需要全局
int计数器;
,请参阅

总而言之,你应该:

#include <iostream>

int numberNegative (double (*arr)[3], int r, int c);

int main (void) {

    double data[2][3] = {{-3.0, 1, 4.5}, {-2.2, 7, 1.4}};

    std::cout << numberNegative (data, 2, 3) << '\n';
}

int numberNegative (double (*arr)[3], int r, int c)
{
    int counter = 0;

    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            if (arr[i][j] < 0)
                counter++;
        }
    }
    return counter;
}

它对应于
-3.0
-2.2
。请仔细检查,如果您有任何问题,请告诉我。

您的函数接受
double[]
并将其馈送
double[2][3]
。可能会调用两次,每一位
数据调用一次?反射:是否将
双精度
视为
int
你想要的?在这种情况下,为什么选择一种类型而不是另一种?为什么要向前声明
numberNegative
?将
main
放在最后并克服它。@TedLyngmo完全同意使用单个源代码,只要按照需要的顺序声明上面的
main()
函数,如果函数相互引用,就可以去掉前向声明(尽管很多课程都是在
main()上面介绍前向声明的)
使为他们创建头文件的过渡更容易一些——他们只是没有很好地解释这一部分……)@DavidC.Rankin我认为我们在同一页上,但有不同的方法。如果我发现自己在一个翻译单元中,
main
,这使我转发声明函数…?不。转发“main”中的声明表示“main”看在上帝的份上是错的。嗨,大卫,这是一个非常详细的答案。我是一名新生,所以所有这些都很难理解,但我已经做到了。你的更正有效,但我得到了3而不是2。数组中有两个负元素。哈?你如何得到
3
?那么你初始化
int counter=1;
还是你有
G好吧!祝你好运!你的编码!学习C++(或C)不是一种竞赛——两种语言都有很多。这是一次旅行,所以享受它吧。
for (int i = 0; i < r; i++){
    ...
    return counter;
}
#include <iostream>

int numberNegative (double (*arr)[3], int r, int c);

int main (void) {

    double data[2][3] = {{-3.0, 1, 4.5}, {-2.2, 7, 1.4}};

    std::cout << numberNegative (data, 2, 3) << '\n';
}

int numberNegative (double (*arr)[3], int r, int c)
{
    int counter = 0;

    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            if (arr[i][j] < 0)
                counter++;
        }
    }
    return counter;
}
$ ./bin/count_double_neg
2