c++ - sirve - Definiendo propios argumentos principales funciones argc y argv
para que sirve int argc char*argv[] (6)
¿Por qué te preocupas por ti mismo con el tamaño del texto en argv? Simplemente dejaría que el compilador lo hiciera:
int argc = 1;
char* argv[] = {"Hello Qt!"}; // exactly as it is defined in main
Quiero crear un objeto de tipo QApplication que necesite los argumentos de las funciones principales argc y argv como entrada:
QApplication app(argc, argv);
Dado que estoy dentro de una función definida por el usuario sin acceso a la función principal, quiero definir estos argumentos por mi cuenta. He intentado varios enfoques, pero no puedo obtener el derecho de conversión de tipo. Mi último enfoque tampoco funcionó:
int argc = 1;
char **argv;
char arguments[1][12] = {{"cgalExample"}};
argv = arguments;
Gracias por cualquier pista.
Aunque ni el estándar C ni el C ++ lo requieren, la mayoría de los compiladores hacen que los argumentos estén disponibles para usted como _argv y _argc. Si la memoria sirve, POSIX lo requiere. De todos modos, necesitas usar algo como:
extern int _argc;
extern char *_argv[];
y desde allí puedes usarlos como de costumbre.
Espero que esto funcione:
char* argv[1];
argv[0] = "cgalExample";
Qué tal si...
int argc = 2;
const char* argv[] ={"program","first-argument"};
... o si necesitas que no sean constantes ...
int argc = 2;
char* argv[] ={strdup("program"),strdup("first-argument")};
Rápido y sucio, pero trabajando para QApplication
:
char *argv[] = {"program name", "arg1", "arg2", NULL};
int argc = sizeof(argv) / sizeof(char*) - 1;
Para una solución de conformidad más completa y estándar en C, vea la respuesta de D.Shawley .
Por qué tu solución no funciona es simple:
array[i][j]
da como resultado una matriz i*j
. Pero lo que realmente quieres es una matriz con punteros a cadenas en ella.
Si quieres ser increíblemente pendante, entonces quieres algo como lo siguiente. Los puntos clave son que argv
no es const
, argv
tiene un final argc
, argc
es el número de elementos utilizables en argv
incluido el nombre del programa . Se requiere que sea modificable, por lo que no puede usar literales de cadena: argv[i]
es necesario para apuntar a una matriz de caracteres modificable.
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();
}
La Norma (ISO / IEC 9899: 1999 sección 5.1.2.2.1) establece que lo siguiente es cierto sobre argc
y argv
en un entorno alojado:
- El valor de
argc
será no negativo. -
argv[argc]
será un puntero nulo. - Si el valor de
argc
es mayor que cero, los miembros de la matrizargv[0]
través deargv[argc-1]
inclusive contendrán punteros a cadenas, a los que el entorno de host proporciona valores definidos por la implementación antes del inicio del programa desde otro lugar en el Ambiente alojado. Si el entorno del host no es capaz de suministrar cadenas con letras tanto en mayúsculas como en minúsculas, la implementación garantizará que las cadenas se reciban en minúsculas. - Si el valor de
argc
es mayor que cero, la cadena apuntada porargv[0]
representa el nombre del programa ;argv[0][0]
será el carácter nulo si el nombre del programa no está disponible en el entorno host. Si el valor deargc
es mayor que uno, las cadenas apuntadas porargv[0]
través deargv[argc-1]
representan los parámetros del programa . - Los parámetros
argc
yargv
y las cadenas señaladas por la matrizargv
serán modificables por el programa y conservarán sus últimos valores almacenados entre el inicio del programa y la terminación del programa.
QApplication
establece lo siguiente:
Advertencia: los datos a los que hacen referencia
argc
yargv
deben permanecer válidos durante toda la vida útil del objetoQApplication
. Además,argc
debe ser mayor que cero yargv
debe contener al menos una cadena de caracteres válida....
Nota:
argc
yargv
pueden cambiarse ya que Qt elimina los argumentos de la línea de comandos que reconoce.