Вызываете булеву функцию, но получаете ошибку «нет подходящей функции для вызова»? - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь объявить 2d-массивы динамически и заполнить их случайными числами, а затем создать функцию, которая будет сравнивать элементы в двух 2-мерных массивах и, если они будут равны, вернет 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");
}

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Ответ выше устраняет большинство проблем, но вы получите 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];
}

, потому что вы выделили C количество места в каждом arr2D_a[r] и arr2D_b[r].

0 голосов
/ 13 февраля 2019

РЕДАКТИРОВАТЬ Я позволил себе переписать ваш код.код, который я выложил, скомпилированный в 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. , проверяющий, отличаются ли значения diff, экранируйте функцию каккак только они это сделают.нет необходимости в переменной bool
  3. Я не знаю, было ли это намеренно, но вы инициализировали массивы.не было никакого способа, которым они могли бы соответствовать.Вы вызывали rand () каждый раз, поэтому значения не могут совпадать
  4. было мелочь с удалением столбцов.вы должны использовать свой индекс c , а не переменную C
  5. это я не изменил ... пожалуйста, не используйте используя namespace std; .это пространство имен так огромно.когда вы определяете свои собственные функции, вы можете столкнуться с неустранимыми ошибками, когда вы объявляете функцию с именем, которое существует.

РЕДАКТИРОВАТЬ 2

Я полностьюудалил bool в вызове функции ...

РЕДАКТИРОВАТЬ 3

, чтобы оставить эту программу навсегда, вы должны предоставить возвращаемое значение

другойошибка была, вы не должны делать второй цикл удаления.так как вы не выделяли эту память динамически.

РЕДАКТИРОВАТЬ 4

переработали функцию, чтобы угодить всем компиляторам =)

РЕДАКТИРОВАТЬ 5

Я надеюсь, что последнее изменение этого ответа ^^ Я исправил проблему с памятью.Я проверил это с доктором.память и он говорит, все ок: D

...