当我在g ++下编译时,我得到以下错误:
在功能
'int search(int, int, int)'
中:1584:错误:与
中的'operator='
'* tt = & core.<anonymous union>::tt[((hash_stack[ply] >> 16) & 2047ul)]'
不匹配1584:错误:注意:候选人是:
118:注意:
tt_type& tt_type::operator=(const tt_type&)
118:注意:参数1从
没有已知转换'tt_type*'
到'const tt_type&'
static int search(int depth, int alpha, int beta) {
int best_score = -INF;
int best_move = 0;
int score;
struct move *moves;
int incheck = 0;
struct tt_type *tt; //LINE 1584
int oldalpha = alpha;
int oldbeta = beta;
int i, count=0;
nodes++;
/* test for draw by repetition */
hash_stack[ply] = compute_hash();
for (i=ply-4; i>=board[LAST]; i-=2) {
if (hash_stack[i] == hash_stack[ply]) count++;
if (count>=2) return 0;
}
/*
* check transposition table
*/
*tt = &TTABLE[ ((hash_stack[ply]>>16) & (CORE-1)) ];
if (tt->hash == (hash_stack[ply] & 0xffffU)) {
if (tt->depth >= depth) {
if (tt->flag >= 0) alpha = MAX(alpha, tt->score);
if (tt->flag <= 0) beta = MIN(beta, tt->score);
if (alpha >= beta) return tt->score;
}
best_move = tt->move & 07777;
}
我之前定义的地方
struct tt_type { //LINE 118
unsigned short hash; /* - Identifies position */
short move; /* - Best recorded move */
short score; /* - Score */
char flag; /* - How to interpret score */
char depth; /* - Remaining search depth */
};
答案 0 :(得分:2)
错误消息中最重要的一行是:
118:note: no known conversion for argument 1 from 'tt_type*' to 'const tt_type&'
它实质上意味着您正在尝试分配指向引用的指针。
这反过来让我认为将代码中的* tt = & core.::tt[((hash_stack[ply] >> 16) & 2047ul)]
更改为* tt = core.::tt[((hash_stack[ply] >> 16) & 2047ul)]
以获取深层副本或将tt = & core.::tt[((hash_stack[ply] >> 16) & 2047ul)]
更改为浅副本将解决问题(取决于您的观点)。< / p>
答案 1 :(得分:2)
我怀疑你的第1584行确实是这一行:
*tt = &TTABLE[ ((hash_stack[ply]>>16) & (CORE-1)) ];
*tt
的类型为struct tt_type
。 RHS的格式为&...
,因此它具有某种指针类型。您可以为结构或指针指定结构,但不能将指针值赋给结构(除非您重载了赋值运算符)。
我没有对代码进行足够深入的了解,但您可能希望将*tt = ...
更改为tt = ...
。
答案 2 :(得分:1)
*tt = &TTABLE[ ((hash_stack[ply]>>16) & (CORE-1)) ];
您正在尝试将指针存储到不是指针的变量中。
你需要
*tt = TTABLE[ ((hash_stack[ply]>>16) & (CORE-1)) ];
制作数组的一个元素的副本(这不起作用,因为tt
未初始化)
或
tt = &TTABLE[ ((hash_stack[ply]>>16) & (CORE-1)) ];
制作指向数组的指针。
编写第二个版本的另一种方法是
tt = TTABLE + ((hash_stack[ply]>>16) & (CORE-1));
答案 3 :(得分:0)
在这一行:
*tt = &TTABLE[ ((hash_stack[ply]>>16) & (CORE-1)) ];
您正尝试将类型tt_type
的变量分配给其他类型的其他内容。我不知道TTABLE
是什么,但作为一个疯狂的猜测,请尝试删除&
(如果&
是TTABLE
的数组tt_type
会导致错误1}} s。您要尝试将tt_type*
分配给tt_type
。
答案 4 :(得分:0)
*tt = &TTABLE[/**/];
您是从指针分配结构。由no known conversion for argument 1 from'tt_type*' to 'const tt_type&'
澄清它无法将tt_type*
转换为tt_type&
来制作副本。
我不知道TTABLE
是什么,但我会从中移除&
。