我正在尝试用C ++编写一个Bingo Board,但我做错了。我不确定是什么,但无论出于什么原因,当我初始化行数和列数,并在我为实现这个结构而创建的数组上执行嵌套for循环时,我得到的似乎是超过一百行和30 +列,当我应该得到一个五,五个板。我也试图为我的rand函数指定最大值和最小值,但似乎没有办法做到这一点。那么,在不放弃解决方案的情况下实现这一目标的最佳方法是什么?我之所以提到最后一点是因为我可以学习如何做这个大声笑。
这是我的代码:
#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 :(得分: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的向量容器):
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];
}
}
}
答案 1 :(得分:1)
让您的board类存储作为成员变量的行大小和列大小。在成员函数generate()中使用这些成员变量作为for循环的上限。此外,使用2D阵列而不是1D阵列,因为这更好地代表了宾果板的结构。目前,在for循环中初始化临时size_t是不正确的。数组名称充当指向数组的第一个元素的指针 - 因此您创建的变量不会为您提供数组的长度。您必须将数组的长度与数组本身分开存储(或使用boost :: array)。