Giarados (Ex-Member)
Pro
Messaggi: 69
Iscritto: 25/07/2010
|
Come si dichiarano? E come si fa riferimento agli elementi contenuti?
So dal mio libro sul C che un array dinamico si dichiara tramite un puntatore attribuendogli l'indirizzo che la funzione malloc restituisce (NULL in caso di errore), si ridimensiona tramite realloc e si libera tramite free.
Purtroppo il mio libro non tratta le matrici multidimensionali che sono quelle che a me servono maggiormente per il momento.
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Brr... "matrici", ma che siamo, matematici?
Si chiamano array bidimensionali (non vettori, i vettori sono quelli della fisica o quelli che vengono istanziati con il template vector).
L'esempio di hackersitiz č un esempio di allocazione statica, a noi interessa quella dinamica:
Codice sorgente - presumibilmente C++ |
int numRows = 10; int numCols = 10; int **arr = (int **) malloc(numRows *sizeof(int)); int c; for(c=0;c< numRows ;c++) arr[c] = (int *) malloc(numCols*sizeof(int));
|
Ultima modifica effettuata da pierotofy il 30/10/2010 alle 21:59
|
|
TheKaneB (Member)
Guru^2
Messaggi: 1792
Iscritto: 26/06/2009
|
mi ha detto mio "cuggino" che se fai cosė:
Codice sorgente - presumibilmente C/C++ |
int sizeX = 10;
int sizeY = 10;
int * matrice = malloc(sizeof(*matrice) * sizeX * sizeY);
|
diminuisci drasticamente la frammentazione della Ram e l'overhead delle allocazioni
e per accedervi poi, devi fare cosė:
Codice sorgente - presumibilmente Plain Text |
// al posto di matrice[x][y] = 42;
matrice[x + y*sizeX] = 42;
|
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Postato originariamente da TheKaneB:
e per accedervi poi, devi fare cosė:
Codice sorgente - presumibilmente Plain Text |
// al posto di matrice[x][y] = 42;
matrice[x + y*sizeX] = 42;
|
|
L'inizializzazione č pių veloce, ma l'accesso diventa pių lento (per la moltiplicazione).
|
|
TheKaneB (Member)
Guru^2
Messaggi: 1792
Iscritto: 26/06/2009
|
Postato originariamente da pierotofy:
Postato originariamente da TheKaneB:
e per accedervi poi, devi fare cosė:
Codice sorgente - presumibilmente Plain Text |
// al posto di matrice[x][y] = 42;
matrice[x + y*sizeX] = 42;
|
|
L'inizializzazione č pių veloce, ma l'accesso diventa pių lento (per la moltiplicazione). |
l'accesso random si, ma l'accesso sequenziale č pių veloce, perchč non rompi le linee della cache e viene massimizzato dal prefetch delle ram dinamiche... ovviamente tutto ha dei lati positivi e negativi. Comunque considera che una moltiplicazione impiega mediamente 5 cicli di clock, che potrebbe corrispondere a un singolo ciclo di Ram su alcuni sistemi moderni. Questa tecnica la uso quando programmo sulle console e su sistemi con poca memoria. |
|
TheKaneB (Member)
Guru^2
Messaggi: 1792
Iscritto: 26/06/2009
|
certo, ma infatti la mia era solo una chicca... diciamo che č un metodo per ottimizzare le prestazioni in caso di utilizzi molto particolari (lo usavo per fare software rendering sul nintendo ds).
per usi generali meglio sbattersene dell'efficienza e puntare alla semplificazione del lavoro e del codice :-)
come diceva il grande Knuth, l'ottimizzazione prematura č la radice di tutti i mali. :-)
|
|
lumo (Member)
Expert
Messaggi: 449
Iscritto: 18/04/2010
|
considera la matrice come un array di array
|
|
hackersitiz (Normal User)
Pro
Messaggi: 120
Iscritto: 29/09/2010
|
Infatti sono array di array, ma sono detti vettori multidimensionali...
Ti faccio un'esempio:
Codice sorgente - presumibilmente C++ |
#include <stdio.h> int main(void) { int vettore[10][10]; return 0; }
|
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Postato originariamente da pierotofy:
Brr... "matrici", ma che siamo, matematici?
Si chiamano array bidimensionali (non vettori, i vettori sono quelli della fisica o quelli che vengono istanziati con il template vector).
|
Va de retro! Ti hanno fatto il lavaggio del cervello in Minnesota! |
|