Определение собственных аргументов основных аргументов argc и argv
Я хочу создать объект типа QApplication, которому нужны основные аргументы аргументов argc и argv в качестве ввода:
QApplication app(argc, argv);
Так как я в пределах определенной пользователем функции без доступа к основной функции, я хочу самостоятельно определить эти аргументы. Я пробовал несколько подходов, но я не могу правильно преобразовать тип. Мой последний подход тоже не работал:
int argc = 1;
char **argv;
char arguments[1][12] = {{"cgalExample"}};
argv = arguments;
Спасибо за любой намек.
Ответы
Ответ 1
Быстро и грязно, но работает для QApplication
:
char *argv[] = {"program name", "arg1", "arg2", NULL};
int argc = sizeof(argv) / sizeof(char*) - 1;
Для более полного и стандартного стандартного решения см. ответ Д.Шаули.
Почему ваше решение не работает, просто:
array[i][j]
приводит к матрице i*j
. Но то, что вы на самом деле хотите, это массив с указателями на строки в нем.
Ответ 2
Если вы хотите быть безумно пундантичным, вам нужно что-то вроде следующего. Ключевыми моментом является то, что argv
не const
, argv
is 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
Почему вы относитесь к себе с размером текста в argv, я просто позволю компилятору сделать это:
int argc = 1;
char* argv[] = {"Hello Qt!"}; // exactly as it is defined in main
Ответ 4
Как насчет...
int argc = 2;
const char* argv[] ={"program","first-argument"};
... или если вам нужно, чтобы они не были const...
int argc = 2;
char* argv[] ={strdup("program"),strdup("first-argument")};
Ответ 5
Хотя ни стандарт C, ни С++ не требует этого, большинство компиляторов делают аргументы доступными для вас как _argv и _argc. Если для памяти используется POSIX, это необходимо. Во всяком случае, вам нужно использовать что-то вроде:
extern int _argc;
extern char *_argv[];
и оттуда вы можете использовать их как обычно.
Ответ 6
Надеюсь, это сработает:
char* argv[1];
argv[0] = "cgalExample";