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.
