Changes between Initial Version and Version 1 of C99ArrayDinamici


Ignore:
Timestamp:
02/05/10 19:35:12 (13 years ago)
Author:
mancausoft
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • C99ArrayDinamici

    v1 v1  
     1Cercavo un modo veloce e ottimizzato per creare Array bidimensionali in C, quando parlandone in chat su irc, Scinziatu mi illumina dicendo:
     2
     3{{{
     414:50:12    @scinziatu | void f(int x) {
     514:50:13    @scinziatu |   int array[x][x];
     614:50:14    @scinziatu | }
     714:50:17    @scinziatu | compila
     8}}}
     9
     10Dopo questo cercando scopriamo che dal C99 in poi supporta gli array dinamici, allora incuriosito provo le potenzialita':
     11
     12{{{
     13#!C
     14#include <stdio.h>
     15typedef struct {
     16    int x;
     17    int y;
     18} msize_t;
     19
     20static msize_t size;
     21
     22/** Dichiaro una funzione che ha come parametro un'array bidimensionale
     23  * la cui dimensione dipende da size
     24  */
     25void funzione(int matrice[size.x][size.y])
     26{
     27    int a =  matrice[5][2];
     28    printf( "%d\n", a);
     29}
     30
     31int main()
     32{
     33    size.x = 10;
     34    size.y = 10;
     35    int m1[size.x][size.y];
     36    m1[5][2] = 10;
     37    // Mi spetto che stampi 10
     38    funzione(m1);
     39    size.x = 6;
     40    size.y = 5;
     41    // Cambiando size mi aspetto Che mi stampi un valore diverso da 10.
     42    funzione(m1);
     43
     44}
     45
     46}}}
     47
     48Infatti lanciando il codice:
     49
     50{{{
     51 $ ./prova
     5210
     5332707
     54}}}
     55
     56Per 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:
     57
     58{{{
     59#!C
     60 // Allocare i puntatori alle righe
     61 array = malloc( sizeof(int*) * size.x );
     62 
     63 // Allocare per ogni riga gli elementi delle colonne
     64 for(i=0; i<size.x; i++)
     65 {
     66 mat[i] = malloc(sizeof(int) * size.y );
     67 }
     68}}}
     69
     70Immaginiamoci se invece di bidimensionali, volevamo un array tridimensionale o a piu' dimensioni.
     71
     72Grazie a Scinziatu per avermi fatto conoscere questa caratteristica del C99!