С++ не принимает абсолютное значение числа

Я создаю ИИ в крестики-нолики на С++. Я пытался добавить код, чтобы добавить X туда, где его поставил игрок, но когда я запускаю, он выдает ошибку, связанную со строкой 37. Есть выражение, которое просто преобразует набор координат в число. Изменение кода дает мне еще одну ошибку. Ошибка может быть связана с тем, как я запрашиваю абсолютное значение.

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<vector<string>> Board
    {
        {" ", " ", " "},
        {" ", " ", " "},
        {" ", " ", " "}
    };
    string playerInput;
    
    bool hasMoved = false;
    
    bool run = true;
    while(run) {
        //Prints Tic Tac Toe board to the screen
        for(int h = 0; h < Board.size();h++){
            cout << " ";
            for(int d = 0; d < Board[h].size();d++){
                cout << Board[h][d];
                if(d < Board[h].size() - 1){ cout <<"||"; }
            }
            if(h < Board.size() - 1){ cout << "\n---------\n"; }
            
        }
        cout << "\n choose a number 1-9 to place an X: ";
        cin >> playerInput;
        
        hasMoved = false;
        while(!hasMoved){
            for(int h = 0; h < Board.size();h++){
                for(int d = 0; d < Board[h].size();d++){
                    if(Board[h].size() * abs(h - Board[h].size() + 1) + d == playerInput && Board[h][d] == " ") {
                        Board[h][d] = "X";
                        hasMoved = true;
                    }
                }
            }
            if(!hasMoved){
                cout << "\n choose a number 1-9 to place an X: ";
                cin >> playerInput;
            }
        }
    }
}

Можете ли вы включить текст ошибки в свой вопрос?

Jeremy Friesner 10.04.2022 02:40

Почему требуется абсолютное значение? Почему бы не просто (Board.size() - h - 1)?

MikeCAT 10.04.2022 02:43

Более того, почему используется цикл вместо прямого вычисления h и d из playerInput?

MikeCAT 10.04.2022 02:44

Сегодня узнал, что есть онлайн-компилятор c++ :) Ошибка должна быть что-то вроде Call of overloaded function is ambiguous

Christian 10.04.2022 02:48
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
4
46
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это не работает так, как вы ожидаете:

abs(h - Board[h].size() + 1)

Вызов vector::size() возвращает значение size_t, которое вы вычитаете из значения int. По правилам арифметические преобразованияint будет преобразовано в unsigned.

Итак, у вас есть беззнаковый тип, в котором ваше вычитание переносится «ниже» нуля. В результате получится очень большое число.

Один из способов исправить уравнение — привести результат к типу int:

abs(h - static_cast<int>(Board[h].size()) + 1)

Но в этом случае лучше просто настроить уравнение так, чтобы оно не переносилось:

Board[h].size() - h -  1

Большое спасибо! Перестроенная часть уравнения, которую вы составили, действительно полезна.

HashDankHog 10.04.2022 02:56

Изменение уравнения является лучшим решением. Приведение типов имеет свое применение, но его лучше по возможности избегать, потому что оно может привести к другим источникам ошибок, а также явно останавливает диагностику компилятором (например, выдачу предупреждения) о таких ошибках. Это (условно) возможно, например, если Board[h].size() довольно велико, например, превышает максимальное значение int (я говорю «условно», потому что такой большой контейнер часто сам по себе является знаком опасности).

Peter 10.04.2022 04:13

Первая ошибка, которую я увидел при компиляции кода:

temp.cpp:37:42: error: call to 'abs' is ambiguous

... то есть у компилятора есть несколько версий функции abs, которые он может вызвать, и он не знает, какую из них следует использовать:

note: candidate function
inline _LIBCPP_INLINE_VISIBILITY long abs(long __x) 
                                      ^
note: candidate function
inline _LIBCPP_INLINE_VISIBILITY long long abs(long long __x) 
                                           ^
note: candidate function
inline _LIBCPP_INLINE_VISIBILITY float abs(float __lcpp_x) 
                                       ^
note: candidate function
inline _LIBCPP_INLINE_VISIBILITY double abs(double __lcpp_x) 
                                        ^
note: candidate function
abs(long double __lcpp_x) 

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

abs(static_cast<long>(h - Board[h].size() + 1))

Вторая ошибка такова:

temp.cpp:37:82: error: invalid operands to binary expression ('unsigned long' and 'std::string' (aka 'basic_string<char>'))

... вызвано тем, что вы пытаетесь сравнить строку с целочисленным типом, что не имеет смысла. Предположительно, вы хотели сначала преобразовать строку в целое число, чтобы затем сравнить это:

cin >> playerInput; 
const int playerInputInt = atoi(playerInput.c_str());

[...]

if(Board[h].size() * abs(static_cast<long>(h - Board[h].size() + 1)) + d == playerInputInt && Board[h][d] == " ") {...}

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

HashDankHog 10.04.2022 02:54

Другие вопросы по теме