PDA

View Full Version : [C]Array Multidimensionale


Mezzetti0903
09-05-2005, 19:13
dunque...nessun problema nel dichiararli!
int a[1][1];
Il vero problema sono le funzioni che devono accettare come parametro un array multidimensione a prescindere dalla dimensione

come le dicchiaro??

int funz(int **a)

oppure

int funz(int *a[])

Giusto?? e' lecito??

...il problema è chiamare la funzione..che cosa gli devo passare senza far scattare il warning del compilatore??
e come recupero poi i valori all'interno della funzione??


avevo pensato che dato che anche nella dichiarazione s[][] si assume s come puntatore bastasse usare (per richiamare i valori)

int r = a[i][j]...invece non funziona
e neppure

int r = (*(*(a+i)+j));


mi date una mano??

cionci
09-05-2005, 23:37
Strano dovrebbe funzionare denza problemi...

-Yara-
10-05-2005, 08:45
Quando passi un array bidimensionale devi passare anche la seconda dimensione


int Funz(int array_bid[][DIM2])
{}

Ziosilvio
10-05-2005, 09:05
Il vero problema sono le funzioni che devono accettare come parametro un array multidimensione a prescindere dalla dimensione
Infatti, per quanto ne so, non è possibile.
Nel senso che non è possibile definire una funzione, che abbia tra i suoi parametri un array di dimensione arbitraria: questo semplicemente perché tipo, array di tipo, array di array di tipo, e così via, sono tutti tipi a due a due diversi.
Forse si potrebbe fare usando una lista variabile di argomenti, ma ho parecchi dubbi in proposito...
int funz(int **a)

oppure

int funz(int *a[])
Mi sembra di ricordare che queste due dichiarazioni sono diverse: purtroppo non ricordo in che modo.
Ti redirigo sulle FAQ per il linguaggio C a cura di Steve Summitt (http://www.eskimo.com/~scs/c-faq/top.html), che sono un punto di riferimento.
avevo pensato che dato che anche nella dichiarazione s[][] si assume s come puntatore bastasse usare (per richiamare i valori)

int r = a[i][j]...invece non funziona
e neppure

int r = (*(*(a+i)+j));
Questo mi lascia abbastanza perplesso... forse è meglio che posti tutta la porzione di codice che dà problemi...

cionci
10-05-2005, 14:17
Non avevo visto che il vettore bidimensionale era allocato staticamente... Avevo presupposto il vettore bidimensionale allocato dinamicamente...in tal caso sia

int f1(int **t)
{
return t[1][1];
}

che

int f2(int *t[])
{
return t[1][1];
}

vanno bene...

Mezzetti0903
10-05-2005, 18:25
Grazie..però ve la siete cercata e ora vi sommergo di codice :)

int f1(int **t)
{
return t[1][1];
}



int main(int argc, char *argv[])
{
int a[3][3];
a[1][1]=5;

f1(a);
system("PAUSE");
return 0;
}

Al compilatore non piace tanto il passaggio di "quel tipo di puntatore" alla f1..e mi lancia un Warning.
A runtime crasha tutto.


int f1(int **t)
{
return t[0][0];
}



int main(int argc, char *argv[])
{
int a[1][1];
int **t;

t=a;

a[0][0]=5;


f1(t);
system("PAUSE");
return 0;
}

vabè..era un modo per aggirare il problema..normale non funzioni

poi non lo so.. potrei provare a puntare al primo elemento..mmmmm...
un aiutino??


ah..a tutto ciò si aggiunge questa nota nelle FAQ che mi avete consigliato:

If a function is already declared as accepting a pointer to a pointer, it is probably meaningless to pass a two-dimensional array directly to it.

peccato non spieghi come dare significato...