我一直致力于移植马塞尔的简单国际象棋计划http://marcelk.net/mscp/ 从C到C ++。我从未对工会工作过多,更不用说工会中的结构了。 我列出的最重要部分是工会的声明。 (所有代码都在一个.c文件中。)
除了C ++教科书之外,我还搜索并阅读了一些指南,但我仍然没有深入了解如何解决这个问题。我不确定什么是“前进的声明” 我不应该在什么情况下看待这个问题。
我的编译选项是
g ++ -ansi -Wall -O2 -pedantic -o mscp -mscp.cpp
static union { struct tt { /* Transposition table entry */ unsigned short hash; /* - Identifies position */ short move; /* - Best recorded move */ short score; /* - Score */ char flag; /* - How to interpret score */ char depth; /* - Remaining search depth */ } tt[CORE]; struct bk { /* Opening book entry */ unsigned long hash; /* - Identifies position */ short move; /* - Move for this position */ unsigned short count; /* - Frequency */ } bk[CORE]; } core;
这些部分是产生错误的行的示例:
错误:'const struct cmp_bk(const void *,const void *):: bk'
的前向声明错误:无效使用不完整类型'const struct cmp_bk(const void *,const void *):: bk'
static int cmp_bk(const void *ap, const void *bp)
{
const struct bk *a = ap; //ERROR HERE
const struct bk *b = bp; //ERROR HERE
if (a->hash < b->hash) return -1; //ERROR HERE
if (a->hash > b->hash) return 1; //ERROR HERE
return (int)a->move - (int)b->move; //ERROR HERE
}
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 *tt; //ERROR HERE
int oldalpha = alpha;
int oldbeta = beta;
int i, count=0;
if (tt->depth >= depth) {
if (tt->flag >= 0) alpha = MAX(alpha, tt->score); //ERROR HERE
if (tt->flag <= 0) beta = MIN(beta, tt->score); //ERROR HERE
if (alpha >= beta) return tt->score;
}
best_move = tt->move & 07777;
答案 0 :(得分:0)
您似乎已在代码中的某个位置声明了class
或struct bk
。还
struct tt *tt;
会产生错误,因为您试图声明一个与struct同名的变量(两者都称为tt
)。由于此错误,变量未正确声明,因此您的其他错误。实际上,看起来很多问题都源于命名数据类型(例如bk
,tt
)与变量相同的东西。如果可以,请尝试更改数据类型的名称或使其匿名。
作为旁注,联盟内部的结构可能是匿名的,除非它们在其他任何地方使用。