«Нет соответствующей функции» и «не может инициализировать параметр типа char (*) [*] - PullRequest
0 голосов
/ 05 октября 2018

Я новичок в C ++, и я только начал изучать его, и одно из моих заданий - напечатать решение проблемы N-Queens, где на доске будет N * N в зависимости от ввода пользователя.Моя IDE продолжает показывать мне ошибки, которые я не понимаю в своем коде, хотя для меня это выглядит хорошо.

#include <iostream>
#include <array>
#include <stdexcept>

using namespace std;

int N;

bool safe(char board[N][N], int row, int col)
{
  //checks if it's safe to place a queen
  //doesn't give me any errors
}

bool placeQueen(char board[N][N], int col)
{

    for (int i = 0; i < N; i++)
    {

        if ( safe(board, i, col) )
        // says there is no matching function to call safe

        {

        board[i][col] = 1;

        if ( placeQueen(board, col + 1) ){
        //says cannot initialize parameter of type char(*)[*]
        //with an Ivalue of type char(*)[N]
            return true;
        }

        board[i][col] = 0;
        }
    }
    return false;
}
void printAnswer(char board[N][N]){
//prints the final answer
}

int main()
{
int i, j;
try{
    cout << "Enter the number of queens: ";
    cin >> N;

    char board[N][N];
    for (int i = 0; i < N; i++){
        for (int j = 0; i < N; i++){
            board[i][j] = '.';
        }
    }

    if ( placeQueen(board, 0) == false )
    //no matching function to call placeQueen
    {
        throw runtime_error("Solution does not exist.");
        return 0;
    }

    printAnswer(board);
    //no matching function to call printAnswer
}
catch (runtime_error& excpt){
    cout << excpt.what();
}

return 0;
}

Возможно, я просто глуп, но помощь была бы признательна, спасибо!

1 Ответ

0 голосов
/ 05 октября 2018

char board[N][N] не является C ++, когда N не является постоянной времени компиляции.Это расширение от gcc, которое действительно не должно быть включено по умолчанию.

Вы не определяете функции, которые принимают (стиль C) массивы массивов char, но вместо этого они принимают то, что не определено в стандарте.C ++ и ведут себя иначе, чем в C.

Вместо этого вы должны определить какой-то другой тип в качестве вашей доски, например using Board = std::vector<std::vector<char>>;.Затем вы можете передать (ссылки на) этот тип.

#include <iostream>
#include <vector>

using Board = std::vector<std::vector<char>>;

bool safe(const Board & board, int row, int col)
{
  //checks if it's safe to place a queen
  //doesn't give me any errors
}

bool placeQueen(Board & board, int col)
{    
    for (int i = 0; i < N; i++)
    {    
        if (safe(board, i, col) )
        {
            board[i][col] = 1;

            if ( placeQueen(board, col + 1) ){
                return true;
            }

            board[i][col] = 0;
        }
    }
    return false;
}

void printAnswer(const Board & board){
//prints the final answer
}

int main()
{
    std::cout << "Enter the number of queens: ";
    int N;
    std::cin >> N;

    Board board{N, {N, '.'}}; // Initialise N vectors of N '.'

    if (!placeQueen(board, 0))
    {
        std::cout << "Solution does not exist.";
        return 0;
    }

    printAnswer(board);

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...