[C con Clase] Duda sobre acceso a array multidimensional con punteros

Salvador Pozo salvador en conclase.net
Jue Ago 30 15:04:31 CEST 2012


Hola:

Los paréntesis son MUY importantes, y también las mayúsculas y las minúsculas. No es lo mismo a[N*m+o+M*o+O] que a[N*(m+o)+M*o+O], ni tampoco lo mismo a[N*(m+o)+M*o+O] que a[n*(M+O)+m*O+o].

De todos modos, todas esas fórmulas son incorrectas, y no corresponden con las que puse en el curso.

La idea es sencilla, aunque complicada de explicar cuando hay tres o más índices en un array.

Todos los elementos se almacenan en posiciones consecutivas. En tu caso, en un array de tres dimensiones: a[N][M][O], pongamos por caso que N sea 3, M sea 2 y O sea 4: a[3][2][4].

Creo que estaremos de acuerdo en que el array puede almacenar 3*2*4 elementos, es decir 24.

El primer elemento, el [0][0][0] se almacena en la primera posición, a continuación el [0][0][1], el [0][0][2] y el [0][0][3]. Después pasamos al siguiente índice, y se almacenan [0][1][0], [0][1][1],[0][1][2] y [0][1][3]. El segundo índice ha llegado al máximo, así que incrementamos el primero, y se almacenan los siguientes: [1][0][0], [1][0][1],[1][0][2], [1][0][3], [1][1][0], [1][1][1],[1][1][2] y [1][1][3], etc.

Esta es la lista de todos los elementos. A la izquierda de los dos puntos, el índice en un array equivalente de una dimensión, a la derecha, entre paréntesis, los índices de las tres dimensiones originales:

0:(0,0,0), 1:(0,0,1), 2:(0,0,2), 3:(0,0,3), 4:(0,1,0), 5:(0,1,1), 6:(0,1,2), 7:(0,1,3), 8:(1,0,0), 9:(1,0,1), 10:(1,0,2), 11:(1,0,3), 12:(1,1,0), 13:(1,1,1), 14:(1,1,2), 15:(1,1,3), 16:(2,0,0), 17:(2,0,1), 18:(2,0,2), 19:(2,0,3), 20:(2,1,0), 21:(2,1,1), 22:(2,1,2), 23:(2,1,3)   

La fórmula es sencilla, si el primer y segundo índice son 0, está claro que la coordenada sólo depende del tercero: a[o].

Si el primero y tercero son cero, depende del segundo índice, pero multiplicándolo por la tercera dimensión: a[m*O], es decir a[m*4].

Si el segundo y tercero son nulos, depende del primero, pero multiplicando por el producto de la segunda y tercera dimensión: a[n*M*O], es decir a[n*2*4].

En general, habrá que sumar las tres fórmulas anteriores: a[n*M*O+m*O+o], es decir a[n*2*4+m*4+o] = a[n*6+m*4+o].

En el curso, como los valores de O se repiten se extrae como factor común:
a[n*M*O+m*O+o] = a[n*M + (n+m)*O + o]

Vamos a tu ejemplo:
----8<------
miarray [N][M][O] y quiero acceder a la posición miaray[n][m][o]
----8<------

Para acceder al elemento [n][m][o] de miarray usaremos esta expresión:

miarray[n*M*O + m*O + o]

Supongo que a la función le pasas como parámetros el propio array, y las dimensiones segunda y tercera. La primera no es estrictamente necesaria, salvo para impedir el acceso a elementos que no existen en el array.

Espero haber aclarado algo. :)

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


Más información sobre la lista de distribución Cconclase