如何将托管数组传递给函数?

时间:2012-03-19 13:25:43

标签: c++ c++-cli

我正在尝试编写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 :(得分:0)

在您的班级matrix中,array类型,但在您的函数中(例如checkRow),您的第一个参数类型为int。因此,您需要将其更改为array

另一方面,你的check *函数是TTT的一部分,所以他们可以直接访问矩阵,不需要它作为参数。

答案 1 :(得分:0)

我不够专家知道如何做到这一点,但我了解到一种方法是创建另一个指针数组并将其与数组链接,并使用它而不是直接使用数组。另一种方法是全局声明数组。要全局声明数组,它不能在任何函数中,并且声明一个int数组,例如(int * x [10])。

我希望这有用:)

答案 2 :(得分:0)

我认为您遇到的问题是,我发现CLI gc对象(例如array ^)与C ++样式数组完全不同。你无法互换它们。它们的布局完全不同,任何CLI类型都位于可移动内存中,具有某些方法等,而C ++数组只是一块内存。在C ++ / CLI中,您可以选择使用任一类型的对象,但由于您似乎等待使用gc对象,因此我已编辑您的代码以使用它,如下所示。语法稍有不同,您使用array ^作为函数参数(引用int的2D数组)。然后使用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;
}

};