PDA

Visualizza la versione completa : [C/Java]Array multidimensionali


Xadoom
29-03-2004, 20:02
Java o C++ gestiscono gli array multidimensionali? fino a quante dimensioni? E si dichiarano in modo normale, del tipo int[][][]?
:ciauz:

Storm Sentry
29-03-2004, 20:28
Sì... tutti i linguaggi di programmazione gestiscono gli array multidimensionali.

Il grado di dimensione, almeno teoricamente, è infinito, tutto dipende da quanto occupa il tuo array... la memoria a tua disposizione non è illimitata. Esempio, un array di byte allocherà 1 byte per ogni elemento dell'array, un array di interi a 4 byte allocherà 4 byte per ogni elemento e così via... Non conta quante dimensioni ha l'array, ma di quanti elementi è composto. Un array tridimensionale 5x5x5 occupa esattamente come un array bidimensionale 25x5, che occupa esattamente come un array monodimensionale da 125 elementi.

Il modo di dichiarare gli array è uguale sia in Java, sia in C++... anzi, in Java hai un modo in più:

int mioArray[][]...[] = new int[dim1][dim2]...[dimN];

oppure

int [][]...[] mioArray = new int[dim1][dim2]...[dimN];


Ciao. :ciauz:

Xadoom
29-03-2004, 20:29
La mia era una curiosità...ad esempio in FORTRAN sapevo che puoi dichiarare al massimo array a 7 dimensioni.
Grazie :ciauz:

LeleFT
29-03-2004, 20:35
Beh... Fortran è un po' vecchiotto come linguaggio, probabilmente nelle specifiche del linguaggio quella era la dimensione massima supportata (ti dirò... non ho mai fatto uso nemmeno di array tridimensionali, figuriamoci di grado 7!!)

E' possibile che ci siano delle limitazioni anche in Java e C++, bisognerebbe dare un'occhiata alle specifiche del linguaggio... provo a documentarmi, come curiosità non è affatto male!! :D :D


Ciao. :ciauz:

iguana13
29-03-2004, 20:46
Visual Basic (5 e 6 almeno sono sicuro) ha al massimo 65 dimensioni.

Se hai bisogno di array di molte dimensioni (sarà molto difficile, e probabilmente sarebbe un caca-programma) ti sviluppi una classina o funzioni di supporto che, memorizzando i dati in uso spazio di memoria continuo (vettori) o segmentato (liste, liste di vettori,...) lo gestisca come una matrice.

Esempio:
matrice 2x3x5
spazio di memoria: 2*3*5 = 30
magari memorizzi i dati relativi alle dimensioni in un vettore
matrice[1][2][4] = (calcolando gli indici a partire da 0) = (1 * (3*5)) + (2 * 5) + 4, come elemento del vettore.

Insomma, anche se non puoi fare matrici, le puoi emulare. :ciauz: ;)

Xadoom
30-03-2004, 00:42
Ok, è ovvio che all'occorrenza si possa implementare una classe apposita che con un solo array di lunghezza opportuna memorizzi array multidimensionali a piacere. Che poi credo sia così che fa in realtà il computer, cioè anche in array di più dimensioni gli elementi stanno sempre in modo sequenziale no?
Comunque a me non servono assolutamente, era solo una curiosità, mi pare strano che come dice Storn si possano dichiarare array di qualsiasi dimensione, ci dovrebbe essere un limite (non di memoria) del linguaggio... :ciauz:



PS: non mi toccate il FORTRAN, è stato il primo linguaggio che ho imparato e che mi ha spinto nella programmazione :metallica

Storm Sentry
30-03-2004, 17:35
si in effetti....anche secondo me è abbastanza improbabile poter dichiarare array di qualunque dimensione, anche se non ne ho la certezza...credo si debba guardare la documentazione del compilatore perchè (credo) senza dubbio compilatori diversi supportano diverse soluzioni. Per avere un array n-dimensionale a piacere comunque come è già stato detto si puo' adoperare una classe apposita he gestisca opportunamente una zona di memoria preallocata.

ah...il post che ho fatto sopra non è mio. l'ha fatto LeleFT...dato che lavoriamo sugli stessi pc, capita frequentemente che uno entri avendo il cookie dell'altro già impostato... :p

x LeleFT : nn postare a mio nome se no ti pikkio! :zamm:

iguana13
30-03-2004, 21:13
Originariamente inviato da Xadoom
Che poi credo sia così che fa in realtà il computer, cioè anche in array di più dimensioni gli elementi stanno sempre in modo sequenziale no?

Infatti fa così. ;)

LeleFT
30-03-2004, 21:30
Chiedo venia... non è stata colpa mia... :cry:


Comunque, mi sono documentato, ho guardato, spulciato tutta la documentazione di Java e non ho trovato una sola virgola riguardo limitazioni al grado dell'array (array nesting depth, come lo chiamano loro).
Tutto lascia presupporre che non ci siano dei limiti, ma credo che per avere ulteriori dettagli sia necessario approfondire la cosa andando a guardare l'implementazione della JVM.

Per ora ho fatto delle prove:


class P {
public static void main(String [] args) {
char [][][][][][][][] b = new char[10][10][10][10][10][10][10][10];
System.out.println("Allocato...");
}
}
Questo codice viene perfettamente compilato, ma al momento dell'esecuzione mi genera un'ovvio errore: java.lang.OutOfMemoryError :gren:

Comunque, non ci sono errori in compilazione, tutto tranquillo... solo in esecuzione, non riesce ad istanziarlo: 20^7 byte allocati non sono poi così pochi per un array... (ricordo che un char in Java occupa 16 bit, quindi 2 byte per consentire la codifica Unicode).


Ciao. :ciauz:

Loading