argc e argv in XCode


manuelmagic
 Share

Recommended Posts

Ciao a tutti,

svolgendo un programma nel quale dovevo passare tramite linea di comando dei parametri, mi sono reso conto che non so come farlo con XCode. Temporaneamente ho usato la console, ma mi piacerebbe poterlo fare anche da XCode. Non ho trovato un "run with parametres"...

Qualcuno mi sa aiutare?

Ciao ciao e grazie in anticipo

Link to comment
Share on other sites

  • 1 month later...

salve. anche io uso xcode. Mettiamo che voglia inserire due parametri, ad esempio "-variabile1" e "-variabile2", la prima uguale a 2 e la seconda a 3. SE non inserisco dati utilizza dei valori di default.

Praticamente, come li inserisco questi dati? Ho trovato la cartella "Arguments" , metto il nome della variabile nella finestra sopra o sotto? Con o senza virgolette? E il valore corrispondente? dove lo metto?

ciao

Link to comment
Share on other sites

Infatti devi mettere il valore corrispondente di ogni variabile che vuoi passare in ingresso, non il nome della variabile stessa. Sta a te poi - nel main - configurare adeguatamente il vettore delle variabili d'argomento affinchè ogni variabile si comporti adeguatamente. Ad esempio se passi come argomenti 3, 4 questi valori saranno copiati in argv[1] e argv[2].

Link to comment
Share on other sites

Ma non so come si fa. Il mio programma è così:

#define Max_iter    10   #define Max_runs    30    ...main(int argc, char *argv[]){   int     seed,cur_arg,iseed,iter,j,n_pa;   int     i,nrun,N_try,patt,step,unit;   char    file_name[80],resfile_name[80];   /* give default values for parameters */   strcpy(file_name, "front_out");    seed = 123456;...   N_runs  = Max_runs;...   N_iter  = Max_iter;      /* accept deviations from defaults */   #define Match(arg)      (strcmp(argv[cur_arg], (arg)) == 0)   while (++cur_arg < argc)   {       if Match("-runs")       {           N_runs = atoi(argv[++cur_arg]);       }        else if Match("-iter")       {           N_iter = atoi(argv[++cur_arg]);       }

Se io non metto alcun dato lui da per scontato che N-runs sia uguale a Max runs, cioè 30, e N-iter uguale a max_iter cioè 10. Voglio però dare come parametro iniziale (argomento) "-runs" uguale a 10 e "-iter" uguale a 5 (e ogni volta modificarlo). Praticamente come lo devo scrivere nella cartella Arguments?

Link to comment
Share on other sites

@MacApp

In questo modo è come se passassi, da linea di comando, gli argomenti

"-runs" "10" "-iter" "3".

Essi verrebbero semplicemente copiati, come *stringhe*, nel vettore argv[].

Avresti:

argv[0] = %nome_programma

argv[1] = -runs

argv[2] = 10

e così via. Ma sarebbero tutti copiati, ripeto, come *stringhe*, e verrebbero copiati nel vettore argv[] così come ho scritto sopra. Inoltre nel programma non vi è alcuna istruzione (almeno nel listato di xiloforo) che dica come usare debitamente gli argomenti passati (l'uso di #define per creare una macro grazie al preprocessore in questo caso è poco, pochissimo ortodosso).

Il passaggio di argomenti in un programma C/C++ (&& derivati) non avviene così. Nella finestrina che ha mostrato MacApp, nel caso dell'amico xiloforo, bisognerebbe inserire semplicemente 10 e 3 come argomenti. Che corrisponderebbero ad argv[1] e argv[2] (non si può cambiare l'ordine di inserimento, N.d.MG.)

Ecco uno stralcio del listato:

