2013-09-02 3 views
-2

Am пытается вызвать evecvp() с этими аргументами:что с этим кодом?

vector<string>subcommand; 
void parse(char *str) 
{ 
    pid_t pid; 
    char *cmd1=(char *)malloc(sizeof(300)); 

    cmd1=strtok(str," "); 
    while(cmd1!=NULL) 
    { 
     subcommand.push_back(cmd1); 
     cmd1=strtok(NULL," "); 
    } 

    subcommand.push_back('\0'); 
    vector<char const*> v(subcommand.size()); 
    for(int i = 0; i < v.size(); ++i) 
    { 
     v[i] = subcommand[i].c_str(); 
    } 

    fork(); 
    if(pid==0) 
     execvp(subcommand[0].c_str(),v); 

} 

Я получаю эту ошибку:

main1.cpp: In function ‘void parse(char*)’: 
main1.cpp:80:34: error: cannot convert ‘std::vector<const char*>’ to ‘char* const*’ for argument ‘2’ to ‘int execvp(const char*, char* const*)’ 

Пробовал все перестановки с типажей, но просто не могу заставить его работать. В чем проблема?

+2

Помимо непосредственной утечки памяти на линиях 5-6? (и *** спасибо *** за сообщение фактического сообщения об ошибке). Независимо от того, смотрите ['execvp()'] (http://linux.die.net/man/3/execvp) документацию, тогда поймите, что вы передаете 'std :: vector ', а не 'char const * arg [] 'для второго аргумента. Я еще не пробовал, но попробуйте передать 'v.data()' вместо этого. Это должно по крайней мере приблизить вас. – WhozCraig

+2

Это название не имеет отношения к вопросу. – chris

ответ

1

Переменная v в заявлении execvp(subcommand[0].c_str(),v);vector<char const*>, в то время как декларация evecvp является int execvp(const char*, char* const*).

+0

Как правильно применить его к требуемому аргументу? –

+0

В C++ 11 используйте [v.data()] (http://en.cppreference.com/w/cpp/container/vector/data) –