/* modulo2.c
 * Linguaggi e Traduttori
 * Prof. Ing. Stefano Salvi
 * Lezione 2b
 *
 * Esercizio 1;
 * Scrivere un programma composto da due moduli: modulo1.c e modulo2.c. Si 
 * scriva anche l'header file modulo2.h relativo al modulo due. 
 * Il modulo 1 conterrà: 
 *   una variabile globale intera di nome 'variabile' inizializzata ad 1 
 *   La funzione 'funzione' nella quale è dichiarata la variabile intera 
 *	locale 'variabile', inizializzata al valore 2. 
 *	Questa funzione stamperà il suo nome ed il valore della variabile 
 *	'variabile' 
 *   La funzione 'main' che richiamerà la funzione 'funzione' e la funzione 
 *	'esterna', che verrà definita in 'modulo2', della quale otterrà il 
 *	prototipo dal file 'modulo2.h' 
 * Nel modulo2 invece troveremo: 
 *   la variabile statica intera 'variabile' inizializzata a 10 
 *   La funzione statica 'funzione' che contiene un ciclo che 
 *	usa la variabile 'variabile' come indice, facendolo giungere a 20.
 *	All'interno del ciclo avremo un 'if' che, se 'variabile' supera 15, 
 *	esegue il blocco che definisce una nuova 'variabile' inizializzata 
 *	a 100 e la stampa; dopo l'if verra' di nuovo stampata 'variabile'. 
 *   La funzione 'esterna' che richiamerà 'funzione' 
 * Si potrà anche provare a definire nel file header 'modulo2.h' la variabile 
 * intera 'doppia' e vedere che cosa succede.
 */

#include <stdio.h>
/* Carica le dichiarazioni relative a 'modulo2', cioe' questo */
#include "modulo2.h"

/* Variabile statica del modulo, non si confonde con la 'variabile' definita in modulo1 */
static int variabile = 10;

/* Funzione statica del modulo, non si confonde con la funzione definita in 'modulo1' */
static void funzione ()
{
  /* Ciclo da 10 (valore impostato per la statica) a 20 - esegie solo al promo richiamo;
   * la seconda volta, variabile vale gia' 20, quindi non entra nemmeno nel for */
  for (;variabile < 20; variabile ++)
  {
    if (variabile > 15)
    {	// Per gli ultimi cinque cicli
    /* variabile locale AL BLOCCO */
    int variabile = 100;
      /* Stampa il valore della locale */
      printf ("Variabile piu' interna %d\n",variabile);
    }
    /* Stampa il valore della statica */
    printf ("Variabile %d in questo ciclo\n",variabile);
  }
}

void esterna ()
{
  /* Richiama 'funzione' statica, non globale */
  funzione ();
}