"Нет совпадения для 'operator =' in", ошибка структуры C ++ - PullRequest
0 голосов
/ 15 октября 2011

Когда я компилирую в 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 */
};

Ответы [ 5 ]

2 голосов
/ 15 октября 2011

Самая важная строка в сообщении об ошибке такова:

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)] для мелкой копии решит проблему (в зависимости от вашей перспективы).

2 голосов
/ 15 октября 2011

Я подозреваю, что ваша строка 1584 действительно такая:

*tt = &TTABLE[ ((hash_stack[ply]>>16) & (CORE-1)) ];

*tt имеет тип struct tt_type.RHS имеет форму &..., поэтому он имеет некоторый тип указателя.Вы можете назначить структуру на структуру или указатель на указатель, но вы не можете назначить значение указателя на структуру (если вы не перегружены оператором присваивания).

Я не изучалкода достаточно, чтобы понять его, но вы, вероятно, захотите изменить *tt = ... на tt = ....

1 голос
/ 15 октября 2011
*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));
0 голосов
/ 15 октября 2011

*tt = &TTABLE[/**/];

Вы присваиваете свою структуру из указателя. Как пояснил no known conversion for argument 1 from'tt_type*' to 'const tt_type&', он не может преобразовать tt_type* в tt_type&, чтобы сделать копию.

Я не знаю, что такое TTABLE, но я бы удалил из него &.

0 голосов
/ 15 октября 2011

В этой строке:

*tt = &TTABLE[ ((hash_stack[ply]>>16) & (CORE-1)) ];

Вы пытаетесь присвоить переменную типа tt_type другой вещи другого типа.Я не знаю, что такое TTABLE, но как дикое предположение, попробуйте удалить & (& вызовет ошибку, если TTABLE - это массив tt_type с. Вы пытаетесьприсвоить tt_type* tt_type).

...