S
Sybolt de Boer
Just out of curiosity: assuming executeMove(), isAttacked(), rollback()
don't modify the vector m, can anyone explain to me why generateLegalMoves()
gives a runtime error on occasion, and generateLegalMoves2() doesn't?
TIA, Sybolt
void
MoveGenerator::generateLegalMoves(std::vector<Move> &m)
{
generateMoves(m);
int n = m.end() - m.begin(), i = 0;
while (i < n) {
executeMove(m);
if (isAttacked(&d_pieceArray[toMove() ^ COLOR][0])) {
--n;
m = m[n];
} else ++i;
rollback();
}
if (n != (m.end() - m.begin()))
m.erase(m.begin() + i, m.end());
}
void
MoveGenerator::generateLegalMoves2(std::vector<Move> &m)
{
generateMoves(m);
std::vector<Move>::iterator i = m.begin();
while (i < m.end()) {
executeMove(*i);
if (isAttacked(&d_pieceArray[toMove() ^ COLOR][0])) {
i = m.erase(i);
} else ++i;
rollback();
}
}
PS: I'm using gcc-4.1 on linux for what that's worth
don't modify the vector m, can anyone explain to me why generateLegalMoves()
gives a runtime error on occasion, and generateLegalMoves2() doesn't?
TIA, Sybolt
void
MoveGenerator::generateLegalMoves(std::vector<Move> &m)
{
generateMoves(m);
int n = m.end() - m.begin(), i = 0;
while (i < n) {
executeMove(m);
if (isAttacked(&d_pieceArray[toMove() ^ COLOR][0])) {
--n;
m = m[n];
} else ++i;
rollback();
}
if (n != (m.end() - m.begin()))
m.erase(m.begin() + i, m.end());
}
void
MoveGenerator::generateLegalMoves2(std::vector<Move> &m)
{
generateMoves(m);
std::vector<Move>::iterator i = m.begin();
while (i < m.end()) {
executeMove(*i);
if (isAttacked(&d_pieceArray[toMove() ^ COLOR][0])) {
i = m.erase(i);
} else ++i;
rollback();
}
}
PS: I'm using gcc-4.1 on linux for what that's worth