# 2D Array as a 1D Array (Conversion problems)

## Recommended Posts

ChaosPhoenix    242
Hey all, Relatively easy topic, I know, but I'm pretty fried and could use a fresh pair of eyes on this. I'm working on a project that reads in a maze from a file, does path planning, and outputs the result. No biggie. I've already got Dijkstra working and A* is an easy add-on to that base. My problem is I'm storing the map in a 1D array and my conversion is wrong somewhere as it's causing the maps to be draw incorrectly. Here is how a maze looks in the text file:
// S = Start, E = End, 1 = Wall, 0 = Empty tile
S000100E
00100000
00010000
00000000
00000111
00100000
01100000
10000000


Here is how it's drawing when I just look through and draw each value in the 1D array:
S0000001
00000010
01000110
00100000
10000000
00001000
00001000
X0001000


Obviously not correct. Here is where I read in the maze from the file and place it into the 1D Array:
	for(int a = 0; a < (m_iMapWidth * m_iMapHeight); a++)
{
OpenFile >> Buffer;

while(Buffer == ' ' || Buffer == '\n')
{
OpenFile >> Buffer;
}

Buffer = (char)toupper((int)Buffer);

if(Buffer == 'S')
{
m_tStartPoint.x = a / m_iMapWidth;
m_tStartPoint.y = a % m_iMapWidth;
m_pMap[a] = 'S';
continue;
}
else if (Buffer == 'E')
{
m_tEndPoint.x = a / m_iMapWidth;
m_tEndPoint.y = a % m_iMapWidth;
m_pMap[a] = 'X';
continue;
}

m_pMap[a] = Buffer;
}


And here is the access method I use to pull a value out of the 1D array using 2D values:
char CMap::GetMapTile(int x, int y)
{
if(x < 0 || x >= m_iMapWidth)
return -1;
if(y < 0 || y >= m_iMapHeight)
return -1;

return m_pMap[x * m_iMapWidth + y];

}


I appreciate the help. I'm going to play with this after I've had some rest, but I figured I'd see if anyone just spots something obvious before I hit the grind stone again. Thanks.

##### Share on other sites
jyk    2094
Assuming you intend for your 2D array to be row major, try replacing this:
m_tStartPoint.x = a / m_iMapWidth;m_tStartPoint.y = a % m_iMapWidth;
With this:
m_tStartPoint.x = a % m_iMapWidth;m_tStartPoint.y = a / m_iMapWidth;
And this:
return m_pMap[x * m_iMapWidth + y];
With this:
return m_pMap[y * m_iMapWidth + x];
Another option would be to use Boost MultiArray.

##### Share on other sites
ChaosPhoenix    242
I knew it was something simple.

Thanks, worked perfectly.

## Create an account or sign in to comment

You need to be a member in order to leave a comment

## Create an account

Sign up for a new account in our community. It's easy!

Register a new account