You are here: home / university / programmazione

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;
    }