EDIT: SOLVED: I just wasn't initializing currLevel, which caused the bad pointer on the data member.
I'm writing a simple game using SDL. The game is centered around solving mazes. Each maze has a corresponding text file that my program reads and sets up a MazeMap object accordingly.
I tested it in isolation and it seemed to be initializing fine. However, when I created my Engine class and created my MazeMap object within it, I'm getting this access violation and the Maze's name is being marked in the debugger as a bad pointer. Here is the code:
MazeMap.h:
class MazeMap{
public:
MazeMap() {}
~MazeMap();
/*Initializes all the data members using a text file of the following format:
1 |-First line is the level number of the maze
level.png |-Background image for the level
Level Name |-Name of the level
4x4 |-Number of rows x cols
S.XX |-The actual map:
X... | -S: start location
XXX. | -X: Wall, .: passable ground
E... | -E: end of the level*/
void init(std::string level_file);
//Prints the maze to std::cout
void print() const;
//Calls uti::apply_surface() on all the surfaces to prepare them for blitting
// Surfaces are created for each tile.
// Will be called in Engine::render()
void drawMaze(SDL_Surface *screen) const;
private:
std::string MazeName; //THE CULPRIT!
int level,
rows,
cols;
std::vector< std::vector<Tile> > tiles;
SDL_Surface* background;
//Used in init() to get level, rows, cols, and MazeName,
// as well as initialize the background image.
void initMapInfo(std::fstream& map_in);
//Used in init() to convert the characters in the text file
// to tiles for the tile vector.
Tile convert_char_to_tile(char t) const;
//Used in print() to convert the tiles back to chars for
// printing.
char convert_tile_to_char(Tile t) const;
};
The initMapInfo function where the runtime error is occuring:
void MazeMap::initMapInfo(std::fstream& map_in){
char x;
std::string holder;
//First line: get level number
std::getline(map_in, holder);
level = uti::string_to_int(holder);
//Second line: get background image file name
std::getline(map_in, holder);
background = uti::load_image(holder);
//Third line: get name of the level
std::getline(map_in, MazeName); //THIS LINE IS FAILING
//Fourth line: get rows and cols
std::getline(map_in, holder);
std::stringstream s(holder);
s >> rows >> x >> cols;
}
The Engine class:
class Engine{
public:
Engine();
void run();
private:
SDL_Surface *screen;
GameState currentState;
int currLevel;
MazeMap levels[NUM_LEVELS];
Player player;
//Initializes the screen and sets the caption.
void initSDL();
/******************************************************/
/* Primary functions to be used in the main game loop */
//First, input from the player will be taken
void processInput();
//Based on the user input, various game world elements will be updated.
void update();
//Based on what was updated, the screen will be redrawn accordingly.
void render();
/////////////////////////////////////////////////////////
};
The run() function:
void Engine::run(){
bool play = true;
MazeMap *curr = &levels[currLevel];
curr->init(TEST_MAZE);
curr->drawMaze(screen);
while(play){
}
}
Any help is appreciated. I realize there's a lot of code here, and for that I apologize. I just want to be thorough. Thanks.