Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565

    C/C++ - Una mia teoria sul main()

    Salve.
    Quello che segue potrebbe non essere vero,forse sono solo considerazioni di un povero pazzo, ma è un tarlo che mi perseguita da tanto tempo.

    Sia in C che in C++, tutti i programmi iniziano con la funzione main()
    Dopo molti programmi con codice sorgente libero visionati, ma anche semplici esempi di internet, molta gente ne scrive il prototipo in questi due modi
    void main()
    int main()
    Per un bel po di tempo, quando non conoscevo il C++ (non è che ora lo conosca, ma almeno comprendo la sintassi di base, ma ad algoritmi sono a 0), non capivo il perchè di void e il perchè di int.
    Facendo alcune considerazioni sono giunto a questa conclusione
    int main() -> completamente inutile.
    void main()-> è quello giusto per iniziare il programma.

    Perchè?
    Avendo scritto INT main(), vuol dire che questa funzione deve restituire un valore, come fa molta gente: quando il programma è stato eseguito correttamente, si fa return 0;, altrimenti return 1;
    Per quanto io ne sappia, per controllare il valore di ritorno della funzione si fa
    codice:
    if (miafunzione() == parametroatteso) {codice}
    Ma questo non lo si può fare dal main, poichè questa è la funzione principale e non ve ne sono altre (in ordine di tempo) prima di questa.
    Impossibile quindi scrivere
    codice:
    if (main() == 0) {codice}
    Quindi
    Perchè scrivere int main() quando non potrai mai e poi mai controllarne il valore di ritorno?

    Considerazioni
    1) Non vi complessate: alla fine è una cazzata mortale, sono quasi certo che non influenzi il programma ne in termini di memoria ne in altro.
    2) Con Gcc invece int main() può essere usato: ho sentito dire in giro che vi è una funzione prima di main, che si chiama void _start() dal quale il controllo si può fare: confermate?

    Grazie a tutti!

  2. #2
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    ...
    ho sentito dire in giro
    ...
    fai le teorie per sentito dire?? :rollo:

    Cmq il codice di uscita viene cmq preso dal programma che ha lanciato il processo in questione, che potrebbe essere il sistema operativo, un altro programma ecc...
    Il codice di uscita, quindi il valore ritornato dalla funzione va oltre il C o il C++.

    Sinceramente il void l'ho usato per main quando non avevo voglia di mettere il return alla fine in qualche esempio, programino di prova o altre cose classificabili come "tipical hello world application".

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Ahhh...quindi il valore di ritorno potrebbe essere usato da altri programmi per controllare se il programma è andato bene.
    In unix questo sarebbe spiegato dal comando di shell
    programma && programma2

    Se non ricordo male && esegue il secondo comando solo se il primo è andato bene.

    fai le teorie per sentito dire??
    hahaha...

    Avete altre spiegazioni?

  4. #4

    Re: C/C++ - Una mia teoria sul main()

    Originariamente inviato da XWolverineX
    Dopo molti programmi con codice sorgente libero visionati, ma anche semplici esempi di internet, molta gente ne scrive il prototipo in questi due modi
    void main()
    int main()
    Per un bel po di tempo, quando non conoscevo il C++ (non è che ora lo conosca, ma almeno comprendo la sintassi di base, ma ad algoritmi sono a 0), non capivo il perchè di void e il perchè di int.
    Facendo alcune considerazioni sono giunto a questa conclusione
    int main() -> completamente inutile.
    void main()-> è quello giusto per iniziare il programma.
    Beh, uhm, eh...
    void main() -> pre standard, discutibile, i compilatori lo fanno ancora passare ma sarebbe deprecato
    int main() oppure int main(int argc, char *argv[]) -> le forme permesse dallo standard.
    C e C++ sono molto simili in questo specifico ambito, se ben ricordo le differenze, se ci sono, sono davvero minime.

    [...]
    Perchè scrivere int main() quando non potrai mai e poi mai controllarne il valore di ritorno?
    Non lo fa il codice stesso, ma il chiamante (shell...)

    1) Non vi complessate: alla fine è una cazzata mortale, sono quasi certo che non influenzi il programma ne in termini di memoria ne in altro.
    Influenzarlo lo influenza, il compilatore quantomeno emette un warning (com'e` piu` che giusto)
    2) Con Gcc invece int main() può essere usato: ho sentito dire in giro che vi è una funzione prima di main, che si chiama void _start() dal quale il controllo si può fare: confermate?
    No, _start serve ad un'altra cosa, se ben ricordo. Dovrebbe essere un'estensione di gcc per consentire un meccanismo simile ai costruttori/distruttori in C++.
    "Qualsiasi esperto ha paura di combattere usando la katana vera. Anch'io. Ma non ignoro la mia paura, riesco ad accettarla, e a metterla da parte accanto a me".

  5. #5
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    è vero: se non metti int main() il compilatore ti darà un warning

  6. #6
    Originariamente inviato da XWolverineX
    ...

    Avete altre spiegazioni?
    Ulteriori spiegazioni no ma un esempio ( ...pratico come piace a me... ) :

    Programma 'figlio' "Int_main.cpp" :
    codice:
     /**
     	* Nome file : "Int_main.cpp"
     	*
     	**/
    
    #include <process.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    int main( int argc, char *argv[] )
    {
    	int a;
    	if( argc == 0 ) return 999;
    	a = atoi(argv[1]);
    	a *= 2;
    	return a;
    }
    Programma 'padre' "Int_main_Parent.cpp" :
    (questo mi funziona solo con il BCC32, con il GCC mi va in crash ... Magari tu riesci a farlo funzionare. )
    codice:
     /**
     	* Nome file : "Int_main_Parent.cpp"
     	*
     	**/
    
    #include <process.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <conio.h>
    
    int main( int , char *argv[] )
    {
       unsigned int numero, result;
       char *parametro, *digit;
       do
       {
       	printf("\nInserisci un numero da passare (0 per uscire): ");
       	scanf("%s", digit);
    		numero = atoi(digit);
    		if(numero>0 )
    		{
       		itoa(numero, parametro, 10);
       		printf("\nPasso il valore : %s", parametro);
       		result = spawnl(P_WAIT, "Int_main.exe", argv[0], parametro, NULL);
       		if (result == -1)
       		{
    	      	perror("Error from spawnl");
    	   		getch();
          		exit(1);
       		}
       		else
    		   	printf("\nValore di ritorno : %i\n", result);
    	   }
       } while(digit[0] != '0' );
       return 0;
    }
    Originariamente inviato da Ikitt
    ...
    void main() -> pre standard, discutibile, i compilatori lo fanno ancora passare ma sarebbe deprecato
    ...
    Quoto
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  7. #7
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Tra l'altro no vale il discorso che il mai è la funzione principale e non lo chiama nessuno: il valore restituito dal main viene acquisito dal runtime, ad esempio se avvii un programma in windows che si conclude con

    return -10;

    alla fine del programma sulla console è scritto:

    Terminated with return code -10
    Press any key to continue ...

    ovvero il valore di ritorno viene comunicato all'esterno del programma e può esere utilizzato da chi ha invocato il programma

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    E non è vero che non si possa richiamare il main:
    codice:
    #include <stdio.h>
    
    char arr[] = "Hello World!";
    int var = 11;
    int main(a) {
        if (a-13) {
           putchar(arr[a-1]);
           main(a+1);
        }
        return 0;
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Grazie mille, ora il concetto mi è chiaro.
    Il valore di ritorno del main può essere utilizzato anche da altri programmi.
    Credevo che il ritorno era una funzionaità interna del C!!
    Thank you

  10. #10
    Giusto per riattizzare la discussione, visto che siamo in tema.
    Chi conosce la differenza fra :
    codice:
    int main()
    {
        ...
        return 1;
    }
    ..e..
    codice:
    int main()
    {
        ...
        exit(1);
    }
    ... Differenze a livello di valore restituito naturalmente... :master:
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.