首页 文章

移植C - > C,无法访问未命名的union中的struct

提问于
浏览
1

我一直在努力将Marcel的简单国际象棋程序http://marcelk.net/mscp/从C移植到C.我从未对工会工作过多,更不用说工会中的结构了 . 我列出的最重要部分是工会的声明 . (所有代码都在一个.c文件中) .

除了C教科书之外,我还搜索并阅读了一些指南,但我仍然没有深入了解如何解决这个问题 . 我不确定什么是“前向说明”,也不知道我应该在什么情况下看待这个问题 .

我的编译选项是

g -ansi -Wall -O2 -pedantic -o mscp -mscp.cpp

静态联盟{
struct tt {/ 转置表条目 /
无符号短哈希; / * - 标识位置* /
短暂的; / * - 最佳记录移动* /
短分; /* - 得分了 /
char flag; / * - 如何解读得分
/
焦深; / * - 剩余搜索深度* /
} tt [核心];
struct bk {/ 开篇书目 /
unsigned long hash; / * - 标识位置* /
短暂的; / * - 移动此职位* /
无符号短数; /* - 频率 */
} bk [核心];
核心

这些部分是给出错误的行的示例:

错误:'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;

1 回答

  • 0

    看起来你已经在代码中的某个地方声明了 classstruct bk . 也

    struct tt                       *tt;
    

    会产生错误,因为你试图声明一个与struct同名的变量(两者都叫做 tt ) . 由于此错误,变量未正确声明,因此您的其他错误 . 实际上,看起来很多问题源于命名数据类型(例如 bktt )与变量相同 . 如果可以,请尝试更改数据类型的名称或使其匿名 .

    作为旁注,联盟内部的结构可能是匿名的,除非它们在其他任何地方使用 .

相关问题