Che differenza c'è? Funzioni in C.

di il
3 risposte

Che differenza c'è? Funzioni in C.

Sono all'inizio dello studio delle funzioni in C e vorrei chiedere: che differenza c'è tra una funzione con il return dice1 + dice2; e senza? In questo caso:

int rollDice( void) {
	int dice1 = 1 + rand() % 6;
	int dice2 = 1 + rand() % 6;
	printf( "Player rolled %d + %d = %d\n, dice1, dice2, dice1 + dice2 );
	}
e questa:

int rollDice( void) {
	int dice1 = 1 + rand() % 6;
	int dice2 = 1 + rand() % 6;
	printf( "Player rolled %d + %d = %d\n, dice1, dice2, dice1 + dice2 );
	return dice1 + dice2;
	}
cioè, come detto prima, con o senza il return???? Grazie.

3 Risposte

  • Re: Che differenza c'è? Funzioni in C.

    Una funzione deve SEMPRE ritornare qualcosa.

    Il C e' stupido, quindi, se non usi esplicitamente un return, il C ritorna la prima cosa che gli capita: generalmente il contenuto di qualche registro della CPU il cui contenuto DIPENDE da che cosa ha fatto prima, il quale a sua volta, DIPENDE da come il codice e' stato OTTIMIZZATO, con la conseguenza che TU non avrai mai idea DI CHE COSA potrebbe ritornare.

    Quindi USA SEMPRE IL return
  • Re: Che differenza c'è? Funzioni in C.

    Grazie. Sei stato chiaro. Cmq il C sarà stupido come tutti i bambini che hanno bisogno di informazioni per sapere, ma chi l'ha inventato è un.....Genio!!
    Grazie ) A proposito, un'altra domanda su questo esercizio che sto svolgendo...:
    se devo randomizzare un'estrazione di numeri casuali, dunque passare dalla funzione rand() alla funzione srand(seed) ed ancora meglio alla funzione srand(time(NULL)), sono sufficienti i 2 file di intestazione
    
    #include <stdio.h>
    #include <stdlib.h>
    
    o è necessario anche il file di intestazione
    #include <time.h>? Dunque:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    Nello svolgimento dell'esercizio, il libro riporta nella soluzione la seconda opzione ma in questo esercizio "gioco del craps" non ho utilizzato il file di intestazione <time.h> per usare la randomizzazione con srand(time(NULL)):
    
    // FIGURA 5.14: Simulazione del gioco del "craps".
    
    // Codice sorgente:
    #include <stdio.h>
    #include <stdlib.h>
    int main( void ) {
        srand( time( NULL ) );
        puts( "Gioco del \"craps\".\n" );
        puts( "Vi presentiamo il gioco del \"craps\"!!!\n\nVerranno lanciati 2 dadi contemporaneamente. In base al risultato della somma dei numeri estratti si ha:\nVINCENTE: se al primo lancio il risultato della somma dei numeri estratti è:  7 oppure 11.\nPERDENTE: se al primo lancio il risultato della somma dei numeri estratti è:  2 oppure 3 OPPURE 12.\nNegli altri casi verrà acquisito il risultato della somma dei numeri estratti come PUNTEGGIO DEL GIOCATORE.\nSi continueranno a lanciare i dadi finchè, se il risultato della somma dei numeri estratti a ciascun successivo lancio è  7  allora HAI PERSO!\nSe il risultato della somma dei numeri estratti a ciascun successivo lancio è pari al punteggio del giocatore allora HAI VINTO!\n" );
        printf( "%8s", "1^ lancio:\n" );   
        int dice1A = 1 + rand() % 6;
        printf( "\n%-8s%8d\n", "1^ DADO", dice1A ); 
        int dice1B = 1 + rand() % 6;    
        printf( "%-8s%8d", "2^ DADO", dice1B );  
        int result1 = dice1A + dice1B;    
        printf( "%-8s%5d", "\n\nIl risultato della somma dei numeri estratti è:", result1 );
        switch( result1 ) {
            case 7:
              printf( "%8s", "\n\nHAI VINTO!!\n" );
              break;
            case 11:
              printf( "%8s", "\n\nHAI VINTO!!\n" );
              break; 
            case 2:
              printf( "%8s", "\n\nHAI PERSO!!\n" );
              break;     
            case 3:
              printf( "%8s", "\n\nHAI PERSO!!\n" );
              break;    
            case 12:
              printf( "%8s", "\n\nHAI PERSO!!\n" );
              break;   
            default:
              printf( "%-8s%14d", "\n\nIl tuo PUNTEGGIO\nè:", result1 );
              int dice2A = 1 + rand() % 6;
              printf( "\n%8s", "\n2^ lancio:\n" );           
              printf( "\n%-8s%8d\n", "1^ DADO", dice2A ); 
              int dice2B = 1 + rand() % 6;    
              printf( "%-8s%8d", "2^ DADO", dice2B );  
              int result2 = dice2A + dice2B;          
              printf( "%-8s%5d", "\n\nIl risultato della somma dei numeri estratti è:", result2 );
              while ( result2 != result1 ){
                  int dice2A = 1 + rand() % 6;
                  printf( "\n%8s", "\nSuccessivo lancio:\n" );           
                  printf( "\n%-8s%8d\n", "1^ DADO", dice2A ); 
                  int dice2B = 1 + rand() % 6;    
                  printf( "%-8s%8d", "2^ DADO", dice2B ); 
                  result2 = dice2A + dice2B;
                  printf( "%-8s%5d", "\n\nIl risultato della somma dei numeri estratti è:", result2 );
                  if( result2 == 7 ) {
                      printf( "%8s", "\n\nHAI PERSO!!\n" );
                      break;
                  }
                  if( result2 == result1 ) {
                      printf( "%8s", "\n\nHAI VINTO!!\n" );  
                      break;
                  }
              }
              break;
        }
    
    }
    

    Mi chiedo dunque se è indispensabile.
    Grazie.
  • Re: Che differenza c'è? Funzioni in C.

    Un modo per imparare queste cose, INVECE di chiederle al forum (che va bene, ma c'e' si puo' fare di meglio )
    e' quello di usare il compilatore C++ al posto del compilator C.

    In pratica il gioco consiste in questo:

    il C++, in qualche modo, MA NON SI DOVREBBE RAGIONARE COSI', e' un SUPERSET del C.

    Ci sono due cose importanti:

    il C++ ACCETTA programmi scritti in C, MA E' MOLTO PIU' STRINGENTE nella sintassi: se una variabile viene usata ma non dichiarata, il compilatore C pensa: vabbe chissene..., il compilatore C++ invece si incavola come una biscia

    Quindi, l'idea e' quella di scrivere programmi C, ma usare il compilatore C++ perche' si lamenta MOOOLTO di piu' se qualcosa non e' fatta bene.

    In generale non esiste un compilatore per il C ed uno per il C++, ma ne esiste solo uno che abilita/disabilita i controlli in base all'ESTENSIONE DEL FILE che sta' compilando.

    Se l'estensione e' ".c" il compilatore usa le regole del C, se e' ".cpp", ".cxx" il compilatore usa le regole del C++, con tutti i controlli abilitati.

    Il compilatore, quando compila, genera DUE tipi di segnalazioni:

    1) gli ERRORI: se non vengono corretti, il compilatore non genera l'eseguibile
    2) i WARNING/SEGNALAZIONI: sono dei [quasi]errori, ma non abbastanza gravi da non permettere la creazione dell'eseguibile.

    Mentre gli ERRORI vanno NECCESSARIAMENTE risolti, per i WARNING non e', in generale, necessario fare alcunche'.

    PERO' il BRAVO PROGRAMMATORE fa in modo di NON AVERE NEMMENO UN WARNING.
Devi accedere o registrarti per scrivere nel forum
3 risposte