Моделирование ввода из командной строки - PullRequest
0 голосов
/ 08 декабря 2018

Я пытаюсь встроить код dcraw в свое приложение.dcraw - программа командной строки для обработки необработанных изображений на языке c.Чтобы минимизировать изменения в dcraw, я решил, что имитирую входные данные командной строки для основной функции dcraw и переименую основную функцию.Код ниже:

int main() {
int errorReturn;
const char *argArray[5];
argArray[0] = "dcraw";
argArray[1] = "-v";
argArray[2] = "-w";
argArray[3] = "-T";
argArray[4] = "/path/to/file";
errorReturn = dcraw_main (5, (const char **)argArray);
printf("errorReturn = %d\n", errorReturn);
return errorReturn;
}

где основная функция dcraw теперь:

int dcraw_main (int argc, const char **argv);

Проблема в том, что если существует нечетное количество аргументов (5 в показанном примере),Я получаю:

Terminated due to signal: ABORT TRAP (6)
errorReturn = 0

Если есть четное количество аргументов, я не получаю эту ошибку.

Я запускаю приведенный выше код в CodeRunner.Когда я встраиваю код в свое приложение, main () переименовывается, потому что в приложении уже есть функция main ().Однако он ведет себя аналогично и зависает.

Есть ли проблема с симуляцией ввода в программу командной строки таким образом?ТИА.

1 Ответ

0 голосов
/ 08 декабря 2018

Массив аргументов завершается нулем, и символы строк должны не быть const - программам на C разрешено изменять аргументы, передаваемые в main.

Используйте, например, это (обратите внимание, что вам нужно free каждый из этих аргументов, поскольку они копируются в изменяемые строки с помощью strdup):

#define arg(a) strdup(a)

char *argArray[] = {
    arg("dcdraw"), 
    arg("-v"), 
    arg("-w"),
    arg("-T"), 
    arg("/path/to/file"), 
    NULL
};
int argc = sizeof argArray / sizeof *argArray - 1;

или это (Составной литерал C99, не пропускает память, но имеет область действия!):

#define arg(a) (char[]){a}

char *argArray[] = {
    arg("dcdraw"), 
    arg("-v"), 
    arg("-w"),
    arg("-T"), 
    arg("/path/to/file"), 
    NULL
};
int argc = sizeof argArray / sizeof *argArray - 1;

Составной инициализатор C99 имеет время жизни блока, поэтому он будет недоступен после окончания текущего блока { ... }.


В вашем случае, поскольку он работал для некоторого числа аргументов, это намекало бы на то, что причиной было отсутствие терминатора NULL, но в общем случае это то, что вы хотели бы сделать.

...