【问题标题】:Calling a boolean function but getting error "no matching function to call"?调用布尔函数但收到错误“没有要调用的匹配函数”?
【发布时间】:2019-07-07 12:14:05
【问题描述】:

我正在尝试动态声明二维数组并用随机数填充它们,然后创建一个函数来比较两个二维数组中的元素,如果它们相等,它将返回 true

但是,我在尝试调用布尔函数时不断出错。

#include <iostream>
#include <cstdlib>
using namespace std;

bool isEqual(int *arr1[], int *arr2[], bool &eq, int row, int col){

for(int r = 0; r<row;r++)
{
    for(int c= 0; c<col;r++)
    {
        if(arr1[r][c]==arr2[r][c])
            eq = true;
    }
}
return eq;
 }

int main()
{
const int R = 3;
int * arr2D_a[R];
int * arr2D_b[R];
int C;

cout << "Enter number of columns: ";
cin >> C;
for (int r = 0; r < R; r++) {
    arr2D_a[r] = new int [C];
    arr2D_b[r] = new int [C];
}



for (int r = 0; r < R; r++) {
    for (int c = 0; c < C; c++) {
        arr2D_a[r][c] = rand() % 2;
        arr2D_b[r][c] = rand() % 2;
    }
}

bool result = false;
isEqual(arr2D_a,arr2D_b,result,R,C);

if (result==true)
    cout << "\nThe 2 array are the same!\n";
else
    cout << "\nThe 2 array are the differernt!\n";

for (int c = 0; c < C; c++) {
    delete[] arr2D_a[C];
    delete[] arr2D_b[C];

}
for (int r = 0; r < R; r++)  {
    delete[] arr2D_a[r];
    delete[] arr2D_b[r];

}


system("pause");
}

【问题讨论】:

  • 你得到什么错误?
  • 您在两个 for 循环中使用相同的变量 r。在循环范围内未使用的变量。是故意的吗?
  • 您在for (int r = 0; r &lt; R; r++) { arr2D_a[R] = new int [C]; arr2D_b[R] = new int [C]; } 中有错字。您为数组索引使用了错误的r
  • @MatthieuBrucher IDK。有很多错误/错别字,如果不知道 OP 有什么错误,很难知道。
  • 试试bool isEqual(int** arr1, int** arr2, bool &amp;eq, int row, int col)

标签: c++ arrays function pointers boolean


【解决方案1】:

编辑我冒昧地重写了您的代码。我发布的代码,在VS2017中编译。

你的比较似乎有点不对

#include <iostream>
#include <cstdlib>
using namespace std;

bool isEqual(int* arr1[], int* arr2[], const int row, const int col) {

    for (int r = 0; r < row; r++)
    {
        for (int c = 0; c < col; c++)
        {
            if (arr1[r][c] != arr2[r][c])
                return false;
        }
    }
    return true;
}

int main()
{
    const int R = 3;
    int * arr2D_a[R];
    int * arr2D_b[R];
    int C;

    cout << "Enter number of columns: ";
    cin >> C;
    for (int r = 0; r < R; r++) {
        arr2D_a[r] = new int[C];
        arr2D_b[r] = new int[C];
    }



    for (int r = 0; r < R; r++) {
        for (int c = 0; c < C; c++) {
            int value = rand();
            arr2D_a[r][c] = value % 2;
            arr2D_b[r][c] = value % 2;
        }
    }

    bool result = isEqual(arr2D_a, arr2D_b, R, C);

    if (result)
        cout << "\nThe 2 array are the same!\n";
    else
        cout << "\nThe 2 array are the differernt!\n";

    for (int r = 0; r < R; r++) {
        delete[] arr2D_a[r];
        arr2D_a[r] = 0;
        delete[] arr2D_b[r];
        arr2D_b[r] = 0;
    }

    return 0;
}
  1. 您必须正确声明函数的参数。 bool isEqual(int arr1, int** arr2, bool &eq, int row, int col)** 因为你有一个二维数组
  2. 检查值是否存在差异,一旦出现差异,请立即转义函数。不需要布尔变量
  3. 我不知道这是否是故意的,但您对数组的初始化。他们不可能匹配。你每次都调用 rand(),所以值不匹配
  4. 是删除列的小问题。你必须使用你的索引 c 而不是变量 C
  5. 这我没有改变...请不要使用 using namespace std;。这个命名空间非常巨大。当您定义自己的函数时,当您声明一个名称已存在的函数时,您可能会遇到无法调试的错误。

编辑 2

我完全删除了函数调用中的布尔值...

编辑 3

要永久退出此程序,您必须提供返回值

另一个错误是,你不能进行第二个删除循环。因为你没有动态分配这个内存。

编辑 4

重新设计函数以取悦所有编译器 =)

编辑 5

我希望它是这个答案的最后一次编辑^^ 我修复了内存问题。我和博士一起检查过。记忆,他说,一切都很好:D

【讨论】:

  • 即使在 main 中声明了 eq?因为我将它作为参考传递
  • sry...我确实过度阅读了这个...最好在函数本身中声明返回。顺便说一句...原生 c++ 类型应该按值传递。
  • 原生 c++ 类型是什么意思?
  • 每一种可以声明变量的类型,都是“内置”的——比如 int、bool、float ......
  • @skratchi.at 干得好 :)。尝试输入 55 作为C 的输入。你也必须修复segfault,你的回答是完美的!!!!然后我可以删除我的
【解决方案2】:

上面的答案解决了大部分问题,但你会得到segfault她。

for (int c = 0; c < C; c++) {
    delete[] arr2D_a[c];
    delete[] arr2D_b[c];

}

如果你把大于 3 的东西放在这里

std::cin >> C;

你需要做的是离开第二个循环:

for (int r = 0; r < R; R++) {
    delete[] arr2D_a[r];
    delete[] arr2D_b[r];
}

因为您在每个arr2D_a[r]arr2D_b[r] 中分配了C 的空间量。

【讨论】:

  • 有单字母变量,非常令人困惑...我用检漏仪检查了您的更改,他说,现在可以了^^
  • @skratchi.at 干得好!!!!!!大声笑,我知道单字母的事情令人困惑:(但世界并不完美。
猜你喜欢
  • 2013-05-05
  • 1970-01-01
  • 2012-12-28
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
相关资源
最近更新 更多