Giarados (Ex-Member)
Pro
Messaggi: 69
Iscritto: 25/07/2010
|
Postato originariamente da TheKaneB:
Codice sorgente - presumibilmente C/C++ |
int sizeX = 10;
int sizeY = 10;
int * matrice = malloc(sizeof(*matrice) * sizeX * sizeY);
|
Codice sorgente - presumibilmente Plain Text |
// al posto di matrice[x][y] = 42;
matrice[x + y*sizeX] = 42;
|
|
Non ho capito bene, e più leggo il mio manuale più mi confondo.
Perchè scrivi
Codice sorgente - presumibilmente Plain Text |
malloc(sizeof(*matrice) * x * y)
|
e non
Codice sorgente - presumibilmente Plain Text |
malloc(sizeof(int) * x * y)
|
??
E poi:
Credo che i puntatori non siano molto diversi da degli array o meglio: gli array non sono molto diversi da dei puntatori.
Codice sorgente - presumibilmente C/C++ |
int array[n];
int *p;
p=array;
|
il "nome" dell'array corrisponde ad una locazione di memoria o meglio all'inizio del blocco di memoria che contiene in successione tutti gli indirizzi dei valori contenuti nell'array.
E fin qui ci sono. Il mio libro però non mi dice che posso fare
Codice sorgente - presumibilmente C/C++ |
int array[n];
int *p;
p=array;
p[5]=x; /* <-- questo */
|
mi dice semmai di fare
Codice sorgente - presumibilmente C/C++ |
int array[n];
int *p;
p=array;
p=p+5;
*p=x;
|
|
|
TheKaneB (Member)
Guru^2
Messaggi: 1792
Iscritto: 26/06/2009
|
Postato originariamente da Giarados:
Postato originariamente da TheKaneB:
Codice sorgente - presumibilmente C/C++ |
int sizeX = 10;
int sizeY = 10;
int * matrice = malloc(sizeof(*matrice) * sizeX * sizeY);
|
Codice sorgente - presumibilmente Plain Text |
// al posto di matrice[x][y] = 42;
matrice[x + y*sizeX] = 42;
|
|
Non ho capito bene, e più leggo il mio manuale più mi confondo.
Perchè scrivi
Codice sorgente - presumibilmente Plain Text |
malloc(sizeof(*matrice) * x * y)
|
e non
Codice sorgente - presumibilmente Plain Text |
malloc(sizeof(int) * x * y)
|
??
E poi:
Credo che i puntatori non siano molto diversi da degli array o meglio: gli array non sono molto diversi da dei puntatori.
Codice sorgente - presumibilmente C/C++ |
int array[n];
int *p;
p=array;
|
il "nome" dell'array corrisponde ad una locazione di memoria o meglio all'inizio del blocco di memoria che contiene in successione tutti gli indirizzi dei valori contenuti nell'array.
E fin qui ci sono. Il mio libro però non mi dice che posso fare
Codice sorgente - presumibilmente C/C++ |
int array[n];
int *p;
p=array;
p[5]=x; /* <-- questo */
|
mi dice semmai di fare
Codice sorgente - presumibilmente C/C++ |
int array[n];
int *p;
p=array;
p=p+5;
*p=x;
|
|
evidentemente il tuo libro è scarso. Cambialo. |
|
Giarados (Ex-Member)
Pro
Messaggi: 69
Iscritto: 25/07/2010
|
Insomma: da ora sino a quando mi arriva il manuale Deitel & Deitel posso vedere i puntatori come degli array?
|
|
TheKaneB (Member)
Guru^2
Messaggi: 1792
Iscritto: 26/06/2009
|
Postato originariamente da Giarados:
Insomma: da ora sino a quando mi arriva il manuale Deitel & Deitel posso vedere i puntatori come degli array? |
assolutamente si |
|
Giarados (Ex-Member)
Pro
Messaggi: 69
Iscritto: 25/07/2010
|
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;
|
|
Mi viene spontaneo fare un'altra domanda. Io, sebbene ho seguito il tuo consiglio, devo fornire un'interfaccia per la classe che sto scrivendo che permetta l'accesso all'array come se fosse bidimensionale (sebbene sia implementato monodimensionalmente).
Quindi, sapendo che sto esaminando l'elemento n dell'array è giusto affermare che volendo restituire le coordinate attribuibili a tale elemento se esso fosse in un array bidimensionale allora dovrei utilizzare tali formule:
array[x + y*dimX] -> array[x + y*dimX] == array[n] --> n==x+y*dimX
x=n-y*dimX
y=(n-x)/dimX
o erro?
EDIT:
ops ho comunque bisogno di y e x... Ultima modifica effettuata da Giarados il 31/10/2010 alle 17:17 |
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Postato originariamente da Il Totem:
Va de retro! Ti hanno fatto il lavaggio del cervello in Minnesota! |
Il lavaggio del cervello lo fanno in Italia quando dei professori reciclati da matematica si mettono ad insegnare informatica e decidono di tradurre impropriamente certi termini.
|
|
TheKaneB (Member)
Guru^2
Messaggi: 1792
Iscritto: 26/06/2009
|
Postato originariamente da Giarados:
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;
|
|
Mi viene spontaneo fare un'altra domanda. Io, sebbene ho seguito il tuo consiglio, devo fornire un'interfaccia per la classe che sto scrivendo che permetta l'accesso all'array come se fosse bidimensionale (sebbene sia implementato monodimensionalmente).
Quindi, sapendo che sto esaminando l'elemento n dell'array è giusto affermare che volendo restituire le coordinate attribuibili a tale elemento se esso fosse in un array bidimensionale allora dovrei utilizzare tali formule:
array[x + y*dimX] -> array[x + y*dimX] == array[n] --> n==x+y*dimX
x=n-y*dimX
y=(n-x)/dimX
o erro?
EDIT:
ops ho comunque bisogno di y e x... |
la formula inversa è semplice:
x = n % dimY;
y = n / dimY; // divisione intera
deriva dalla banale considerazione che, avendo A / B = quoziente + resto/B (che deriva a sua volta da A = B * quoziente + resto), posso ottenere resto = modulo_di(A / B) e quoziente = divisione_intera(A / B). Ultima modifica effettuata da TheKaneB il 31/10/2010 alle 18:15 |
|
Giarados (Ex-Member)
Pro
Messaggi: 69
Iscritto: 25/07/2010
|
Grazie delle delucidazioni. Comunque sono costretto a ripiegare sulla soluzione di Piero dato che ho la necessità di definire un metodo per il ridimensionamento della matrice e non credo che sia fattibile avendo i dati disposti in maniera sequenziale a meno che non vada eliminando elementi periodicamente. Inoltre nel caso di un ingrandimento della matrice dovrei duplicare l'array per poi andarlo a ricopiare con 1 elemento in più ogni n elementi.
Naaa troppo complicato
Ultima modifica effettuata da Giarados il 31/10/2010 alle 21:08 |
|