Ошибка сегментации в рекурсивной функции, которая работает с массивом символов в C

#c #arrays #recursion #char #tic-tac-toe

#c #массивы #рекурсия #символ #крестики-нолики

Вопрос:

Я пишу крестики-нолики на C, и у меня проблема с функцией, которая помещает знак на игровое поле. Вот код:

 int aiPutSign(int difficultyLevel, char board[])
{
    if(difficultyLevel == 1)
    {
        srand(time(NULL));
        int field = rand() % 9;
        return board[field] == ' ' ? field : aiPutSign(difficultyLevel, board);
    } else if(difficultyLevel == 2)
    {
        //to do
        return 2;
    } else if(difficultyLevel == 3)
    {
        //to do
        return 3;
    }
}
  

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

Короче говоря: доска — это массив из 9 символов, содержащий девять пробелов, и я ставлю в нем знаки X и O после каждого хода каждого игрока. Если игрок (здесь компьютерный искусственный интеллект) пытается поставить знак на поле, которое уже заполнено, происходит рекурсия, и rand() генерирует другой номер поля.

Комментарии:

1. Если рекурсивная функция вызывает ошибку сегментации, это подсказка, что она не завершается (в вашем случае: board[field] == ' ' всегда равно 0).

Ответ №1:

Не вводите srand(time(NULL)); в свою aiPutSign функцию, вы получите одно и то же случайное число при каждом вызове. Вызовите srand один раз, например, в начале вашей программы.

Комментарии:

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