Vector Subscript Out Of Range

Started by
2 comments, last by superman3275 11 years, 4 months ago
Hello! I've recently been running into trouble where I'm loading a file. The error is telling me I have a vector subscript out of range, and after setting some breakpoints I know where the error is coming from, however I'm having trouble fixing it. I would be very happy if you could look at my code and see what you believe the problem is :)!

Map.h:

#pragma once
struct block;
namespace th
{
class Map
{
public:
Map(std::string mapLocation);
~Map(void);
void closeFile();
void loadFile(std::string fileLocation);
void newMap(std::string locationOfNewMap, std::vector<std::vector<block>> newValues);
std::vector<std::vector<block>> convertToBlocks();
std::vector<std::vector<block>> tiledMap();
private:
std::ifstream mapFile;
std::vector<std::vector<int>> mapInIntegers;
std::vector<std::vector<block>> mapInBlocks;
};
}

Map.cpp:

#include "StdAfx.h"
#include "Map.h"

th::Map::Map(std::string mapLocation)
{
mapFile.open(mapLocation);
//Setting The Map's Size
int lIndexSize, rIndexSize;
mapFile >> lIndexSize;
mapFile >> rIndexSize;
mapInIntegers.resize(lIndexSize);
for (int index = 0; index < lIndexSize; ++index)
{

mapInIntegers[index].resize(rIndexSize);
}
//Loading The Map
int currentPosition = 2;
int currentValue = 0;

for(int lindex = 0; lindex < mapInIntegers.size(); ++lindex)
{
for(int rindex = 0; rindex < mapInIntegers[lindex].size(); ++rindex)
{
++currentPosition;
mapFile >> currentValue;
mapInIntegers[lindex][rindex] = currentValue;
}
}
convertToBlocks();
}

th::Map::~Map(void)
{
}

std::vector<std::vector<block>> th::Map::convertToBlocks()
{
mapInBlocks.resize(mapInIntegers.size());
for(unsigned int lindex = 0; lindex < mapInBlocks.size(); ++lindex)
{
mapInBlocks[lindex].resize(mapInIntegers[lindex].size());
}
for(unsigned int lindex = 0; lindex < mapInIntegers.size(); ++lindex)
{

for(unsigned int rindex = 0; rindex < mapInIntegers[rindex].size(); ++rindex)
{

switch (mapInIntegers[rindex][lindex])
{
case 0:
mapInBlocks[lindex][rindex].type = (blockType)0;
case 1:
mapInBlocks[lindex][rindex].type = (blockType)1;
}
}
}

return mapInBlocks;
}

void th::Map::closeFile()
{
mapFile.close();
}

void th::Map::loadFile(std::string locationOfNewMap)
{
mapFile.open(locationOfNewMap);
}

void th::Map::newMap(std::string locationOfNewMap, std::vector<std::vector<block>> newValues)
{
std::ofstream newFile;
newFile.open(locationOfNewMap);
if(newFile.good())
{
newFile << newValues.size();
newFile << " ";
newFile << newValues[0].size();
for(unsigned int lindex = 0; lindex < newValues.size(); ++lindex)
{
newFile << "/n";
for(unsigned int rindex = 0; rindex < newValues[lindex].size(); ++rindex)
{
newFile << newValues[lindex][rindex].type << " ";
}
}
}
}

std::vector<std::vector<block>> th::Map::tiledMap()
{
return mapInBlocks;
}


The error comes up right here:

std::vector<std::vector<block>> th::Map::convertToBlocks()
{
mapInBlocks.resize(mapInIntegers.size());
for(unsigned int lindex = 0; lindex < mapInBlocks.size(); ++lindex)
{
mapInBlocks[lindex].resize(mapInIntegers[lindex].size());
}

/*After running through the first for loop below once, it returns:
Vector Subscript Out Of Range the second time :0!*/

for(unsigned int lindex = 0; lindex < mapInIntegers.size(); ++lindex)
{
for(unsigned int rindex = 0; rindex < mapInIntegers[rindex].size(); ++rindex)
{
switch (mapInIntegers[rindex][lindex])
{
case 0:
mapInBlocks[lindex][rindex].type = (blockType)0;
case 1:
mapInBlocks[lindex][rindex].type = (blockType)1;
}
}
}
return mapInBlocks;
}


As I detail in the comment, in the latter code it loops through the for loop once before giving me the error. All help is appreciated. And if it's any consolation, here's what the file looks like:
File:

1 1
1


All help is appreciated :)!

I'm a game programmer and computer science ninja !

Here's my 2D RPG-Ish Platformer Programmed in Python + Pygame, with a Custom Level Editor and Rendering System!

Here's my Custom IDE / Debugger Programmed in Pure Python and Designed from the Ground Up for Programming Education!

Want to ask about Python, Flask, wxPython, Pygame, C++, HTML5, CSS3, Javascript, jQuery, C++, Vimscript, SFML 1.6 / 2.0, or anything else? Recruiting for a game development team and need a passionate programmer? Just want to talk about programming? Email me here:

hobohm.business@gmail.com

or Personal-Message me on here !

Advertisement
for(unsigned int rindex = 0; rindex < mapInIntegers[rindex].size(); ++rindex)[/quote]
That should be
for(unsigned int rindex = 0; rindex < mapInIntegers[lindex].size(); ++rindex)

Also, there should be a `break; before `case 1:'.
switch (mapInIntegers[rindex][lindex])
{
case 0:
mapInBlocks[lindex][rindex].type = (blockType)0;
case 1:
mapInBlocks[lindex][rindex].type = (blockType)1;
}
[/quote]
switch (mapInIntegers[rindex][lindex])[/quote]
Shouldn't the indices be reversed, like everywhere else?

You should just go over your code and make sure you get all those details right.
You solved it! My map is loading and displaying correctly now! I can't believe how trivial the problem was. Thank you so much! You're awesome, thank you so much for helping me :)! Cheers!

I'm a game programmer and computer science ninja !

Here's my 2D RPG-Ish Platformer Programmed in Python + Pygame, with a Custom Level Editor and Rendering System!

Here's my Custom IDE / Debugger Programmed in Pure Python and Designed from the Ground Up for Programming Education!

Want to ask about Python, Flask, wxPython, Pygame, C++, HTML5, CSS3, Javascript, jQuery, C++, Vimscript, SFML 1.6 / 2.0, or anything else? Recruiting for a game development team and need a passionate programmer? Just want to talk about programming? Email me here:

hobohm.business@gmail.com

or Personal-Message me on here !

This topic is closed to new replies.

Advertisement