domanda sulla funzione main() del linguaggio c

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
dark0s
Linux 3.x
Linux 3.x
Messaggi: 556
Iscritto il: lun 10 gen 2005, 0:00

domanda sulla funzione main() del linguaggio c

Messaggio 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... :?

homer84
Linux 2.x
Linux 2.x
Messaggi: 297
Iscritto il: gio 9 giu 2005, 0:00
Slackware: Current
Località: Torino

Messaggio 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

homer84
Linux 2.x
Linux 2.x
Messaggi: 297
Iscritto il: gio 9 giu 2005, 0:00
Slackware: Current
Località: Torino

Messaggio 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

dark0s
Linux 3.x
Linux 3.x
Messaggi: 556
Iscritto il: lun 10 gen 2005, 0:00

Messaggio 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?

Avatar utente
TheSnowBoarder
Linux 1.x
Linux 1.x
Messaggi: 139
Iscritto il: gio 30 giu 2005, 0:00
Località: Catania

Messaggio da TheSnowBoarder »

scrivere

char *pippo = "ciao";

è diverso dalla scrivere

char pippo[] ="ciao";

la seconda dichiarazione equivale allo scrivere

const char * pippo = "ciao";

Avatar utente
TheSnowBoarder
Linux 1.x
Linux 1.x
Messaggi: 139
Iscritto il: gio 30 giu 2005, 0:00
Località: Catania

Messaggio 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 !

homer84
Linux 2.x
Linux 2.x
Messaggi: 297
Iscritto il: gio 9 giu 2005, 0:00
Slackware: Current
Località: Torino

Messaggio 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

dark0s
Linux 3.x
Linux 3.x
Messaggi: 556
Iscritto il: lun 10 gen 2005, 0:00

Messaggio da dark0s »

Per TheSnowBoarder:
...puntatore costante
Cosa intendi per puntatore costante?
Ultima modifica di dark0s il mar 20 set 2005, 0:19, modificato 1 volta in totale.

homer84
Linux 2.x
Linux 2.x
Messaggi: 297
Iscritto il: gio 9 giu 2005, 0:00
Slackware: Current
Località: Torino

Messaggio 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

dark0s
Linux 3.x
Linux 3.x
Messaggi: 556
Iscritto il: lun 10 gen 2005, 0:00

Messaggio da dark0s »

Riguardo al valore di ritorno, 0 se tutto è andato bene altrimenti un valore diverso da zero se non ricordo male?

homer84
Linux 2.x
Linux 2.x
Messaggi: 297
Iscritto il: gio 9 giu 2005, 0:00
Slackware: Current
Località: Torino

Messaggio 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

dark0s
Linux 3.x
Linux 3.x
Messaggi: 556
Iscritto il: lun 10 gen 2005, 0:00

Messaggio da dark0s »

Ok, grazie mille!

Avatar utente
gallows
Staff
Staff
Messaggi: 3471
Iscritto il: lun 20 set 2004, 0:00
Desktop: cwm
Distribuzione: OpenBSD
Località: ~/
Contatta:

Messaggio 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...

homer84
Linux 2.x
Linux 2.x
Messaggi: 297
Iscritto il: gio 9 giu 2005, 0:00
Slackware: Current
Località: Torino

Messaggio 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

Avatar utente
gallows
Staff
Staff
Messaggi: 3471
Iscritto il: lun 20 set 2004, 0:00
Desktop: cwm
Distribuzione: OpenBSD
Località: ~/
Contatta:

Messaggio 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 :)

Rispondi