Aiuto C - dubbi


xiloforo
 Share

Recommended Posts

Salve a tutti, sto cercando di capire un codice scritto in C. Io uso un macbook, e programmo con Xcode. Sono imbranatissimo, programmo da circa un mese, e mi blocco di fronte a problemi stupidi. Sicuramente questi, ma se no mi aiutate non vado avanti:

In questo codice ho trovato queste cose

...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;   cur_arg = 0;   a_mod = 0.25;   a_fact= 0.25;   a_cue = 0.5;   Num_u = Max_u;   Num_s = Max_s;   Num_c = Max_c;   Num_p = 25;   N_runs  = Max_runs;   N_steps = 30;   N_iter  = Max_iter;   N_fact  = Fact_units;   N_steps_input = 3;   b1 = 0.1;   b2 = 0.03;   b3 = 0.01;   beta = 15.0;   rbeta = 0.0;   a_pf = 0.5;   w_ext = 2.0;   eps = 0.000001;   fact_eigen_slope = 0.02;   /* 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]);       }.......

Ho messo solo alcune cose. ho tagliato prima e dopo.

1) main(int argc, char *argv[]) : Il main prende dei valori (argc e argv) ma da dove? cosa entra nella funzione main? spiegatemelo semplicemente, o se sapete dovo posso trovare spiegazioni facili indirizzatemi.

2) #define Match(arg) (strcmp(argv[cur_arg], (arg)) == 0): che significa questa cosa? MAtch cos'è? una funzione? ma non c'è nel programma... e cosa compara dopo strccmp? Aiutooooo!!!!

3) if Match("-runs")

{

N_runs = atoi(argv[++cur_arg]);: e qui? stesso problema... che significa se Match con quel runs? da dove lo prende? :( sono disperato... :(

Link to comment
Share on other sites

1) main(int argc, char *argv[]) : Il main prende dei valori (argc e argv) ma da dove? cosa entra nella funzione main? spiegatemelo semplicemente, o se sapete dovo posso trovare spiegazioni facili indirizzatemi.

http://en.wikipedia.org/wiki/Main_function_(programming)#C_and_C.2B.2B

Li prende generalmente dalla linea di comando: ad esempio se scrivi:

$ ./MyProgram.out uno due tre

avrai:

argc = 4; //numero di stringhe C contenute nel vettore di stringhe argv

argv[0] = "./MyProgram.out";

argv[1] = "uno";

argv[2] = "due";

argv[3] = "tre";

Per inserire gli argomenti da Xcode vedi:

http://www.macitynet.it/forum/showthread.php?t=59719

2) #define Match(arg) (strcmp(argv[cur_arg], (arg)) == 0): che significa questa cosa? MAtch cos'è? una funzione? ma non c'è nel programma... e cosa compara dopo strccmp? Aiutooooo!!!!

http://en.wikipedia.org/wiki/C_preprocessor

Definisce una macro funzione: ogni volta che il preprocessore vedrà scritto

Match("stringa che vuoi")

lo sostituirà con

(strcmp(argv[cur_arg], ("stringa che vuoi")) == 0)

ovvero controlla che la stringa cur_arg del vettore di stringhe argv sia uguale o no a "stringa che vuoi"

3) if Match("-runs")

{

N_runs = atoi(argv[++cur_arg]);: e qui? stesso problema... che significa se Match con quel runs? da dove lo prende? :( sono disperato... :(

se la stringa cur_arg di argv è "-runs", allora prende la stringa successiva di argv (incrementando cur_arg), la converte ad intero ed assegna l'intero ad N_runs.

http://en.wikipedia.org/wiki/Atoi

Link to comment
Share on other sites

no in doc? ok... txt?

ma la domanda mia è: se io non inserisco niente nella linea di comando, faccio semplicemente partire il programma, cosa succede? ho visto che il programma parte, e va, è immensamente lungo, l'ho lasciato 6 ore lì, e ancora andava. Quindi, devo inserire per forza qualcosa? e se sì cosa? :( sono disperato... non mi laurerò mai... avrei dovuto fare informatica, invece che psicologia :)

Link to comment
Share on other sites

Sono riuscito ad inserire degli argomenti. Un passo avanti. :) ora il problema è: ma quali argomenti devo inserire?

Visto che c'è, ad esempio, if Match("-runs"), devo inserire tra gli argomenti "-runs"? O secondo te quel programma che ho allegato lo fa in automatico?

Link to comment
Share on other sites

perfetto, credo di aver capito.

CREDO :)

dunque, se io non do alcun argomento, mi assume quelli, e passa direttamente a /* print out_file header with all the parameters */ saltando tutta la parte che c'è dopo /* accept deviations from defaults */

quindi potrei addirittura togliere tutta quella parte, e cambiare manualmente le variabili che sono state assegnate a /* give default values for parameters */ ogni volta che voglio cambiare qualcosa, no?

dimmi di si ti prego :) non ce la faccio più a sentirmi come uno scemo :)

Link to comment
Share on other sites

scusate, vorrei porre anche io un problema che ho riscontrato in un programma in c

#include<stdio.h>

#include<conio.h>

main ()

{

float op; // variabile usata per scegliare le operazioni

float a,b; // i due numeri che rappresentano gli operandi

float r; // risultato fra le operazioni tra a e b

printf ("Inserire due Numeri");

scanf("%.2f,%.2f",&a,&b);

printf("\n Selezionare l'operazione=");

printf("\n Somma 1");

printf("\n Differenza 2");

printf("\n Prodotto 3");

printf("\n Divisione 4");

scanf("%f",&op); // lettura dell'operazione

if (op==1)

{

r=a+b;

printf("\n L'operazione di somma fra i due numeri, restituisce come risultato:%.2f",r);

}

else

{

if (op==2)

{

r=a-b;

printf("\n L'operazione di differenza fra i due numeri, restituisce come risultato:%.2f",r);

}

else

{

if (op==3)

{

r=a*b;

printf("\n L'operazione di moltiplicazione fra i due numeri, restituisce come risultato:%.2f",r);

}

else

{

if (op==4)

{

r=a/b;

printf("\n L'operazione di divisione fra i due numeri, restituisce come risultato:%.2f",r);

}

else

{

printf("\n Il numero inserito per selezionare l'operazione, non è valido");

}

}

}

}

getch();

}

il programma mi dovrebbe dare la possibilità di eseguire una scelta fra le quattro operazioni, potre farlo con switch ma non capisco proprio perchè non funziona...:(

Link to comment
Share on other sites

E' sbagliato l'annidamento.

else if (condizione) { blocco }

non else { if (blocco) } condizione.

In secondo luogo, nell'if poni la variabile op == 4. Non sarà mai un numero intero, per il semplice motivo che hai utilizzato una variabile di tipo float per contenere il numero. Verrà effettuato un casting implicito .. ad esempio se digiti 4 nella variabile sarà contenuto il valore 4.00, che è diverso da 4. Quindi usa variabili di tipo intere per le scelte numeriche (risparmi anche in termini di memoria).

Al di la' di ciò... non è che potresti farlo con switch/case: *dovresti* farlo con switch/case. E' pensato apposta per problemi come questo.

P.S.: Nel caso di a/b (questo è un errore di tipo logico, non di sintassi.. e sono i peggiori perchè dal punto di vista del codice va tutto bene, ma il programma poi si pianta dal nulla) poni un controllo "nel controllo". In meta-codice ----> if (a/b) { if (b==0) esci; blablablabla}.

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