Programmazione
Breve introduzione alla dichiarazione della dimensione degli array relativa al corso di Programmazione
/* Dichiarazione della dimensione di array secondo lo standard ANSI (c89) C:
* -------------------------------------------------------------------------
* Per compilare correttamente un sorgente C e verificare la totale aderenza
* allo standard ANSI, e' necessario invocare il compilatore gcc con le seguenti
* opzioni:
* gcc -pedantic -ansi -Wall sorgente.c -o binario
*
* Le tre funzioni elencate successivamente forniscono un esempio per
* dichiarare correttamente gli array
*/
#include <stdio.h>
#include <stdlib.h>
#define N 100 /* dimensione massima di "celle" di un array */
/* array1() non rispetta lo standard ANSI. Infatti viene dichiarato un array di
* dimensione variabile. Anche se a compile-time la dimensione e' nota, non puo'
* essere utilizzato. Verra' infatti mostrato in fase di compilazione il seguente
* warning:
* sorgente.c: In function ‘array1’:
* sorgente.c:26: warning: ISO C90 forbids variable length array ‘v’
*/
void
array1() {
int dim = 10, i;
int v[dim];
for(i=0; i<dim; i++) {
v[i] = i*i;
printf("v[%d] = %d\n", i, v[i]);
}
}
/* array2() definisce un array di interi di N elementi. Questa funzione
* rispetta lo standard poiche' N non e' una variabile ma e' totalmente
* equivalente a "100". Il problema in questo caso e' che non sapendo a proiori la
* dimensione del nostro array, siamo costretti a utilizzare un N molto grande. In
* questo esempio, avendo N == 100 e dim == 10, abbiamo un array di interi con
* 90 "celle" inutilizzate.
*/
void
array2() {
int dim = 10, i;
int v[N];
for(i=0; i<dim; i++) {
v[i] = i*i;
printf("v[%d] = %d\n", i, v[i]);
}
}
/* array3() segue lo standard ANSI e non fa alcuna ipotesi pregressa sulla
* dimensione dell'array che andremo a definire. Infatti tramite la malloc
* allochiamo nella memoria dinamica (lo heap) uno spazio grande quanto la
* dimensione esatta del nostro array, data dal numero di celle (dim) * la
* dimensione di ogni cella (sizeof(int)). Attenzione che lo heap, a differenza
* dello stack, e' genralmente piu' pericoloso da utilizzare e piu' lento.
*/
void
array3() {
int dim = 10, i;
int *v = malloc(dim * sizeof(int));
for(i=0; i<dim; i++) {
v[i] = i*i;
printf("v[%d] = %d\n", i, v[i]);
}
free(v);
}
int
main() {
array1();
array2();
array3();
return 0;
}
