[C con Clase] Matrices Multidimensionales

Davidson, Steven srd4121 en njit.edu
Dom Mar 23 22:21:17 CET 2014


Hola David,

On Sun, Mar 23, 2014 at 12:45 PM, David . <di.romero en hotmail.es> wrote:

> Hola a todos,
>
> Tengo una duda sobre cómo recorrer una matriz multidimensional de forma
> genérica.
>

[CORTE]

Como podéis ver, se necesitan tantos bucles for como dimensiones tenga la
> matriz.
>
> Lo que quiero es hacer un algoritmo que recorra una matriz
> multidimensional de forma génerica, es decir, sabiendo el número de
> dimensiones y las dimensiones de una matriz multidimensional, recorrer
> todos sus elementos. Por ejemplo, sería implementar esta función:
>
> /**
>  * Recorre la matriz multidimensional dada, asignándole a todos sus
> valores el valor 0
> * @param numeroDimensiones El número de dimensiones de la matriz
> multdimensional
> * @param dimensiones Un puntero al primer elemento de un array de unsigned
> ints del mismo tamaño que el
> * número de dimensiones dado, de forma que el elemento i-ésimo es la
> dimensión i-ésima de la matriz multidimensional
> * @param matrizMultidimensional Un puntero al primer elemento de la matriz
> multidimensional
>  */
>
> void asignarCeros(unsigned int numeroDimensiones, unsigned int*
> dimensiones, double* matrizMultidimensional){
>
> // ¿Cómo recorrer la matriz multidimensional?
>
> }
>
> La forma más sencilla es tratando la matriz como un array de una
dimensión. Simplemente convierte los índices que usas en la versión
multidimensional a un solo índice para el array unidimensional. Para esto,
necesitas calcular el índice para acceder al elemento que quieres. Esto lo
explicamos en el capítulo 15 de nuestro curso de C++; puedes ir
directamente a:
http://c.conclase.net/curso/index.php?cap=015b#FUN2_ArrayParam
Básicamente, vas a realizar el mismo cálculo que hace el compilador, cuando
usas índices de arrays multidimensionales.

Ahora bien, para el caso particular de asignar el mismo valor a cada
elemento (de tipo 'double'), no necesitamos saber cada dimensión, sino la
cantidad total de elementos que hay. Esto sería,

for( int i=0; i<nCantElementos; i++ )
  matizMultidimensional[i] = 0.0;

Eso sí, habría que hacer un "cásting" para pasar el parámetro del tipo
correcto; esto es,

asignarCeros( numeroDimensiones, dimensiones, (double
*)matrizMultidimensional );

o si quieres ser más formal,

asignarCeros( numeroDimensiones, dimensiones, reinterpret_cast< double * >(
matrizMultidimensional ) );

Otra solución es usar la función estándar, 'memset()' (declarada en
<cstring>); esto es,

memset( reinterpret_cast< void * >( matrizMultidimensional ), 0,
3*4*5*6*sizeof(double) );

Hay que indicar la cantidad de bytes del "array".

Nota: esto se funcionará porque la representación de 0 (cero de tipo 'int')
coincide con la de 0 (cero de tipo 'double').


Espero que esto te oriente.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20140323/c2fe3f10/attachment.html>


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