2012-03-12 69 views
0

我試圖在QT中實現棋盤遊戲時出現了一個非常奇怪的錯誤。這是我第二次,有同樣的問題,現在我想是時候在這裏問問了。向量push_back隨機發生

我還在遊戲的邏輯部分,它有一個名爲Field的類和一個名爲Board的類。理事會類具有QVector < Field* > fields屬性,該屬性是Field指針的向量。這是問題。我有一個函數,應該用新的字段上傳這個向量。這裏是我的來源,這是很簡單的:

void Board::addFields() 
{ 
    for(int i = 0; i<size; i++) //the board's size is size x size 
    { 
     for(int j = 0; j<size; j++) 
     { 
      Field * f = new Field(); 
      fields.push_back(f); 
      //qDebug()<<i*size+j<<" "<<f; 
     } 
    } 
    //qDebug()<<fields.size(); 
} 

後,我得到了一噸奇怪的錯誤,我決定寫控制檯元素的實際數量,實際元素的參考,並經過兩個循環的矢量大小。

結果是很奇怪,我沒有錯誤,但somtimes它加了我所有的元素,有時停在元素的隨機數,甚至得到了打印出來這樣的載體犯規的大小:

結果1(正常):

0 0xa173a8

...

24 0x701c18

結果2(???用不同數量的元素每次):

0 0xa173a8

...

12 0xa17548

//和無矢量大小,我假定函數得到的返回;因爲有東西

我試了QVector和std :: vector,它是一樣的。請如果有人有任何想法,可能是什麼問題,告訴我!

謝謝,對不起我的英語!

編輯

我所有的代碼是在這裏:

field.h:http://paste2.org/p/1937231

field.cpp:http://paste2.org/p/1937232

player.h:http://paste2.org/p/1937238

球員。 cpp:http://paste2.org/p/1937239

board.h:http://paste2.org/p/1937234

board.cpp:http://paste2.org/p/1937235

main.cpp中:http://paste2.org/p/1937243

+0

如何以及在哪裏'fields'聲明? – UmNyobe 2012-03-12 10:26:05

+0

字段在Board類中聲明爲私有屬性。 (私人:QVector 字段;) – 2012-03-12 10:29:26

+0

你能發佈更多的代碼嗎?你得到了哪些奇怪的錯誤,他們在哪裏? – UmNyobe 2012-03-12 10:31:13

回答

0

當你鍵入new Field();你犯了一個動態內存分配。返回的指針實際上是非常隨機的,你不應該依賴它是順序的。但通常這沒有問題。

當我得到了一大堆奇怪的錯誤後,我決定向控制檯寫入實際元素數量,實際元素的引用,以及在兩個循環之後向量的大小。

你正在經歷什麼錯誤?

+0

我試圖訪問矢量元素時出現錯誤。但是,因爲他們並不總是被添加,所以會產生錯誤。現在我不嘗試訪問元素,所以我沒有得到任何錯誤。 – 2012-03-12 10:53:27

0

size的會員嗎?從我的經驗,如果事情隨機發生它的98%的未初始化的成員造成的..

+0

是的,它是董事會成員。 – 2012-03-12 10:55:18

+0

看看你是否正在做一個好的初始化.. – 2012-03-12 10:58:34

+0

你確定'Board :: Board(int size):size(size)'東西不會產生問題嗎?使用不同的名稱進行初始化...... – 2012-03-12 11:02:08

0

我不知道C++對象初始化的細節,但

Board::Board(int size):size(size) 
{ 
    playerOne = new Player("Player One"); 
    playerTwo = new Player("Player Two"); 
    newGame(this->size); 
} 

可能是故障的原因。的確,新遊戲使用的是沒有明確初始化的fields。所以請嘗試使用

Board::Board(int size):size(size), fields(size*size) //or just fields() 
{ 
    ... 
    } 

並告訴我們會發生什麼。

+0

我嘗試過:Board :: Board(int s):size(s),fields(s * s){...} 仍然一樣... :( – 2012-03-12 11:16:59

1

感謝大家的幫助,我找到了解決方案。

由於我是一個窗口應用程序的邏輯部分,我開始了一個QT GUI項目。它生成了我這一個main()函數:

QApplication a(argc, argv); 
MainWindow w; 
w.show(); 
return a.exec(); 

我不知道這是什麼,而是因爲我並不需要任何窗口現在,我刪除了代碼,並用它取代我代碼,並簡單返回0;最後。這導致了這些問題,因爲當我加入的QApplication的代碼再次:​​

QApplication a(argc, argv); 
Board b(10); 
return a.exec(); 

它的工作就像一個魅力...

我不知道在這種情況下做的,如果我可以,我會向所有你想要幫助的人提點意見。但無論如何,非常感謝您的幫助! :)