недопустимое преобразование из 'const void *' в 'const char *' в базе данных таблицы каюты tokoyo - PullRequest
0 голосов
/ 14 октября 2010

Я новичок в каюте Токио, и я скомпилировал пример программы, и я получаю сообщение об ошибке. Может кто-нибудь сказать мне, почему я получаю эту ошибку invalid conversion from ‘const void*’ to ‘const char*’

    #include <tcutil.h>
#include <tctdb.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>

int main(int argc, char **argv){
  TCTDB *tdb;
  int ecode, pksiz, i, rsiz;
  char pkbuf[256];
  const char *rbuf, *name;
  TCMAP *cols;
  TDBQRY *qry;
  TCLIST *res;

  /* create the object */
  tdb = tctdbnew();

  /* open the database */
  if(!tctdbopen(tdb, "casket.tct", TDBOWRITER | TDBOCREAT)){
    ecode = tctdbecode(tdb);
    fprintf(stderr, "open error: %s\n", tctdberrmsg(ecode));
  }

  /* store a record */
  pksiz = sprintf(pkbuf, "%ld", (long)tctdbgenuid(tdb));
  cols = tcmapnew3("name", "mikio", "age", "30", "lang", "ja,en,c", NULL);
  if(!tctdbput(tdb, pkbuf, pksiz, cols)){
    ecode = tctdbecode(tdb);
    fprintf(stderr, "put error: %s\n", tctdberrmsg(ecode));
  }
  tcmapdel(cols);

  /* store a record in a naive way */
  pksiz = sprintf(pkbuf, "12345");
  cols = tcmapnew();
  tcmapput2(cols, "name", "falcon");
  tcmapput2(cols, "age", "31");
  tcmapput2(cols, "lang", "ja");
  if(!tctdbput(tdb, pkbuf, pksiz, cols)){
    ecode = tctdbecode(tdb);
    fprintf(stderr, "put error: %s\n", tctdberrmsg(ecode));
  }
  tcmapdel(cols);

  /* store a record with a TSV string */
  if(!tctdbput3(tdb, "abcde", "name\tjoker\tage\t19\tlang\ten,es")){
    ecode = tctdbecode(tdb);
    fprintf(stderr, "put error: %s\n", tctdberrmsg(ecode));
  }

  /* search for records */
  qry = tctdbqrynew(tdb);
  tctdbqryaddcond(qry, "age", TDBQCNUMGE, "20");
  tctdbqryaddcond(qry, "lang", TDBQCSTROR, "ja,en");
  tctdbqrysetorder(qry, "name", TDBQOSTRASC);
  tctdbqrysetlimit(qry, 10, 0);
  res = tctdbqrysearch(qry);
  for(i = 0; i < tclistnum(res); i++){
    rbuf = tclistval(res, i, &rsiz);
    cols = tctdbget(tdb, rbuf, rsiz);
    if(cols){
      printf("%s", rbuf);
      tcmapiterinit(cols);
      while((name = tcmapiternext2(cols)) != NULL){
        printf("\t%s\t%s", name, tcmapget2(cols, name));
      }
      printf("\n");
      tcmapdel(cols);
    }
  }
  tclistdel(res);
  tctdbqrydel(qry);

  /* close the database */
  if(!tctdbclose(tdb)){
    ecode = tctdbecode(tdb);
    fprintf(stderr, "close error: %s\n", tctdberrmsg(ecode));
  }

  /* delete the object */
  tctdbdel(tdb);

  return 0;

}

Ответы [ 3 ]

2 голосов
/ 14 октября 2010

Файл примера, очевидно, предназначен для компиляции как C, а не как C ++. Приведение rbuf = tclistval(res, i, &rsiz); (rbuf имеет тип const char*) допустимо в C, но в C ++ вам нужно быть явным. Кажется, вы настроили Eclipse для компиляции исходного файла как C ++ - если приведение является единственной ошибкой, которую вы получаете, вы можете решить ее так:

rbuf = (const char*)tclistval(res, i, &rsiz); // explicit cast to const char*

Или измените настройки для компиляции как C.

Возможно, вам понадобится окружить заголовочные файлы Tokyo Cabinet символом extern C { ... }, если они сами не поддерживают включение в C ++.

1 голос
/ 14 октября 2010

Tokyocabinet выглядит как библиотека c. В c вы можете привести указатель любого типа к (void *) и (void *) к любому типу. Как это:

int *array = malloc(10*sizeof(int));

В c ++ это запрещено, вы должны кастовать вручную:

int *array = (int *)malloc(10*sizeof(int));
1 голос
/ 14 октября 2010

вы пытаетесь заполнить один из столбцов (char *) в своих функциях, который имеет тип void *, если вы увидите строку, в которой появляется эта ошибка, вы узнаете, что делаете.

Это общая ошибка С ++, я ничего не имею к токиокабинету, это то, во что я верю.

- Приветствия

...