Моделирование аргументов командной строки во время выполнения

У меня есть библиотека, которая имеет собственный механизм синтаксического анализа аргументов командной строки, когда библиотека скомпилирована как отдельный двоичный файл, и вот код:

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";
Другие вопросы по тегам