передача char ** функции (const char **) в C++

Я пытаюсь использовать функцию rrd_update_r базы данных циклического перебора.

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);

person nass    schedule 20.12.2015    source источник
comment
@н.м. как? пожалуйста, посмотрите мое редактирование   -  person nass    schedule 20.12.2015
comment
@н.м. да, вы действительно видели мою правку? То, что вы пишете, это то, что я написал, и это не работает. Если вы имели в виду что-то другое, вам придется быть немного более явным   -  person nass    schedule 20.12.2015
comment
Посмотри снова. Это не то, что вы написали.   -  person n. 1.8e9-where's-my-share m.    schedule 20.12.2015
comment
действительно, работал. Спасибо! Не могли бы вы добавить это в качестве ответа? Это имеет смысл.   -  person nass    schedule 20.12.2015


Ответы (2)


 const_cast<const char**>(whatever)

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

person n. 1.8e9-where's-my-share m.    schedule 20.12.2015

Я собираюсь привести вам пример передачи char в перечисление (которое на самом деле является константой)

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 (очень просто). эта работа.

person Vicente Sabio    schedule 20.12.2015
comment
Извините, но это далеко не то, что мне нужно. - person nass; 20.12.2015
comment
Это никак не отвечает на вопрос - person Sami Kuhmonen; 20.12.2015
comment
Это имеет нулевой смысл. - person n. 1.8e9-where's-my-share m.; 20.12.2015