Newsgroup: it.comp.lang.c
Titolo: Non trovo l'errore nella compilazione

Ciao a tutti. Nel compilare il seguente programma, che dovrebbe creare 
un semplice server senza alcuna funzione, il compilatore (gcc) mi 
restituisce un errore, mi dice che la funzione "main" si attende un 
intero. Infatti se pongo "int main" al posto di "void main" la 
compilazione va a buon fine. Come mai, tuttavia, questo errore?
Qui di seguito vi posto il prog
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 4000
#define MAXCONN 5
void addr_initialize();
void addr_initialize(struct sockaddr_in *indirizzo, int port, long 
IPaddr)
{
   indirizzo->sin_family = AF_INET;
   indirizzo->sin_port = htons((u_short) port);
            /* htons: host to network conversion, short */
   indirizzo->sin_addr.s_addr = IPaddr;
}
void main(int argc, char * argv[])
{
   int sd,new_sd;
   struct sockaddr_in server_addr;
   struct sockaddr_in client_addr;
   int client_len=sizeof(client_addr);
   addr_initialize(&server_addr, PORT, INADDR_ANY);
   sd=socket(AF_INET,SOCK_STREAM,0);
   bind(sd,(struct sockaddr*) &server_addr,sizeof(server_addr));
   listen(sd,MAXCONN);
   printf("Mi pongo in attesa di richieste di connessione\n");
   printf("sul mio port: %d\n", ntohs(server_addr.sin_port));
   new_sd=accept(sd,(struct sockaddr*) &client_addr, &client_len);
   printf("\n\nHo accettato una connessione\n");
   printf("dal client con port: %d\n\n", ntohs(client_addr.sin_port));
   close(new_sd);
   close(sd);
}
Ciao e grazie
-- 
-Diego (Atos)-
-L'uomo č superiore agli animali-
-Fanno eccezione il nano e la giraffa-
-A.Bergonzoni-
-Per rispondere in privato potare "POTA" dall'indirizzo-

 compilazione va a buon fine. Come mai, tuttavia, questo errore?
la compilazione non ti da' alcun errore.
ti da un "warning", che non e' un errore. infatti se lanci
gcc nomeprog.c -o pippo
pippo viene generato
i warning pero' indicano possibili errori, non di sintassi ma di semantica.
E' quindi bene non ignorarli.
Nel tuo caso, il compilatore "si lamenta" perche' la funzione main non
restituisce un intero.
Nello standard ANSI la funzione main deve restituire un intero. 0 se tutto
va a buon fine. Da qui il warning
Ciao,
Riccardo

 
Quindi? inserisco alla fine un "return 0;"?
Ciao


 Quindi? inserisco alla fine un "return 0;"?
e magari un int main (....) all'inizio ;)

 
ma come mai "void main" restituisce quell'avvertimento?
Non capisco perchč si debba aspettare un intero 


 
Perche' e' una convenzione dell'ansi C.. probabilmente ha
motivi storici, in quanto unix si aspetta un valore di ritorno
da ogni programma eseguito, per sapere se e' andato a buon fine.
Quindi se va tutto bene ritorni 0, altrimenti un numero negativo.
Per i programmi C, l'entry point di ogni programma e' una funzione
di nome main, che prende come parametri un intero e un'array di
puntatori a caratteri e ritorna un intero.
int main( int argc, char *argv )
-- 
                Roberto Nunnari -software engineer-
                     mailto:
ro...@nunnisoft.ch
   Residenza Boschetto 12           tel/fax: 
+41-91-6046511
   6935 Bosco Luganese        """    mobile: 
+41-76-3208561
   Switzerland               (o o)
========================oOO==(_)==OOo========================
-----= Posted via Newsfeeds.Com, Uncensored Usenet News =-----
http://www.newsfeeds.com
 - The #1 Newsgroup Service in the World!
-----==  Over 100,000 Newsgroups - 19 Different Servers! =-----

 da ogni programma eseguito, per sapere se e' andato a buon fine.
Veramente
   void main()
e' "nato" proprio sotto Unix :-)
Il motivo per cui e' necessario (o altamente desiderabile) scrivere
int main()
e' spiegato qui
http://www.eskimo.com/~scs/C-faq/q11.14.html
HTH
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Non capisco perchč si debba aspettare un intero
io credo che, visto che da shell puoi concatenare piu' programmmi, il
return code serva per dire alla shell che il comando eseguito e' andato a
buon fine e puo' continuare con l'esecuzione degli altri oppure deve
terminare.
ad esempio:
cd /sbin && ls
se tu non avessi il permesso di entrare in sbin, il comando ls non
verrebbe nemmeno eseguito perche' al ritorno (errore) di cd terminerebbe
l'esecuzione
spero di non aver detto una mostruosa fesseria ^__^
ciao
-- 
Er Baitch
"Live Your Life!!!" (Ring ain't a jail)
http://baitch.altervista.org/