Моделирование аргументов командной строки во время выполнения
У меня есть библиотека, которая имеет собственный механизм синтаксического анализа аргументов командной строки, когда библиотека скомпилирована как отдельный двоичный файл, и вот код:
int main( int argc, char **argv )
{
int result;
argc = wool_init( argc, argv );
....
}
int wool_init( int argc, char **argv )
{
us_elapsed();
argc = decode_options( argc, argv );
.....
}
Теперь я статически связываю эту библиотеку с другой, которая имеет собственный механизм синтаксического анализа командной строки и аргументы. Я хотел бы инициализировать эту первую библиотеку с некоторыми аргументами во время выполнения, например, я передаю эти аргументы в командной строке:
/* initializing wool run-time environment */
char **woolArg;
*woolArg[0] = "-p 3";
wool_init(1, woolArg);
Но я получаю следующую ошибку.
:113:14: error: assignment makes integer from pointer without a cast [-Werror]
*woolArg[0] = "-p 3";
^
Может кто-нибудь помочь, пожалуйста?
3 ответа
Давайте посчитаем звезды.
char **woolArg;
Две звезды в декларации.
woolArg[0]
Это использует одну звезду. Мы остались с char*
,
*woolArg[0]
Это использует еще одну звезду. Мы остались с char
,
*woolArg[0] = "-p 3";
E сть char*
на правой стороне задания. char
а также char*
это две разные вещи. Вы можете попробовать
woolArg[0] = "-p 3";
... только это не сработает, потому что woolArg
неинициализирован и поэтому вы не можете коснуться woolArg[0]
, Но вместо того, чтобы пытаться это исправить, только чтобы застрять в следующей проблеме, а затем в следующей и после нее, изучите простую и правильную форму:
char* woolArg[] = { "library", "-p", "3", NULL };
Первая строка произвольна. Ты можешь использовать argv[0]
вот если это доступно.
woolArg = malloc(sizeof(char *) * 3/*number of args*/);
woolArg[0] = /*program name*/;
woolArg[1] = "-p";
woolArg[2] = "3";
Давайте отложим вопросы управления памятью, другие ответы здесь уже имеют дело с этим. Давайте объясним сообщение об ошибке. Ваше заявление:
*woolArg[0] = "-p 3";
Какие бывают типы?
woolArg
этоchar **
*woolArg
этоchar *
*woolArg[0]
этоchar
"-p 3"
этоchar[]
но распадается вchar *
Таким образом, левая сторона вашего задания ожидает char
, но правая сторона обеспечивает char *
, Отсюда предупреждение / ошибка, что вы неявно превращаете указатель в целое число.
Чтобы это исправить, вам нужно избавиться от косвенности:
woolArg[0] = "-p 3";