2015-12-20 19 views
0

Я пытаюсь использовать функцию rrd_update_r в базе данных круглого robin., передающий char ** функции (const char **) в C++

int  rrd_update_r(const char *filename,const char *_template, 
            int argc,const char **argv); 

Функция принимает 3 и 4-рассуждение хорошо известный argc, argv.

Даже если я использую C++ (и г ++) для этого проекта, RRD написана на C и, следовательно, я мог бы использовать функцию wordexp(char *, wordexp_t*), представленную в GNY/Linux для разделения аргументов в string в argv массив.

Проблема заключается в том, что wordexp_t возвращает член типа char ** (как argv), который, по-видимому, несовместим с вызовом функции rrd_update_r.

/usr/include/rrd.h:238:15: error: initializing argument 4 of ‘int rrd_update_r(const char*, const char*, int, const char**)’ [-fpermissive] 

К моему удивлению, я не мог найти никакой помощи по этому вопросу. Это решение Why can't I convert 'char**' to a 'const char* const*' in C? не работает.

Так что я оставляю удивляться: как я могу передать символ ** в const char **?

Полная функция

#include <errno.h> // Error number definitions 
#include <rrd.h> 
#include <wordexp.h> 

void splitToArgs(string& parametersString) //parametersString contains space separated words (parameters). 
{ 
    wordexp_t we; 
    int er = 0; 

    if ((er=wordexp(parametersString.c_str() , &we, 0)) != 0) 
    { 
     cout << "error in word expansion " << er << endl; 
    } 
    else 
    { 
     if (we.we_wordc>0) 
     { 
      char * filename = we.we_wordv[1]; //filename is part of the parameters string 
      rrd_clear_error(); 
      int ret = rrd_update_r(filename , NULL , we.we_wordc, we.we_wordv); 
      if (ret != 0) 
      { 
       cout << "rrd_update error # = " << ret << " error string = " << rrd_get_error() ; 
      } 
     } 
    } 
    wordfree(&we); 
} 

Это использование const_cast (если правильно) также не работает

error: invalid conversion from ‘char**’ to ‘const char**’ [-fpermissive] 
const char **w = const_cast<char**>(we.we_wordv); 
+0

Может быть, const_cast? – Elyasin

+0

Используйте 'const_cast' –

+0

@ n.m. как? см. мое редактирование – nass

ответ

1
const_cast<const char**>(whatever) 

- это правильный путь к const_cast в этом случае.

-1

Я собираюсь дать вам пример проходящее полукокса в перечислении (который фактически константа)

enum TIngrediente 
{ 
    TOMATE, 
    QUESO, 
    NATA, 
    CEBOLLA, 
    POLLO, 
    HUEVO, 
    SALAMI, 
    ANCHOA, 
    BACON, 
    GAMBA 
}; 
string tolower(string s) 
{ 
    string r = s; 
    for (int i = 0; i < s.size(); ++i) 
     r[i] = tolower(r[i]); 
    return r; 
} 

TIngrediente StrToIngrediente(string s) 
{ 
    s=tolower(s); 
    int i; 

    while (i < INGREDIENTES.size() and INGREDIENTES[i] != s) 
     ++i; 
    return (TIngrediente)i; 
} 

Теперь единственное, что вам нужно сделать, это сделать еще одну функцию ch angling снова из const char в char (очень просто) Таким образом, youll trans преобразует константу char в const char, и вам придется добавить библиотеку, cctype и local, чтобы эта работа была выполнена.

+0

Прошу прощения, но это далеко не то, что мне нужно. – nass

+0

Это никоим образом не отвечает на вопрос –

+0

Это делает нулевой смысл. –