Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Matrici dinamiche
Forum - C/C++ - Matrici dinamiche

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
Giarados (Ex-Member)
Pro


Messaggi: 69
Iscritto: 25/07/2010

Segnala al moderatore
Postato alle 17:52
Sabato, 30/10/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.



"ché perder tempo a chi più sa più spiace" (Purgatorio, Canto III - v.78)
PM
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6108
Iscritto: 04/12/2003

Up
2
Down
V
Segnala al moderatore
Postato alle 21:58
Sabato, 30/10/2010
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++

  1. int numRows = 10;
  2. int numCols = 10;
  3. int **arr = (int **) malloc(numRows *sizeof(int));
  4.  
  5. int c;
  6. for(c=0;c< numRows ;c++)
  7.   arr[c] = (int *) malloc(numCols*sizeof(int));


Ultima modifica effettuata da pierotofy il 30/10/2010 alle 21:59


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
Iscritto: 26/06/2009

Up
1
Down
V
Segnala al moderatore
Postato alle 22:17
Sabato, 30/10/2010
mi ha detto mio "cuggino" che se fai così:

Codice sorgente - presumibilmente C/C++

  1. int sizeX = 10;
  2. int sizeY = 10;
  3. 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

  1. // al posto di matrice[x][y] = 42;
  2. matrice[x + y*sizeX] = 42;



:k:


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
PM
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6108
Iscritto: 04/12/2003

Up
1
Down
V
Segnala al moderatore
Postato alle 4:13
Domenica, 31/10/2010
Testo quotato

Postato originariamente da TheKaneB:

e per accedervi poi, devi fare così:
Codice sorgente - presumibilmente Plain Text

  1. // al posto di matrice[x][y] = 42;
  2. matrice[x + y*sizeX] = 42;






L'inizializzazione è più veloce, ma l'accesso diventa più lento (per la moltiplicazione).


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
Iscritto: 26/06/2009

Up
1
Down
V
Segnala al moderatore
Postato alle 5:16
Domenica, 31/10/2010
Testo quotato

Postato originariamente da pierotofy:

Testo quotato

Postato originariamente da TheKaneB:

e per accedervi poi, devi fare così:
Codice sorgente - presumibilmente Plain Text

  1. // al posto di matrice[x][y] = 42;
  2. 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.


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
PM
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
Iscritto: 26/06/2009

Up
1
Down
V
Segnala al moderatore
Postato alle 21:39
Domenica, 31/10/2010
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. :-)


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
PM
Avatar
lumo (Member)
Expert


Messaggi: 412
Iscritto: 18/04/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 18:55
Sabato, 30/10/2010
considera la matrice come un array di array

PM
Avatar
hackersitiz (Normal User)
Pro


Messaggi: 120
Iscritto: 29/09/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 19:08
Sabato, 30/10/2010
Infatti sono array di array, ma sono detti vettori multidimensionali...
Ti faccio un'esempio:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.      int vettore[10][10];
  5.      return 0;
  6. }


Ecco questo è un vettore comunque ti passo una guida
http://elite.polito.it/files/courses/06AZN/lucidi/C/L6.2-u ...

buona fortuna


Testo quotato


il punto di partenza è il codice che hai scritto, ma non lo vedo...
Fare o non fare, non esiste provare...
Impara bene le regole così che tu possa infrangerle

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
0
Down
V
Segnala al moderatore
Postato alle 15:14
Domenica, 31/10/2010
Testo quotato

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! :rotfl:


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM
Pagine: [ 1 2 3 ] Precedente | Prossimo