如何修复此错误<<无法将参数"1"的"双精度(*)[3]"转换为"int*"到"双精度数负数(int*,int,int)">>



我的代码应该计算数组中有多少负元素。然而,我一直遇到这样的错误"无法将参数"1"的"double(([3]"转换为"int",以将其转换为"double numberNegative(int*,int,int(">

#include <iostream>
using namespace std;

int numberNegative(double arr[], int r, int c);
int counter = 0;
int main(){
double data[2][3] = {{-3.0, 1, 4.5}, {-2.2, 7, 1.4}};
cout<<numberNegative(data, 2, 3)<<endl;
return 0;
}

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

好吧——你应该听听你的编译器——这是正确的。

当您有一个2D数组(实际上是数组double [3]的数组(时,在访问时,第一个间接级别(第一个[..](将转换为指向第一个元素的指针。因此double arr[2][3];被转换为指向数组double[3]指针。(指向2个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;

注意:j < cNOTj <= c(超出数组的边界1(,而没有if (arr[i] < 0) counter++;尝试将指向double的指针与0进行比较。

此外,不能在for循环中包含return counter;,并期望为2D数组中的所有负值返回正确的值。在哪里:

for (int i = 0; i < r; i++){
...
return counter;
}

您需要将return counter;从循环中移到函数的末尾(最后一条语句(。

不需要全局int counter;,请参阅为什么"使用命名空间std;"被认为是不好的做法?

总之,你会得到:

#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;
}

另请参阅:C++:"std::endl"与"\n">

示例使用/输出

$ ./bin/count_double_neg
2

对应于CCD_ 17和CCD_。仔细看看,如果你有任何问题,请告诉我。

最新更新