fix
This commit is contained in:
@ -5,7 +5,8 @@ include_directories(include)
|
|||||||
file(GLOB SOURCES "src/chess/*.c")
|
file(GLOB SOURCES "src/chess/*.c")
|
||||||
file(GLOB LIB_SOURCES "lib/chess/*.c")
|
file(GLOB LIB_SOURCES "lib/chess/*.c")
|
||||||
|
|
||||||
add_executable(genMoveConsts src/generateCode/moveConsts.c ${LIB_SOURCES})
|
add_executable(genMoveConsts src/generateCode/moveConsts.c lib/chess/bitboard.c
|
||||||
|
lib/chess/print.c)
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT moveConsts.h # Output file from code generation
|
OUTPUT moveConsts.h # Output file from code generation
|
||||||
COMMAND genMoveConsts > include/chess/generated/moveConsts.h
|
COMMAND genMoveConsts > include/chess/generated/moveConsts.h
|
||||||
|
|||||||
@ -25,7 +25,7 @@ static uint_least8_t getDirectionOffset(uint_least8_t field, uint_least8_t direc
|
|||||||
return DIRECTION_OFFSET[field * DIRECTION_LENGTH + direction];
|
return DIRECTION_OFFSET[field * DIRECTION_LENGTH + direction];
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint_least8_t getMagicSize(const struct magic_t magic) {
|
static size_t getMagicSize(const struct magic_t magic) {
|
||||||
return 1 << (64 - magic.shift);
|
return 1 << (64 - magic.shift);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -37,15 +37,21 @@ static size_t getTotalMagicSize(const struct magic_t *magic) {
|
|||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint_least64_t *overflowPtr;
|
||||||
|
|
||||||
static void initMagicHelper(uint_least64_t *attackTable, struct magic_t *magic,
|
static void initMagicHelper(uint_least64_t *attackTable, struct magic_t *magic,
|
||||||
const uint_least8_t *direction, const uint_least8_t directionLength) {
|
const uint_least8_t *direction, const uint_least8_t directionLength) {
|
||||||
for(uint_least8_t field = 0; field < TOTAL_BOARD_SIZE; ++field, ++magic) {
|
for(uint_least8_t field = 0; field < TOTAL_BOARD_SIZE; ++field, ++magic) {
|
||||||
attackTable += getMagicSize(*magic);
|
|
||||||
magic->attackTable = attackTable;
|
magic->attackTable = attackTable;
|
||||||
|
attackTable += getMagicSize(*magic);
|
||||||
uint_least64_t pieceArangement = 0;
|
uint_least64_t pieceArangement = 0;
|
||||||
do { // https://stackoverflow.com/questions/7277554/what-is-a-good-way-to-iterate-a-number-through-all-the-possible-values-of-a-mask
|
do { // https://stackoverflow.com/questions/7277554/what-is-a-good-way-to-iterate-a-number-through-all-the-possible-values-of-a-mask
|
||||||
const uint_least64_t attackMask = slidingMovementMask(direction, directionLength, field, pieceArangement);
|
const uint_least64_t attackMask = slidingMovementMask(direction, directionLength, field, pieceArangement);
|
||||||
*getMagicAttackPtr(pieceArangement, *magic) = attackMask;
|
uint_least64_t *ptr = getMagicAttackPtr(pieceArangement, *magic);
|
||||||
|
if(ptr >= overflowPtr) {
|
||||||
|
printf("overflow\n");
|
||||||
|
}
|
||||||
|
*ptr = attackMask;
|
||||||
pieceArangement = (pieceArangement - magic->mask) & magic->mask;
|
pieceArangement = (pieceArangement - magic->mask) & magic->mask;
|
||||||
} while(pieceArangement != 0);
|
} while(pieceArangement != 0);
|
||||||
}
|
}
|
||||||
@ -55,6 +61,7 @@ void initMagicTable() {
|
|||||||
const size_t rookMagicSize = getTotalMagicSize(rookMagic);
|
const size_t rookMagicSize = getTotalMagicSize(rookMagic);
|
||||||
const size_t size = rookMagicSize + getTotalMagicSize(bishopMagic);
|
const size_t size = rookMagicSize + getTotalMagicSize(bishopMagic);
|
||||||
uint_least64_t *attackTable = malloc(size * sizeof *attackTable);
|
uint_least64_t *attackTable = malloc(size * sizeof *attackTable);
|
||||||
|
overflowPtr = attackTable + size;
|
||||||
if(attackTable == NULL) {
|
if(attackTable == NULL) {
|
||||||
perror("failed to allocate memory: ");
|
perror("failed to allocate memory: ");
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|||||||
Reference in New Issue
Block a user