Я пытаюсь использовать функцию 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);
Может быть, const_cast? – Elyasin
Используйте 'const_cast' –
@ n.m. как? см. мое редактирование – nass