2011-09-24 81 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)。