我正在尝试创建一个程序,为游戏peg solitaire生成解决方案。但是我真的被困在开头部分。这是将文件加入起始板而不是将这些值放在动态2D数组中。目前,当我运行程序时,我收到错误消息下标超出范围。因此,起始板从txt文件的顶行开始,其中包含两个代表行和列的数字,然后是电路板本身包含的字符。我的解构函数和tostring被注释掉了,因为它们也有问题,我摔倒了,他们已经连接起来了。
例如(不是实际的板只表示NxN和char我希望加载到2d数组中)
3 3
SSS
SSS
SSS
头文件
#pragma once
#include <string>
#include <fstream>
#include <iostream>
#include <sstream>
using namespace std;
typedef unsigned char PegType;
class PegBoard
{
private:
int numRows;
int numCols;
char ** pegBoard;
public:
//constructor
PegBoard(istream &input);
//deconstructor
~PegBoard();
//toString
void toString() ;
}; //end of header file
实施档案
#include "PegBoard.h"
//constructor
PegBoard::PegBoard(istream &input){
string dummyline;
numCols = 0;
numRows = 0;
pegBoard = new char* [numRows];
//get rows and cols
input >> numRows;
input >> numCols;
//generate starting board from txt file
while(!input.eof()){
for(int r=0; r <= numRows; r++){
getline(input,dummyline);
pegBoard[r] = new char[numCols];
for(int c=0; c<= numCols; c++){
pegBoard[r][c] = dummyline[c];
}
}
}
}//end constructor
//deconstructor
PegBoard::~PegBoard(){
// for (int i=0; i <= numRows; i++)
// delete [] peg[i];
// delete [] peg;
}//end deconstructor
//toString
void PegBoard::toString() {
/*
for(int r=0; r<numRows; r++){
for(int c=0; c<numCols; c++)
cout << peg[r][c];
cout << endl;
}
*/
}
答案 0 :(得分:2)
你做得不好,非常糟糕的是你在从文件中分配值之前使用numRows。 所以改为:
//get rows and cols
input >> numRows;
input >> numCols;
pegBoard = new char* [numRows];
在你的for循环中,你应该从0到numRows(numCols)-1。或者像这样:
for(int r=0; r < numRows; r++)
因为当你定义数组大小时,你会说numRows,所以我们计算[0,numRows)