Подтвердить что ты не робот

Определение собственных аргументов основных аргументов argc и argv

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

QApplication app(argc, argv);

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

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

Спасибо за любой намек.

4b9b3361

Ответ 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";