Pagina 1 di 2

domanda sulla funzione main() del linguaggio c

Inviato: lun 19 set 2005, 23:48
da dark0s
Ciao, per la prima volta da quando frequento l'università nella mia vita mi ritrovo a dover programmare per risolvere un problema pratico. :roll:

La domanda riguarda la funzione main() di un programma in c, ovvero:

1) Cosa significano i parametri argc e argv?

2) Che significato ha la sintassi " int main (int argc, char **argv)"

3) Che significato ha invece la sintassi "int main(int argc, char *argv[])"?

e che differenza c'è tra la 2) e la 3)

Ciao... :?

Inviato: lun 19 set 2005, 23:54
da homer84
Come una normale funzione C il main puo ricevere degli argomenti (quando fai un programma C e lo lanci da riga di comando poi dargli dei parametri es: mioProg parametro1)

argc da il numero di argomenti che gli passi al main, mentre argv è un vettore di stringhe che identifica proprio gli argomenti

(es MioProg parametro1 parametro 2) restituisce :

argc = 3 (occhio che conta come parametro anche MioProg)

argv[0] = MioProg
argv[1] = parametro1
argv[2] = parametro2

Attenzione che argv sono stringhe quindi se metti interi devi fare le conversioni! adatte

Inviato: lun 19 set 2005, 23:56
da homer84
**argv è identico a scrivere *argv[]
come è identico scrivere *pippo oppure scrivere pippo[]

Sono solo modi diversi di scrivere la stessa cosa, sia * che [] sono simbolo dei puntatori

Inviato: mar 20 set 2005, 0:03
da dark0s
Un'ultima cosa, visto che l'esempio era

int main...

il tipo ritornato deve essere un intero, se alla fine della funzione metto return 0 allora vuol dire che è tutto ok, altrimenti vorrà dire che qualcosa è andato storto, giusto?

Inviato: mar 20 set 2005, 0:03
da TheSnowBoarder
scrivere

char *pippo = "ciao";

è diverso dalla scrivere

char pippo[] ="ciao";

la seconda dichiarazione equivale allo scrivere

const char * pippo = "ciao";

Inviato: mar 20 set 2005, 0:13
da TheSnowBoarder
Dimenticavo di scrivere che allo stesso modo
char ** argv è diverso da char *argv[]

Anche in questo caso la seconda dichiarazione equivale allo scrivere
const char ** argv;

Può sembrare una precisazione da poco,
ma provare ad assegnare un valore ad un puntatore costante
genera un immediato segmentation fault, e non è una cosa simpatica
passare una serata cercando di capire quale puntatore è andato a quel paese !

Inviato: mar 20 set 2005, 0:14
da homer84
Il mio professore di sistemi operativi all'università non ci a mai detto di scrivere x forze int main ecc...

noi scrivevamo soltanto main ecc, senza int e senza return

Inviato: mar 20 set 2005, 0:16
da dark0s
Per TheSnowBoarder:
...puntatore costante
Cosa intendi per puntatore costante?

Inviato: mar 20 set 2005, 0:16
da homer84
TheSnowBoarder ha scritto:scrivere

char *pippo = "ciao";

è diverso dalla scrivere

char pippo[] ="ciao";

la seconda dichiarazione equivale allo scrivere

const char * pippo = "ciao";

Non vorrei errare, ma in C non puoi asseganre strnghe in quetso modo, devi usare x forza funzioni che lo fanno, e per quanto so io scrivere *pippo o pippo[] è la stessa cosa.. Nella dichiarazione è uguale

Inviato: mar 20 set 2005, 0:22
da dark0s
Riguardo al valore di ritorno, 0 se tutto è andato bene altrimenti un valore diverso da zero se non ricordo male?

Inviato: mar 20 set 2005, 0:29
da homer84
Metti anche quello che vuoi, tanto il valore di ritorno del main non ti interessa praticamente mai, per quello dico che è inutile metterlo

Inviato: mar 20 set 2005, 0:32
da dark0s
Ok, grazie mille!

Inviato: mar 20 set 2005, 0:33
da gallows
homer84 ha scritto:Metti anche quello che vuoi, tanto il valore di ritorno del main non ti interessa praticamente mai, per quello dico che è inutile metterlo
Quindi lo stato di uscita un programma non è piú importante? O__O
return 0 si mette, main è una funzione è deve dare qualcosa...

Inviato: mar 20 set 2005, 0:41
da homer84
Dipende da che programma devi fare, io siceramente x quelle cose universitarie che faccio non mi è MAI stato richiesto di metterci un return al main

Inviato: mar 20 set 2005, 0:48
da gallows
homer84 ha scritto:Dipende da che programma devi fare, io siceramente x quelle cose universitarie che faccio non mi è MAI stato richiesto di metterci un return al main
Ok, ma fa parte del buon programmare... Se ad esempio ho bisogno di integrare un mio script con il tuo programma mi trovo in difficoltá, perchè mi dará un exit status inaspettato.

Codice: Seleziona tutto

> cat foo.c 
#include <stdio.h>
int main(void) {
        puts("ciao");
}
> cc -Wall foo.c 
foo.c: In function `main':
foo.c:4: warning: control reaches end of non-void function
Ti avverte anche gcc :)