Как использовать массив Джуди - PullRequest
4 голосов
/ 21 июня 2011

Я интересуюсь Джуди Массив и пытаюсь ее использовать. Но я не смог сделать ничего полезного, используя это. Каждый раз это дает мне ошибки приведения. Пример кода на С ++ и приведенная ниже ошибка.

#include "Judy.h"
#include <iostream>

using namespace std;

int main()
{
    int      Rc_int;                           // return code - integer
    Word_t   Rc_word;                          // return code - unsigned word
    Word_t   Index = 12, Index1 = 34, Index2 = 55, Nth;
    Word_t  PValue;                            // pointer to return value
    //Pvoid_t PJLArray = NULL;                 // initialize JudyL array


    Pvoid_t JudyArray = NULL;
    char      String[100];

    PWord_t _PValue;
    JSLI( JudyArray, _PValue, (uint8_t *) String);  

    return(0);

} // main()

Это дает мне ошибку

m.cpp: In function ‘int main()’:
m.cpp:19: error: invalid conversion from ‘long unsigned int**’ to ‘void**’
m.cpp:19: error:   initializing argument 1 of ‘void** JudySLIns(void**, const uint8_t*, J_UDY_ERROR_STRUCT*)’

Пожалуйста, кто-нибудь, помогите мне выяснить, в чем ошибка, что я делаю .. Спасибо

Ответы [ 3 ]

5 голосов
/ 21 июня 2011

Согласно документации , параметры _PValue и JudyArray поменялись местами.Сделайте так, чтобы ваш вызов выглядел так:

JSLI( _PValue, JudyArray, (uint8_t *) String);  

Также, попробуйте не компилировать его как код C ++.Пока что ваш тест не использует никаких функций C ++.Могу поспорить, что он будет скомпилирован как C-код.Похоже, что JudyArray полагается на тот факт, что C будет делать определенные виды неявных преобразований между void * и другими типами указателей.

Если это так, я не уверен, что с этим делать.Сообщения об ошибках, которые вы получаете, говорят мне, что JSLI - это макрос.Чтобы исправить сообщение об ошибке, которое вы видите в комментариях к этому ответу, вам нужно обратиться внутрь макроса и добавить тип-тип.

Эти виды неявных преобразований разрешены в C, поскольку в противном случае используется malloc всегда требует некрасивых бросков.C ++ намеренно запрещает их, потому что семантика new делает требование, чтобы результат malloc был приведен к правильному типу, не имеет значения.

Я не думаю, что эта библиотека может эффективно использоваться в C ++причина.

0 голосов
/ 05 февраля 2013

Для целочисленных ключей есть оболочка C ++ на http://judyhash.sourceforge.net/

0 голосов
/ 21 июня 2011

Похоже, что вы передаете JudySLIns (void **, const uint8_t *, J_UDY_ERROR_STRUCT *) неправильный параметр, первый, лучше его проверить!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...