
// Allocazione dinamica (array)

public class Esempio10 {
	static int n,x;    // Interi
	static int[] a;  // Vettore di interi 
	
	public static void main(String[] args) {
		// Alloco un vettore di 100 interi
		// Le componenti si chiamano a[0] .. a[99]
		// Nota bene: si parte a contare da 0, non da 1.
		a = new int[100];
		
		// Inizializzo ogni componente a[n] a n*n
		// La lunghezza del vettore a è ricavabile con a.length
		for (n=0 ; n < a.length ; n++) {
			// Questo assegnamento modifica una componente
			a[n] = n*n;
		}
		
		// Sommo tutte le componenti
		x=0;
		for (n=0 ; n < a.length ; n++) {
			// Leggo la componente definita prima
			x = x + a[n];
		}
		
		System.out.println("La somma è " + x);
		
		// Nota: chiaramente per la somma di sopra non mi serve creare un vettore,
		// la potevo fare direttamente con un ciclo.
		
		// Errore dinamico: 1000 è fuori dall'intervallo 0 .. a.length (escluso)
		System.out.println("a[1000] vale: " + a[1000]);
		
		// Nota: in alcuni linguaggi (per es il C) leggere o scrivere in un vettore
		// fuori dal'intervallo di definizione è un errore che può essere NON
		// segnalato ma che può portare a comportamenti totalmente impredicibili
		// del programma.
		//
		// Per esempio il comando a[100]=3 potrebbe, visto che 100 è fuori dall'intervallo
		// consentito, modifcare la variabile x con 3.
		//
		// Lo standard C non pone limiti all'effetto che può avere un accesso fuori
		// intervallo. In linea di principio, può modificare x anche con -8712563, causare la scrittura
		// in un file, visualizzare una messaggio a schermo, lanciare i missili...
		//
		// Si noti che la cosa peggiore che può capitare non è che il programma si blocchi,
		// ma che continui ad eseguire con dati errati, causando un risultato errato ma
		// sfortunatamente verosimile. In tal caso, diventa molto difficile scovare
		// e correggere l'errore dentro il programma.
		//
		// In Java, per fortuna, viene generato un errore dinamico, identificando
		// subito il problema.

		// ****************************************
		// Perché il termine "allocazione dinamica" ?
		
		
		// Questa forma di allocazione viene detta "dinamica" perché la memoria
		// viene riservata per l'array a solo dopo l'esecuzione della new.
		// Per esempio:
		x = 4;
		if (x > 10) {
			a = new int[1000*1000];
			// Supponere che qui si usi a in qualche modo.
		} else {
			x++;
		}
		// Il codice sopra alloca (riserva) memoria solo quando la new viene eseguita.
		// Visto che la guardia dell'if è falsa, non viene fatta nessuna allocazione
		// e vengono quindi risparmiate 10^6 "celle di memoria" che contengono int.
		
		// La cella di memoria che contiene la variabile "x" (o "n") dichiarata all'inizio
		// del programma viene allocata sempre all'inizio dell'esecuzione. Questo è un
		// caso di allocazione "statica".
		
	}

}
