2009-10-05 15 views
18

voglio creare un oggetto di tipo QApplication che necessita le funzioni principali argomenti argc e argv come ingresso:Definizione proprio funzioni principali argomenti argc e argv

QApplication app(argc, argv); 

Poiché io sono all'interno di una funzione definita dall'utente senza accesso alla funzione principale voglio definire questi argomenti per conto mio. Ho provato diversi approcci, ma non riesco a ottenere la conversione del tipo giusto. Il mio ultimo approccio non ha funzionato neanche:

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

Grazie per qualsiasi suggerimento.

+0

La prego di chiarire che cosa non ha funzionato? Non hai compilato? errore nell'esecuzione? non facendo quello che ti aspettavi? – DVK

+0

Errore del compilatore in Visual Studio 2008: impossibile convertire i tipi. Suggerimento di gs ha funzionato bene. –

risposta

28

rapido e sporco, ma lavorare per QApplication:

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

Per una soluzione più completa e di serie C conforme vedere D.Shawley's answer.

Perché la soluzione non funziona è semplice:

array[i][j] risultati in una matrice i*j. Ma quello che vuoi veramente è un array con puntatori alle stringhe.

+0

Grazie mille. Questo compila sotto VS 2008. –

+2

Potrebbe voler dire che il primo argomento è il nome del programma. – Bill

+1

Bella correzione per il nome del programma e NULL, ma char * dovrebbe ancora puntare a stringhe mutabili ... le stringhe letterali non lo sono. – gimpf

3

Perché per quanto riguarda la vostra auto con la dimensione del testo in argv, vorrei solo lasciare che il compilatore lo fanno:

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

Bene, questo non viene compilato per una cosa: "errore: inizializzatore racchiuso per inizializzare 'char *'" –

+0

@alex Compila con me (VC2008). Che compilatore stai usando? – AraK

+0

Sì, ma non è necessario che l'array argv stesso sia terminato con null? – gimpf

3

ne dite ...

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

... o se ne avete bisogno di essere non-const ...

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

Sono d'accordo con te. In generale, il primo argomento è il comando –

-2

Spero che questo funziona:

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

Si sta inizializzando il char * con un const char []. Cattivo! –

+1

Contrariamente alla dichiarazione di cui sopra, qui è davvero un problema ... – gimpf

0

Anche se né lo standard C né C++ lo richiede, la maggior parte dei compilatori rende gli argomenti principali disponibili come _argv e _argc. Se la memoria serve, POSIX lo richiede. Ad ogni modo, è necessario utilizzare qualcosa del tipo:

extern int _argc; 
extern char *_argv[]; 

e da lì è possibile utilizzarli come normali.

24

Se vuoi essere pazzamente folle, allora vuoi qualcosa come la seguente. I punti chiave sono che argv non è const, argv è NULL terminato, argc è il numero di elementi utilizzabili in argvincluso il nome del programma. È necessario che sia modificabile in modo che non sia possibile utilizzare stringhe letterali: è necessario specificare argv[i] per selezionare una matrice di caratteri modificabile.

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(); 
} 

Lo standard (ISO/IEC 9899: 1999 sezione 5.1.2.2.1) afferma che il seguente vale per argc e argv in un ambiente ospitato:

  • Il valore di argc deve essere non negativo
  • argv[argc] deve essere un puntatore nullo.
  • Se il valore di argc è maggiore di zero, i membri di matrice argv[0] attraverso argv[argc-1] inclusiva contiene puntatori a stringhe, che sono dati i valori di attuazione definite dall'ambiente ospitante prima programma di avvio da altre parti l'ambiente ospitato. Se l'ambiente host non è in grado di fornire stringhe con lettere maiuscole e minuscole, l'implementazione deve garantire che le stringhe vengano ricevute in lettere minuscole.
  • Se il valore di argc è maggiore di zero, la stringa puntata da argv[0] rappresenta il nome programma; argv[0][0] deve essere il carattere null se il nome del programma non è disponibile dall'ambiente host. Se il valore di argc è maggiore di uno, le corde puntati da argv[0] attraverso argv[argc-1] rappresentano parametri di programmazione.
  • I parametri argc e argv e le stringhe punta il matrice argv sono modificabili dal programma, e mantenere i loro valori dell'ultimo memorizzati tra l'avvio del programma e la terminazione del programma.

QApplication afferma quanto segue:

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

Grazie per questo chiarimento! – gimpf

+0

Solo una domanda, non dovrebbe essere (int) ((sizeof ...) - 1)? Altrimenti argc [argv] punterà il passato su NULL ... – gimpf

+0

@gimpf: ho notato che me stesso. Grazie. –