2013-10-19 5 views
6

Supponiamo che l'indirizzo per A[10][10] sia 40000, doppio per 16 byte e che si utilizzi l'indirizzamento di byte, quali sono gli indirizzi per A[40, 50]?Formula di calcolo array 2D

Sto solo cercando di calcolare un semplice punto in 2D e volevo solo di verificare che ho inserito nei giusti valori nell'equazione

BA + [n * (i - LBR) + (j - LBC)] * w 

40000 +[10*(40-0)+(50-0)]*16 

40000+[10*(40)+(50)]*16 

40000+[900]*16 = 54400 

Ho applicare la formula corretta qui? Non ero sicuro di aver inserito i valori giusti?

+1

Stai chiedendo l'indirizzo di 'A [40] [50]' in un array dichiarato solo come 'A [10] [10]'? Se è così, l'indirizzo è * non definito *. Quella matrice è indirizzabile solo da 'A [0..9] [0..9]'. Inoltre, non hai notato se l'indirizzo di base dato è in base-16 o base-10, ma data la richiesta di elemento non indirizzabile, onestamente non importa. – WhozCraig

+0

Come hai dichiarato il tuo array? Come in quale dimensione del tuo array [M, N]? –

+0

è A [100] [100] credo. – user1789951

risposta

2

La risposta dipende dal fatto che si stia utilizzando l'ordine principale della riga o l'ordinamento principale della colonna. In ordine principale di fila i dati vengono memorizzati in ordine di riga. Nell'ordinamento principale della colonna i dati vengono memorizzati in colonna. Si consideri il seguente array 2D ad essere memorizzate nella memoria,

11 22 33 

    44 55 66 

    77 88 99 

Nella riga principale ordinamento gli elementi sono memorizzati in modo contiguo come 11,22,33,44,55,66,77,88,99. Nell'ordinamento principale della colonna gli elementi vengono memorizzati in modo contiguo 11,44,77,22,55,88,33,66,99.

+0

non specifica – user1789951

0

Il significato della seguente equazione:

BA + [n * (i - LBR) + (j - LBC)] * w 

Se si dispone di un array A [n] [n] e si conosce l'indirizzo di entrata A [LBR] [LBC] come BA, allora l'indirizzo di A [i] [j] può essere calcolato come segue. Assumendo n = 6,

00 01 02 03 04 05 
10 11 12 13 14 15 
20 21 22 23 24 25 
30 31 32 33 34 35 
40 41 42 43 44 45 
50 51 52 53 54 55 

Qui Supponiamo di sapere l'indirizzo di A [2,1] = 1000. Abbiamo bisogno di calcolare l'indirizzo di A [4,2]. Ora per raggiungere [4,2] da [2,1], quante voci dovremo viaggiare? Ofcourse come specifica @Deepu, possiamo farlo in due modi, sia in termini di righe che di colonne. Dall'equazione sembra che sia stato selezionato il viaggio in senso longitudinale.

22 to 25 (4) 
30 to 35 (6) 
40 to 42.(3) 

= 13 entries. 

Quindi indirizzo di A [4,2] = 1000 + 13 * (numOfbytes per ogni linea)

Per verificare con l'equazione,

i - LBR = 4 - 2 = 2. 
j - LBC = 2 - 1 = 1. 

Quindi, n*(i - LBR) + (j - LBC) = 6*2 + 1 = 13.

4

In C++ un array 2d è solo una matrice di matrici, quindi in A la memoria viene utilizzata per

A[ 0][ 0] A[ 0][ 1] A[ 0][ 2] ... A[ 0][99] 
A[ 1][ 0] A[ 1][ 1] A[ 1][ 2] ... A[ 1][99] 
... 
A[99][ 0] A[99][ 1] A[99][ 2] ... A[99][99] 

dove ogni riga segue solo la precedente in memoria.

L'indirizzo in di un elemento a (row, col) è

(unsigned char *)(&A[0][0]) + (row*row_size + col) * element_size 

Nel tuo caso si sa che l'elemento che si sta cercando è di 30 righe inferiori e 40 gli elementi a destra del dato elemento, quindi l'indirizzo saranno

40000 + ((40 - 10)*100 + (50 - 10)) * 16 

per un totale di 88640.

È possibile ottenere lo stesso risultato sottraendo l'indirizzo relativo dell'elemento (10, 10) dall'indirizzo indicato (per trovare l'inizio dell'array) e quindi aggiungendo l'indirizzo relativo di (40, 50).

+0

in C quindi abbiamo solo una rappresentazione di riga? Nessuna rappresentazione di colonna? – user3995169

+0

In C una matrice è solo una matrice di matrici, quindi l'incremento dell'ultimo indice ** passerà al successivo elemento consecutivo in memoria. L'approccio al layout C è chiamato "ordine riga-maggiore" vedi http://en.wikipedia.org/wiki/Row-major_order – 6502