05345248_24.c: In function `int main()':
05345248_24.c:230: Internal compiler error in `const_hash', at varasm.c:2373
It compiles fine with g++ -Wall (GCC 4.1.2 on Ubuntu) over here.
So, should I post a bug report?
Actual code follows:
Code: Select all
#include <iostream>
#include <stack>
class BlockWorld
{
private:
int numSpaces;
std::stack<int> *spaces;
int *blockPosition;
void AllocateArrays();
bool IllegalOperation(int src, int dest) const;
void UnpileOver(int block);
void MoveBlock(int src, int dest);
void MovePile(int src, int dest);
public:
BlockWorld(int newNumSpaces); // default constructor
BlockWorld(const BlockWorld &other); // copy constructor
~BlockWorld(); // destructor
void MoveOnto(int src, int dest);
void MoveOver(int src, int dest);
void PileOnto(int src, int dest);
void PileOver(int src, int dest);
void PrintOut(std::ostream &target = std::cout) const;
};
void BlockWorld::AllocateArrays()
{
spaces = new std::stack<int>[numSpaces];
blockPosition = new int[numSpaces];
}
BlockWorld::BlockWorld(int newNumSpaces):numSpaces(newNumSpaces)
{
AllocateArrays();
for(int ii = 0; ii < numSpaces; ii++)
{
blockPosition[ii] = ii;
spaces[ii].push(ii);
}
}
BlockWorld::BlockWorld(const BlockWorld &other):numSpaces(other.numSpaces)
{
AllocateArrays();
for(int ii = 0; ii < numSpaces; ii++)
{
spaces[ii] = other.spaces[ii];
blockPosition[ii] = other.blockPosition[ii];
}
}
BlockWorld::~BlockWorld()
{
delete[] spaces;
delete[] blockPosition;
}
bool BlockWorld::IllegalOperation(int src, int dest) const
{
if(src == dest || blockPosition[src] == blockPosition[dest])
return true;
return false;
}
void BlockWorld::UnpileOver(int block)
{
while(spaces[blockPosition[block]].top() != block)
{
int newBlock = spaces[blockPosition[block]].top();
spaces[blockPosition[block]].pop();
spaces[newBlock].push(newBlock);
blockPosition[newBlock] = newBlock;
}
}
void BlockWorld::MoveBlock(int src, int dest)
{
spaces[blockPosition[src]].pop();
blockPosition[src] = blockPosition[dest];
spaces[blockPosition[dest]].push(src);
}
void BlockWorld::MovePile(int src, int dest)
{
std::stack<int> temp;
while(spaces[blockPosition[src]].top() != src)
{
temp.push(spaces[blockPosition[src]].top());
spaces[blockPosition[src]].pop();
}
temp.push(spaces[blockPosition[src]].top());
spaces[blockPosition[src]].pop();
while(!temp.empty())
{
int block = temp.top();
temp.pop();
blockPosition[block] = blockPosition[dest];
spaces[blockPosition[dest]].push(block);
}
}
void BlockWorld::MoveOnto(int src, int dest)
{
if(IllegalOperation(src, dest))
return;
UnpileOver(src);
UnpileOver(dest);
MoveBlock(src, dest);
}
void BlockWorld::MoveOver(int src, int dest)
{
if(IllegalOperation(src, dest))
return;
UnpileOver(src);
MoveBlock(src, dest);
}
void BlockWorld::PileOnto(int src, int dest)
{
if(IllegalOperation(src, dest))
return;
UnpileOver(dest);
MovePile(src, dest);
}
void BlockWorld::PileOver(int src, int dest)
{
if(IllegalOperation(src, dest))
return;
MovePile(src, dest);
}
void BlockWorld::PrintOut(std::ostream &target) const
{
std::stack<int> temp;
for(int ii = 0; ii < numSpaces; ii++)
{
target << ii << ": ";
while(!spaces[ii].empty())
{
temp.push(spaces[ii].top());
spaces[ii].pop();
}
while(!temp.empty())
{
int block = temp.top();
temp.pop();
target << block << (temp.empty() ? "" : " ");
spaces[ii].push(block);
}
target << std::endl;
}
}
int main()
{
int numBlocks;
std::cin >> numBlocks;
BlockWorld bw(numBlocks);
void (BlockWorld::*moveFunction[2][2])(int, int) =
{
{ &BlockWorld::MoveOnto, &BlockWorld::MoveOver },
{ &BlockWorld::PileOnto, &BlockWorld::PileOver }
};
while(true)
{
std::string s1, s2;
int ii, jj, fx, fy;
std::cin >> s1;
if(s1 == "quit" || !std::cin)
break;
std::cin >> ii >> s2 >> jj;
if(!std::cin)
break;
s1 == "move" ? fx = 0 : fx = 1;
s2 == "onto" ? fy = 0 : fy = 1;
(bw.*moveFunction[fx][fy])(ii, jj);
}
bw.PrintOut();
return 0;
}