Как передать std :: vector & lt; std :: string & gt; как символ **?

Я пытаюсь сделать копию char *argv[] так что я могу передать их функции, которая принимает char**, Сначала я должен удалить некоторые флаги с оригинала argv:

int main(int argc, char* argv[]) {
::MessageBox(0,"Stopped at the entry point",0,0);
std::string inChannelParam = "--ipc-in-channel";
std::string outChannelParam = "--ipc-out-channel";

std::string inChannelName;
std::string outChannelName;

std::vector<std::string> argv_copy;
for(int i=0; i<argc; ++i)  {
if(inChannelParam == argv[i]) {
if(++i < argc) {
inChannelName = argv[i];
continue;
}
} else if(outChannelParam == argv[i]) {
if(++i < argc) {
outChannelName = argv[i];
continue;
}
}
argv_copy.push_back(argv[i]);
}

std::vector<std::unique_ptr<char[]> > argv_copy_char;
for(int i=0;i<argv_copy.size();++i) {
argv_copy_char.push_back(std::unique_ptr<char[]>(new char[argv_copy[i].size()+1]));
memcpy(argv_copy_char[i].get(), &argv_copy[i][0], argv_copy[i].size());
argv_copy_char[i][argv_copy[i].size()] = '\0';
}

// what should i put here ?? --------------------vvv
v8::V8::SetFlagsFromCommandLine(&argc, &(argv_copy_char[0].get()), true);

Я попытался использовать как строковый, так и char [] подход. Это дает ошибки компилятора:

error C2102: '&' requires l-value

С помощью &(argv_copy_char[0]._Myptr) дает мне ошибки во время выполнения в

if (arg != NULL && *arg == '-') { в flags.cc,

Сигнатура функции SetFlagsFromCommandLine имеет вид

SetFlagsFromCommandLine (int *argc, char **argv, bool remove_flags),

Что я должен делать ?

0

Решение

Вы построили и заполнили вектор строк: std::vector<std::string> argv_copy; но
Я не понимаю, почему вы решили использовать этот вектор для создания другого вектора, который будет содержать элементы типа unique_ptr<char[]>:

std::vector<std::unique_ptr<char[]> > argv_copy_char;

Также обратите внимание, что прототип v8::V8::SetFlagsFromCommandLine является:

static void SetFlagsFromCommandLine (int *argc, char **argv, bool remove_flags)

… разоблачить внутренности вектора было бы не очень удачной идеей здесь, так как argv_copy содержит объекты типа std::string… все же API требует char**Итак, что вы можете сделать, это динамически распределить и заполнить временный массив C-style указателей на эти строки:

// temporary C-style array
int myArgvSize = argv_copy.size();
char* myArgv[] = new char* [myArgvSize];
for (int i = 0; i < myArgvSize; ++i)
myArgv[i] = &argv_copy[i][0];

v8::V8::SetFlagsFromCommandLine(&myArgvSize, myArgv, true);

// cleanup:
delete[] myArgv;

просто отметим, что это решение опирается на тот факт, что SetFlagsFromCommandLine не будет изменять длину этих строк.

3

Другие решения

почему SetFlagsFromCommandLine получает указатель на целое число? это нужно изменить целое число? Я не понимаю, почему вы хотите передать указатель на него.

также проблема, кажется, находится в совершенно другом месте, поэтому код, которым вы поделились, не очень полезен

наконец, посмотрите на строку, в которой вы получили ошибку. check:

  1. что такое arg? это определено?
  2. Можно arg быть NULL?
  3. является arg указатель или массив?
1

SetFlagsFromCommandLine выглядит как довольно специальная функция
мне, в этом, кажется, ожидать argc а также argv как
аргументы и модифицирует их (предположительно, удалив варианты).
Если это вообще возможно, я бы назвал это первым, с argc а также
argvи сделаю мою специальную обработку после. Модификация
вероятно, имеет место в виде смещения указателей в argv
вниз, что означает, что любое решение, использующее std::vector будут
потребовать некоторой дополнительной обработки после вызова функции.

Если вы не можете изменить порядок обработки (например, потому что
--ipc-in-channel и его аргумент может быть извлечен
SetFlagsFromCommandLine), тогда вам, вероятно, понадобится что-то
как следующее (после того, как вы проанализировали свои аргументы):

std::vector<char*> tmp;
for ( auto current = argv_copy.begin();
current != argv_copy.end();
++ current ) {
tmp.push_back( current->empty ? "" : &(*current)[0] );
}
int argc_copy = tmp.size();
SetFlagsFromCommandLine( &argc_copy, &tmp[0] );
if ( argc_copy != argv_copy.size() ) {
auto dest = argv_copy.begin();
auto src = tmp.begin();
while ( dest != argv_copy.end() ) {
if ( (*src)[0] == '\0' ) {
if ( *dest != "" ) {
++ dest ;
} else {
while ( dest != argv_copy.end() && *dest != "") {
dest = argv.erase( dest );
}
}
} else {
if ( !dest->empty() && &(*dest)[0] == *src ) {
++ dest;
} else {
while( dest != argv_copy.end()
&& (dest->empty() || &(*dest)[0] != *src) ) {
dest = argv.erase( dest );
}
}
}
}
assert( argv_copy.size() == argc_copy );
}

Это только с моей головы, и, вероятно, содержит некоторые
ошибки, но это дает представление о необходимых усилиях если вы
не могу позвонить SetFlagsFromCommandLine первый.

РЕДАКТИРОВАТЬ:

В качестве альтернативы, и хотя это немного болезненно, вы можете
процесс argc а также argv точно так же
SetFlagsFromCommandLine делает внутренне, не ставя их
в std::vector:

int dest = 1;
int source = 1;
while ( source != argc ) {
if ( inChannelParam == argv[source] == 0 && source < argc - 1 ) {
inChannelName = argv[source + 1];
source += 2;
} else if ( outChannelPara == argv[source] == 0 && source < argc - 1 ) {
outChannelName = argv[source + 1];
source += 2;
} else {
argv[dest] = argv[source];
++ dest;
++ source;
}
}
argc = dest;
SetFlagsFromCommandLine( &argc, argv );
std::vector<std::string> argv_copy( argv, argv + argc );

Это не весело иметь дело с char** и др., но так как вам нужно
этот формат позже, это, вероятно, меньше боли, чем перевод
несколько раз между форматами.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector