2009-10-05 24 views
18

Quiero crear un objeto de tipo QApplication que necesita las funciones principales argumentos argc y argv como entrada:Definición propia funciones principales argumentos argc y argv

QApplication app(argc, argv); 

Desde que estoy dentro de una función definida por el usuario sin acceso Para la función principal, quiero definir estos argumentos por mi cuenta. He intentado varios enfoques, pero no puedo obtener la conversión de tipo correcta. Mi último enfoque tampoco funcionó:

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

Gracias por cualquier pista.

+0

Podrían aclarar lo que no funcionó? ¿No compiló? error al ejecutar? no haciendo lo que esperabas? – DVK

+0

Error del compilador en Visual Studio 2008: no se pueden convertir los tipos. La sugerencia de gs funcionó bien. –

Respuesta

28

rápida y sucia, pero trabajando para QApplication:

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

Para una solución que sigan los estándares C más completa y ver D.Shawley's answer.

Por qué su solución no funciona es simple:

array[i][j] resultados en una matriz i*j. Pero lo que realmente quieres es una matriz con punteros a cadenas.

+0

Muchas gracias. Éste se compila bajo VS 2008. –

+2

Puede que quiera mencionar que el primer argumento es el nombre del programa. – Bill

+1

Corrección de Niza para el nombre del programa y NULL, pero char * aún debe apuntar a cadenas mutables ... las cadenas literales no lo son. – gimpf

3

¿Por qué con respecto a su auto con el tamaño del texto en argv, me acaba de dejar que el compilador lo hagas:

int argc = 1; 
char* argv[] = {"Hello Qt!"}; // exactly as it is defined in main 
+0

Bueno, eso no se compila por una cosa: "error: inicializador incluido en corchetes utilizado para inicializar 'char *'" –

+0

@alex Me compila bien (VC2008). Qué compilador estas usando? – AraK

+0

Sí, pero ¿no es obligatorio que la matriz argv en sí misma tenga terminación nula? – gimpf

3

¿Qué tal ...

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

... o si necesita que sean no-const ...

int argc = 2; 
char* argv[] ={strdup("program"),strdup("first-argument")}; 
+2

Estoy de acuerdo contigo. En general, primero arg es el comando –

-2

Espero que esto funcione:

char* argv[1]; 
argv[0] = "cgalExample"; 
+1

Está inicializando char * con un const char []. ¡Travieso! –

+1

Contrariamente a la afirmación anterior, aquí realmente es un problema ... – gimpf

0

Aunque ni el estándar C ni el estándar C++ lo requieren, la mayoría de los compiladores ponen a su disposición los argumentos principales como _argv y _argc. Si la memoria sirve, POSIX requiere esto. De todos modos, necesita usar algo como:

extern int _argc; 
extern char *_argv[]; 

y desde allí puede usarlos como de costumbre.

24

Si quieres ser insensatamente colgante, entonces quieres algo como lo siguiente. Los puntos clave son que argv no es const, argv es NULL terminado, argc es la cantidad de elementos utilizables en argvque incluye el nombre del programa. Se requiere que sea modificable para que no pueda usar literales de cadena. Se requiere argv[i] para apuntar a una matriz modificable de caracteres.

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 Normalización (ISO/IEC 9899: 1999 apartado 5.1.2.2.1) afirma que lo siguiente es cierto acerca de 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 matriz argv[0] través argv[argc-1] inclusive deberá contener punteros a cadenas, que se dan valores definido por la implementación por el entorno de acogida antes de programa de inicio de otras partes de el entorno alojado Si el entorno de host no es capaz de suministrar cadenas con letras en mayúsculas y minúsculas, la implementación se asegurará de que las cadenas se reciban en minúsculas.
  • Si el valor de argc es mayor que cero, la cadena apuntada por argv[0] representa el nombre del programa ; argv[0][0] será el carácter nulo si el nombre del programa no está disponible desde el entorno host. Si el valor de argc es mayor que uno, las cadenas apuntado por argv[0] través argv[argc-1] representan los parámetros del programa .
  • Los parámetros argc y argv y las cuerdas a la que apunta la matriz argv será modificable por el programa, y ​​conservar sus valores de último almacenados entre el inicio del programa y finalización del programa.

QApplication indica lo siguiente:

Warning: The data referred to by argc and argv must stay valid for the entire lifetime of the QApplication object. In addition, argc must be greater than zero and argv must contain at least one valid character string.

Note: argc and argv might be changed as Qt removes command line arguments that it recognizes.

+0

¡Gracias por esta aclaración! – gimpf

+0

Solo una pregunta, ¿no debería ser (int) ((sizeof ...) - 1)? De lo contrario, argc [argv] apuntará uno más allá de NULL ... – gimpf

+0

@gimpf: me acabo de dar cuenta de eso. Gracias. –