2013-03-17 104 views
1

我目前在C++中使用分配的矩陣時遇到了麻煩。我有一個變量板,我分配是一個8×8矩陣是這樣的:使用動態分配的矩陣

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; 
    } 
} 

的符號板[我] [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; 
} 

我不知道爲什麼我能掃矩陣方式的代碼的一部分,但不是在另一個。 我覺得它與我傳遞參數的方式有關,但我不明白它現在是怎麼回事。

+1

[SSCCE](http://sscce.org)。另外,使用'std :: vector'。 – 2013-03-17 05:01:32

+0

你得到一個segfault在哪裏? – 2013-03-17 05:08:11

+0

發佈'interpretBoard'的整個主體。 – Shoe 2013-03-17 05:08:31

回答

0

你的問題是,int ** board沒有提供任何關於你爲你的板分配的尺寸的暗示。所以interpretBoard不知道它必須使用8x8板。

一個替代方案是使用保存董事會的平方一個結構,像

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

現在你有知道尺寸的數據類型,並作爲再加上你並不需要動態分配任何東西。

+0

奇怪的是,使用'int ** board'*將會工作*提供傳遞給它的數據是正確設置。它基本上是指向數組指針的無限指針。第一個間接的'board [n]'將得到該序列的第n + 1個指針,然後是第二個間接'board [n] [m]',它將訪問第m + 1個元素從那裏。換句話說,這不是問題。你是正確的解釋董事會不知道它是一個8×8董事會*由聲明*,但它也不*知道。 (儘管它應該通過尺寸參數來嚴格地說明,以協助循環限制)。 – WhozCraig 2013-03-17 08:44:26