[C] exit(1) e programmazione strutturata

di il
4 risposte

[C] exit(1) e programmazione strutturata

Salve,
l'utilizzo di exit(1) potrebbe portarmi ad un errore per quanto riguarda la programmazione strutturata? Mi spiego meglio.
Il mio main è questo:
int main (){
	menu_principale();
	return 0;
}
Come potete vedere l'unica cosa che fa è richiamare una funzione. Il problema è il seguente: La funzione menu_principale() richiama diverse altre funzioni tramite cui si sviluppa il programma. Il mio problema è che in realtà il programma non terminerà mai la funzione menu_principale() e di conseguenza non arriverà al return 0 del main perchè, per terminare il programma, utilizzo questa funzione:
void sequenza_di_chiusura(){
	printf("Grazie per aver giocato. Spero tu ti sia divertito. Alla prossima!");
	getch();
	exit(1); //termina il programma
}
Così facendo non chiudo mai nessuna funzione perchè il programma diventa un susseguirsi di richiami di funzione fino a quando non viene richiamata sequenza_di_chiusura e il programma termina.
La mia domanda quindi è: questo viola qualche regola della programmazione strutturata?

4 Risposte

  • Re: [C] exit(1) e programmazione strutturata

    Tutte!

    exit(1) termina l'intero processo, fregandosene altamente di rilasci di risorse (rilascio della memoria, chiusura di connessioni internet, chiusura di file, ...)

    Dovrebbe essere usato SOLO per casi di emergenza!
  • Re: [C] exit(1) e programmazione strutturata

    Ma se dovessi chiudere io manualmente con free() e fclose() tutto ciò che ho lasciato aperto prima di usare exit(1) andrebbe bene? O è proprio il concetto di non portare a termine le funzioni iniziate il problema? Perchè exit(1) lo utilizzo anche per chiudere il programma quando ho errori come "file non trovati" o "memoria di allocazione non sufficiente".
  • Re: [C] exit(1) e programmazione strutturata

    No, non va bene!
    Il tuo programma DEVE TERMINARE con la corretta uscita da main(argc, argv).

    Ogni altro tipo di terminazione DEVE ESSERE FATTA SOLO per gravi motivi: ad esempio per out of memory, per spazio disco terminato o per gravi errori hardware.

    file non trovato NON E' un problema grave.

    memoria insufficiente NON E' una condizione con cui avrai a che fare a questo livello di programmazione e per moltissimi anni a venire: e' una situazione che si verifica solo in programmi che devono trattare GRANDI strutture dati, che, comunque, vengono sviluppati da persone con esperienza.
    Nel tuo caso e' solo un problema di errata implementazione del tuo algoritmo (nella fattispecie: memory leak o deadlock e creazione di migliaiai di thread): quindi DEVI SCOVARE E CORREGGERE l'errore.
  • Re: [C] exit(1) e programmazione strutturata

    Le osservazioni precedenti sono sicuramente adatta per imparare buone abitudini, e sono indispensabili in sistemi diversi dai "normali" desktop.

    In questi ultimi, diciamo con sistemi operativi Windows (anzi meglio Wow64) o Linux, in realtà è possibile "suicidare" i processi senza particolari effetti collaterali negativi, in quanto essi vengono "incapsulati" (dal sistema operativo) in strutture temporanee che vengono rilasciate dal sistema operativo.

    Però quel frammento di codice che hai messo non riporta eventuali errori al sistema.
    E' una prassi utilizzata nei tempi dei programmi console, oggi è estremamente meno utile, ma nulla ti vieta di far tornare un valore a menu_principale, a sua volta ritornato da main, tipicamente 0 per una terminazione normale, o 1 per una anomala (e giù tutte le varianti che vuoi)
Devi accedere o registrarti per scrivere nel forum
4 risposte