2011-09-24 76 views
1

我想用C++編寫一個賓果板,但我做的事情非常錯誤。我不知道是什麼,但是無論什麼原因,當我初始化行數和列數時,並且爲了實現這個結構而創建的數組上做了一個嵌套的for循環,我得到了超過一百行和三十行+列,當我應該得到一個五,五個董事會。我也試圖爲我的rand函數指定最大值和最小值,但似乎沒有辦法做到這一點。因此,如何在不放棄解決方案的情況下完成這一任務是最好的方法?我提到最後一點的原因是我可以學習如何做到這一點。需要一個簡單的,C++賓果板的優雅解決方案

這裏是我的代碼:

#ifndef BOARD_H 
#define BOARD_H 
#include <cstdlib> 
#include <time.h> 
#include <stdio.h> 

class Board 
{ 
public: 
    Board(unsigned int numberOfRows, unsigned int numberOfColumns, unsigned int seed, unsigned int max, unsigned int min); 
    void generate(); 
     void setSeedValue(int seed); 

private: 
    unsigned int m_rows[]; 
    unsigned int m_columns[]; 
    unsigned int m_max, m_min; 
}; 

#endif // BOARD_H 

    Board::Board(unsigned int numberOfRows, unsigned int numberOfColumns, unsigned int seed, unsigned int max, unsigned int min) 
{ 
    this->m_rows[numberOfRows]; 
    this->m_columns[numberOfColumns]; 
    srand(seed); 
    this->m_max = max; 
    this->m_min = min; 
    printf("%d\n", size_t(m_rows)); 
    printf("%d\n", size_t(m_columns)); 
} 

void Board::generate() 
{ 
    for (int i = 0; i < size_t(m_rows); i++) 
    { 
     for(int j = 0; j < size_t(m_columns); j++) 
     { 
      this->m_columns[j] = (rand() % 10) + j; 

      std::cout << this->m_columns[j]; 
     } 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    Board * board = new Board(5, 5, time(NULL), 100, 1); 

    board->generate(); 

    delete board; 

    return a.exec(); 
} 
+0

「Board'的構造函數在哪裏定義? – quasiverse

+0

已更新。現在已添加構造定義。 – zeboidlund

+1

這是怎麼編譯出來的呢? – Mahesh

回答

3

爲了創建你想要的二維電路板,在運行時輸入大小,你將不得不實際動態地在內存中分配一塊電路板......你不能以這種方式聲明電路板你已經在你的班級中完成了零長度數組。

這樣的代碼:

this->m_rows[numberOfRows]; 

不初始化您的數組大小......而它實際上試圖訪問那個從m_rows開始偏移分配的內存...可能導致分割故障或者由於在類/結構類型結束後訪問內存而導致的其他未定義行爲。

由於您使用的是C++,使用STL的std::vector容器創建您的電路板類會更好。然後你Board類將如下所示:

class Board 
{ 
    public: 
     Board(unsigned int numberOfRows, unsigned int numberOfColumns, 
       unsigned int seed, unsigned int max, unsigned int min); 

     void generate(); 
     void setSeedValue(int seed); 

    private: 
     vector<vector<unsigned int> > board; //use the STL vector container 
     unsigned int m_max, m_min; 
}; 

然後在你的構造函數,你實際上分配必要的內存(通過STL的vector容器)您的電路板會佔用:

Board::Board(unsigned int numberOfRows, unsigned int numberOfColumns, 
      unsigned int seed, unsigned int max, unsigned int min) 
{ 
    for (int i=0; i < numberOfRows; i++) 
    { 
     this->board.push_back(vector<unsigned int>(numberOfColumns, 0)); 
    } 

    srand(seed); 
    this->m_max = max; 
    this->m_min = min; 
    printf("%d\n", size_t(m_rows)); 
    printf("%d\n", size_t(m_columns)); 
} 

最後,您的Board::generate函數現在看起來如下所示:

void Board::generate() 
{ 
    for (int i = 0; i < this->board.size(); i++) 
    { 
     for(int j = 0; j < this->board[i].size(); j++) 
     { 
      this->board[i][j] = (rand() % 10) + j; 

      std::cout << this->board[i][j]; 
     } 
    } 
} 
+0

謝謝你的幫助。這似乎是一個很好的解決方案,但是我看到的唯一一個我不明白的地方是這行:「this-> board.push_back(vector (numberOfColumns,0));」 我沒有看到特定的參數是如何工作的,至少在vector中傳入(和一個和它一起使用的函數)。它是靜態的嗎? – zeboidlund

+0

我們調用了'std :: vector > :: push_back' ...這要求我們傳入一個'std :: vector 類型'。語法'std :: vector (numberOfColumns,0)'調用'std :: vector'的構造函數,並傳入要在vector容器中創建的插槽數的參數,以及初始化的值那些插槽。所以我們爲複製到一行中的列生成一個臨時向量對象。一旦初始化插槽,就可以通過'operator []'語法訪問它們,這就是我在'Board :: generate'函數中所做的。 – Jason

1

讓你的板級存儲行大小和列大小成員變量。將這些成員變量用作成員函數generate()中for循環的上限。此外,使用二維數組而不是一維數組,因爲這更好地代表了賓果板的結構。目前,您for循環中臨時size_t的初始化不正確。數組名稱充當指向數組第一個元素的指針 - 所以您創建的變量不會給出數組的長度。你必須單獨存儲數組的長度(或使用boost :: array)。