1

現在、C++ で割り当てられた行列を使用するのに問題があります。次のような 8x8 マトリックスに割り当てる変数ボードがあります。

int **board;

board = new int*[8];

for(int i = 0; i < 8; i ++)
{
   board[i] = new int[8];
}

次のように、行列を割り当てた直後に 0 で初期化しようとすると、次のようになります。

for(int i = 0; i < 8; i++)
{
   for(int j = 0; j < 8; j++)
   {
       board[i][j] = 0;
   }
}

表記 board[i][j] は完全に機能します。しかし、別の関数で使用しようとすると、期待どおりに機能しません。次のような関数で、割り当てられた行列をパラメーターとして使用しました。

int interpretBoard(int ** board, int ** knightsPos)
{
int k, numKnights = 0;
string buffer;


for(int row = 0; row < 8; row++)
{
    for(int column = 0; column < 8; column++)
    {
       cin >> buffer;

        switch (buffer[0])
        {
            case 'e':
                board[row][column] = 0;
                break;
            case 'b':
                if (buffer[1] == 'n')
                {
                    board[row][column] = 1;
                    knightsPos[0][k] = row;
                    knightsPos[1][k++] = column;
                    numKnights++;
                }
                else
                {
                    board[row][column] = 3;
                }
                break;
            case 'w':
                if (buffer[1] == 'n')
                {
                    board[row][column] = 2;
                    knightsPos[0][k] = row;
                    knightsPos[1][k++] = column;
                    numKnights++;
                }
                else
                {
                    board[row][column] = 4;
                }
                break;
        }

       cout << "board[" << row << "][" << column <<"]: " 
               << board[row][column] << endl;
    }
}

return numKnights;
}

そのようなマトリックスを読み取ろうとすると、セグメンテーション違反が発生します。次のようにパラメーターを渡します。

int main(int argc, char** argv) {

int l = 0;
int** board;
int** knightsPos;
vector<int**> boardVector;
vector<int**> knightsPosVector;
vector<int> numKnightsVector;

boardVector[0] = 0;

constructor(board, knightsPos);

while(!cin.eof())
{
    numKnightsVector.push_back(interpretBoard(board,knightsPos));
    boardVector.push_back(board);
    knightsPosVector.push_back(knightsPos);
    l++;
}    

destructor(board,knightsPos);

return 0;
}

コードの一部でそのようにマトリックスをスイープできるのに、別のコードではできない理由がわかりません。パラメータの渡し方が関係しているように感じますが、今のところどう間違っているのかわかりません。

4

1 に答える 1

0

あなたの問題はint ** board、ボードに割り当てた寸法について何のヒントも与えないことです。そのinterpretBoardため、8x8 ボードで動作する必要があることを知りません。

別の方法は、ボードの正方形を保持する構造体を使用することです。

struct board
{
    int square[8][8];
};

これで、次元を認識できるデータ型が得られました。プラスとして、動的に何かを割り当てる必要はありません。

于 2013-03-17T06:47:10.543 に答える