передача char ** в функцию (const char **) в переполнении стека

Я пытаюсь использовать функцию rrd_update_r базы данных Round Robin.

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

Функция принимает в качестве 3-го и 4-го аргумента общеизвестный argc, argv,

Несмотря на то, что я использую C ++ (и g ++) для этого проекта, 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]

К моему удивлению, я также не смог найти помощи по этому вопросу. это Почему я не могу конвертировать ‘char **’ в ‘const char * const *’ в C? Решение не сработало.

Так что мне интересно: как я могу передать char ** в 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<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;
}

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

-1

По вопросам рекламы [email protected]