Version 2 (modified by 15 years ago) (diff) | ,
---|
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.