wiki:C99ArrayDinamici

Cercavo un modo veloce e ottimizzato per creare Array bidimensionali in C, quando parlandone in chat su irc, Scinziatu mi illumina dicendo:

14:50:12    @scinziatu | void f(int x) {
14:50:13    @scinziatu |   int array[x][x];
14:50:14    @scinziatu | } 
14:50:17    @scinziatu | compila

Dopo questo cercando scopriamo che dal C99 in poi supporta gli array dinamici, allora incuriosito provo le potenzialita':

#include <stdio.h>
typedef struct {
    int x;
    int y;
} msize_t;

static msize_t size;

/** Dichiaro una funzione che ha come parametro un'array bidimensionale 
  * la cui dimensione dipende da size
  */
void funzione(int matrice[size.x][size.y])
{
    int a =  matrice[5][2];
    printf( "%d\n", a);
}

int main()
{
    size.x = 10;
    size.y = 10;
    int m1[size.x][size.y];
    m1[5][2] = 10;
    // Mi spetto che stampi 10
    funzione(m1);
    size.x = 6;
    size.y = 5;
    // Cambiando size mi aspetto Che mi stampi un valore diverso da 10.
    funzione(m1);

}

Infatti lanciando il codice:

 $ ./prova
10
32707

Per chi e' abituato a linguaggi ad altro livello puo' sembrare una sciocchezza da nulla e anche un modo molto rozzo per gestire gli array dinamici, ma e' molto comodo se si deve sviluppare in C, considerando che prima di C99 bisognava fare cosi:

 // Allocare i puntatori alle righe
 array = malloc( sizeof(int*) * size.x );
 
 // Allocare per ogni riga gli elementi delle colonne 
 for(i=0; i<size.x; i++)
 {
 mat[i] = malloc(sizeof(int) * size.y );
 }

Immaginiamoci se invece di bidimensionali, volevamo un array tridimensionale o a piu' dimensioni.

Grazie a Scinziatu per avermi fatto conoscere questa caratteristica del C99!

Per le altre caratteristiche del C99 vi consiglio di leggere Wikipedia in inglese la pagina in italiano contiene meno informazioni.

Last modified 8 years ago Last modified on Feb 5, 2010, 7:39:23 PM