#define Max_iter 10   #define Max_runs 30    ...main(int argc, char *argv[]){   int     seed,cur_arg,iseed,iter,j,n_pa;   int     i,nrun,N_try,patt,step,unit;   char    file_name[80],resfile_name[80];   /* give default values for parameters */   strcpy(file_name, "front_out");    seed = 123456;...  if (argv[1] != NULL) N_runs = atoi(argv[1]); else N_runs = Max_runs;  if (argv[2] != NULL) N_iter = atoi(argv[2]); else N_iter = Max_iter;  /* Parte superflua e pragmaticamente inesatta  /* accept deviations from defaults */   #define Match(arg)      (strcmp(argv[cur_arg], (arg)) == 0)   while (++cur_arg < argc)   {       if Match("-runs")       {           N_runs = atoi(argv[++cur_arg]);       }        else if Match("-iter")       {           N_iter = atoi(argv[++cur_arg]);       } */...........

Ovviamente questo programma, così come è scritto è decisamente incompleto e buggato: se inseriamo un carattere alfabetico o speciale la funzione atoi solleverà un'eccezione. Compito del coder catturarla e gestirla ovviamente.

Ora, nella finestrina di MacApp, possiamo andare ad inserire i due valori, che verranno copiati nell'ordine in argv[1] e argv[2] ovvero Max_runs e Max_iter. Se si vuole modificare solo il secondo parametro dovrebbe essere sufficiente inserire come valore del primo parametro due doppi apici ---> "".

Link to comment
Share on other sites

@Michele Gazzaruso

Non mi confondere xiloforo ;) il programmillo con cui xiloforo ha a che fare, è sicuramante, diciamo così, non fatto bene, ma, come ben si vede da:


#define Match(arg) (strcmp(argv[cur_arg], (arg)) == 0)
while (++cur_arg < argc)
{
if Match("-runs")
{
N_runs = atoi(argv[++cur_arg]);
}
else if Match("-iter")
{
N_iter = atoi(argv[++cur_arg]);
}

il programmillo vuole gli argomenti proprio come gli ho fatto vedere io in quella schermata di Xcode, o via terminal:

$ programmillo.out -runs 10 -iter 3

oppure:

$ programmillo.out  -iter 3 -runs 10

vedi che quando fa l'atoi, prima incrementa cur_arg e poi accede ad argv, dopo aver "matchato" con una stringa "-runs", "-iter" ecc..?

;)

Link to comment
Share on other sites

@MacApp

Non mi sono spiegato bene infatti..

Il programma pastato da xiloforo vuole gli argomenti esattamente come tu gli hai detto. Il fatto - però - è che non è questo il metodo giusto per gestire gli argomenti passati da riga di comando/altro. Non è un codice robusto. E mi sono quindi permesso di postare una soluzione più ortodossa.

Tra l'altro, l'uso di direttive da dare al preprocessore (anche se per le macro alla fine dei conti non è molto rilevante) è fortemente sconsigliato in parti del programma interne al main.

Link to comment
Share on other sites

Vi ringrazio entrambi, veramente.

Allora, il programma non l'ho fatto io, è il codice di un programma scritto da un mio professore (non è un programmatore) che devo riuscire a capire per la mia tesi a febbraio. Quindi mi sono messo a studiare un po' il c, ma sono ancora in alto mare. In ogni caso la soluzione di MacApp funziona, ho provato ad inserire gli argomenti in quel modo, e tutto va bene.

Vi ringrazio ancora tutti, a risentirci presto per il mio prossimo problema con questo codice c... :) ciao!!!

Link to comment
Share on other sites

  • 7 years later...

"Get Info" dell'elemento "Finestra del Progetto->Group & Files->Executables->(nome tuo programma)" e selezioni il tab "Arguments" ;)

il thread è molto datato ma siccome non ho trovato altro in giro spero tu mi possa rispiegare anni dopo come si fa, perché da qui non ho capito, probabilmente perché ora Xcode è cambiato (versione attuale 6). devo fare un programma per esercizio che abbia

int main(int argc , char **argv) ma non so poi come eseguirlo con gli argomenti in modo da vedere se funziona. Grazie

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share