Определение собственных основных функций аргументов argc и argv - PullRequest
23 голосов
/ 05 октября 2009

Я хочу создать объект типа QApplication, которому в качестве входных данных нужны аргументы основных функций argc и argv:

QApplication app(argc, argv);

Поскольку я нахожусь в пользовательской функции без доступа к основной функции, я хочу определить эти аргументы самостоятельно. Я пробовал несколько подходов, но я не могу получить правильное преобразование типов. Мой последний подход тоже не сработал:

int argc = 1;
char **argv; 
char arguments[1][12] = {{"cgalExample"}};
argv = arguments;

Спасибо за любую подсказку.

Ответы [ 6 ]

33 голосов
/ 05 октября 2009

Быстро и грязно, но работает на QApplication:

char *argv[] = {"program name", "arg1", "arg2", NULL};
int argc = sizeof(argv) / sizeof(char*) - 1;

Более полное и соответствующее стандарту C решение см. Ответ Д. Шоули .

Почему ваше решение не работает, просто:

array[i][j] приводит к матрице i*j. Но на самом деле вам нужен массив с указателями на строки.

32 голосов
/ 05 октября 2009

Если вы хотите быть безумно подвесным, вам нужно что-то вроде следующего. Ключевыми моментами являются то, что argv не является const, argv является NULL завершенным, argc является количеством используемых элементов в argv , включая имя программы . Он должен быть изменяемым, поэтому вы не можете использовать строковые литералы - argv[i] требуется для указания на модифицируемый массив символов.

int my_main() {
    char  arg0[] = "programName";
    char  arg1[] = "arg";
    char  arg2[] = "another arg";
    char* argv[] = { &arg0[0], &arg1[0], &arg2[0], NULL };
    int   argc   = (int)(sizeof(argv) / sizeof(argv[0])) - 1;

    QApplication the_application(argc, &argv[0]);
    return the_application.run();
}

Стандарт (ISO / IEC 9899: 1999 раздел 5.1.2.2.1) гласит, что в отношении argc и argv в размещенной среде верно следующее:

  • Значение argc должно быть неотрицательным.
  • argv[argc] должен быть нулевым указателем.
  • Если значение argc больше нуля, элементы массива от argv[0] до argv[argc-1] включительно должны содержать указатели на строки, которым передаются значения, определяемые реализацией средой хоста до запуска программы из другого места в среде хоста. Если среда хоста не способна снабжать строки буквами как в верхнем, так и в нижнем регистре, реализация должна обеспечивать получение строк в нижнем регистре.
  • Если значение argc больше нуля, строка, на которую указывает argv[0], представляет имя программы ; argv[0][0] должен быть нулевым символом, если имя программы недоступно из среды хоста. Если значение argc больше единицы, строки, на которые указывают argv[0] - argv[argc-1], представляют программные параметры .
  • Параметры argc и argv и строки, на которые указывает массив argv, должны изменяться программой и сохранять их последние сохраненные значения между запуском программы и завершением программы.

QApplication гласит следующее:

Предупреждение: Данные, на которые ссылаются argc и argv, должны оставаться действительными для всю жизнь QApplication объект. Кроме того, argc должно быть больше нуля и argv должны содержать хотя бы один действительный символ строка.

...

Примечание: argc и argv могут быть изменены поскольку Qt удаляет аргументы командной строки что он признает.

3 голосов
/ 05 октября 2009

Как насчет ...

int argc = 2;
const char* argv[] ={"program","first-argument"}; 

... или если вы хотите, чтобы они были неконстантными ...

int argc = 2;
char* argv[] ={strdup("program"),strdup("first-argument")}; 
3 голосов
/ 05 октября 2009

Почему вы относитесь к размеру текста в argv, я просто позволю компилятору сделать это:

int argc = 1;
char* argv[] = {"Hello Qt!"}; // exactly as it is defined in main
0 голосов
/ 05 октября 2009

Хотя ни в стандартах C, ни в C ++ этого не требуется, большинство компиляторов предоставляют вам аргументы main как _argv и _argc. Если память служит, POSIX требует этого. В любом случае вам нужно использовать что-то вроде:

extern int _argc;
extern char *_argv[];

и оттуда вы можете использовать их как обычно.

0 голосов
/ 05 октября 2009

Я надеюсь, что это работает:

char* argv[1];
argv[0] = "cgalExample";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...