Как передать управляемый массив в функцию? - PullRequest
1 голос
/ 19 марта 2012

Я пытаюсь написать игру Tic-Tac-Toe, но получаю ошибки компилятора.Есть 3 ошибки, связанные с функцией TTT::whoWins.Может ли кто-нибудь помочь мне или указать мне правильное направление.

Ошибки:

Error 2 error C2664: 'TTT::checkColumn' : cannot convert parameter 1 from 'cli::array<Type,dimension> ^' to 'int [][3]' C:\Users\Grunt\Desktop\tictactoe game\tictactoe game\TTT.cpp 59
Error 3 error C2664: 'TTT::checkDiagonal' : cannot convert parameter 1 from 'cli::array<Type,dimension> ^' to 'int [][3]' C:\Users\Grunt\Desktop\tictactoe game\tictactoe game\TTT.cpp 59
Error 1 error C2664: 'TTT::checkRow' : cannot convert parameter 1 from 'cli::array<Type,dimension> ^' to 'int [][3]' C:\Users\Grunt\Desktop\tictactoe game\tictactoe game\TTT.cpp 59

Код появляется ниже:

TTT::TTT()
{
    matrix = gcnew array <int,2>(3,3);
}

bool TTT::isaTie()
{
    return 0;
}

bool TTT::isaTie2()
{
    return 0;
}

int TTT::whoWins()
{

    if((checkRow(matrix,ROW_SIZE))==1 || (checkColumn(matrix,COLUMN_SIZE))==1 || (checkDiagonal(matrix,ROW_SIZE))==1)
        return 1;
    else
        return 0;
}


bool TTT::checkRow (int mat[][COLUMN_SIZE], int ROW_SIZE)
{
    int row1 = mat[0][0] + mat[0][1] + mat [0][2];
    int row2 = mat[1][0] + mat[1][1] + mat [1][2];
    int row3 = mat[2][0] + mat[2][1] + mat [2][2];

    if (row1 == 0 || row2 == 0 || row3 == 0)
    {
        return 1;
    }
    else if (row1 == 3 || row2 == 3 || row3 == 3)
    {
        return 1;
    }
    else
        return 0;
}
bool TTT::checkColumn (int mat[][COLUMN_SIZE], int ROW_SIZE)
{
    int col1 = mat[0][0] + mat[1][0] + mat [2][0];
    int col2 = mat[0][1] + mat[1][1] + mat [2][1];
    int col3 = mat[0][2] + mat[1][2] + mat [2][2];

    if (col1 == 0 || col2 == 0 || col3 == 0)
    {
        return 1;
    }
    else if (col1 == 3 || col2 == 3 || col3 == 3)
    {
        return 1;
    }else
        return 0;
}

bool TTT::checkDiagonal (int mat[][COLUMN_SIZE], int ROW_SIZE)
{
    int diag1 = mat[0][0] + mat[1][1] + mat [2][2];
    int diag2 = mat[2][0] + mat[1][1] + mat [0][2];

    if (diag1 == 0 || diag2 == 0)
    {
        return 1;
    }
    else if (diag1 == 3 || diag2 == 3)
    {
        return 1;
    }else
        return 0;
}

Ответы [ 3 ]

0 голосов
/ 19 марта 2012

Я не достаточно опытен, чтобы знать, как это сделать, но я узнал, что можно создать другой массив указателей и связать его с массивом, и использовать его вместо непосредственного использования массива. Другой способ - объявить массивы глобально. Чтобы объявить массив глобально, он не должен быть в какой-либо функции, а для объявления массива int это будет похоже на (int * x [10]), например.

Надеюсь, это было полезно:)

0 голосов
/ 20 марта 2012

Я думаю, у вас возникли проблемы с пониманием того, что объект CLI gc, такой как array ^, совсем не то же самое, что массив в стиле C ++.Вы не можете поменять их.Они расположены совершенно по-разному, и любой тип CLI находится в подвижной памяти, имеет определенные методы и т. Д., Тогда как массив C ++ - это просто блок памяти.В C ++ / CLI у вас есть выбор использования любого типа объекта, но так как вы, кажется, ожидаете использовать объект gc, я отредактировал ваш код, чтобы использовать его ниже.Синтаксис немного отличается, вы используете массив ^ в качестве параметров вашей функции (ссылка на двумерный массив int).Затем вы обращаетесь к массиву с индексированием в стиле CLI, таким как [0,1], а не [0] [1], как вы использовали бы в C ++.Не знаю, почему у вас были ROW_SIZE и COLUMN_SIZE, так как вы не использовали их, поэтому я удалил их.

public ref class TTT
{
public:
    array<int, 2>^ matrix;

TTT::TTT()
{
    matrix = gcnew array <int,2>(3, 3);
}

bool TTT::isaTie()
{
    return 0;
}

bool TTT::isaTie2()
{
    return 0;
}

int TTT::whoWins()
{
    if ((checkRow(matrix))==1 || (checkColumn(matrix))==1 || (checkDiagonal(matrix))==1)
        return 1;
    else
        return 0;
}


bool TTT::checkRow(array<int, 2>^ mat)
{
    int row1 = mat[0,0] + mat[0,1] + mat[0,2];
    int row2 = mat[1,0] + mat[1,1] + mat[1,2];
    int row3 = mat[2,0] + mat[2,1] + mat[2,2];

    if (row1 == 0 || row2 == 0 || row3 == 0)
    {
        return 1;
    }
    else if (row1 == 3 || row2 == 3 || row3 == 3)
    {
        return 1;
    }
    else
        return 0;
}
bool TTT::checkColumn (array<int, 2>^ mat)
{
    int col1 = mat[0,0] + mat[1,0] + mat[2,0];
    int col2 = mat[0,1] + mat[1,1] + mat[2,1];
    int col3 = mat[0,2] + mat[1,2] + mat[2,2];

    if (col1 == 0 || col2 == 0 || col3 == 0)
    {
        return 1;
    }
    else if (col1 == 3 || col2 == 3 || col3 == 3)
    {
        return 1;
    }else
        return 0;
}

bool TTT::checkDiagonal (array<int, 2>^ mat)
{
    int diag1 = mat[0,0] + mat[1,1] + mat[2,2];
    int diag2 = mat[2,0] + mat[1,1] + mat[0,2];

    if (diag1 == 0 || diag2 == 0)
    {
        return 1;
    }
    else if (diag1 == 3 || diag2 == 3)
    {
        return 1;
    }else
        return 0;
}

};
0 голосов
/ 19 марта 2012

В вашем классе matrix имеет тип array, но в ваших функциях (например, checkRow) ваш первый аргумент имеет тип int. Поэтому вам нужно изменить это на array.

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

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