<div dir="ltr">Hola David,<div><br></div><div class="gmail_extra"><div class="gmail_quote">On Sun, Mar 23, 2014 at 12:45 PM, David . <span dir="ltr"><<a href="mailto:di.romero@hotmail.es" target="_blank">di.romero@hotmail.es</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">


<div><div dir="ltr">Hola a todos,<br><br>Tengo una duda sobre cómo recorrer una matriz multidimensional de forma genérica.<br></div></div></blockquote><div><br></div><div>[CORTE]</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div><div dir="ltr">Como podéis ver, se necesitan tantos bucles for como dimensiones tenga la matriz.<br><br>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:<br>
<br><blockquote>/**<br> * Recorre la matriz multidimensional dada, asignándole a todos sus valores el valor 0<br>* @param numeroDimensiones El número de dimensiones de la matriz multdimensional<br>* @param dimensiones Un puntero al primer elemento de un array de unsigned ints del mismo tamaño que el<br>
* número de dimensiones dado, de forma que el elemento i-ésimo es la dimensión i-ésima de la matriz multidimensional<br>* @param matrizMultidimensional Un puntero al primer elemento de la matriz multidimensional<br> */<br>
</blockquote><blockquote>void asignarCeros(unsigned int numeroDimensiones, unsigned int* dimensiones, double* matrizMultidimensional){<br><blockquote>// ¿Cómo recorrer la matriz multidimensional?<br></blockquote>}<br><br>
</blockquote></div></div></blockquote><div>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: <a href="http://c.conclase.net/curso/index.php?cap=015b#FUN2_ArrayParam">http://c.conclase.net/curso/index.php?cap=015b#FUN2_ArrayParam</a>   Básicamente, vas a realizar el mismo cálculo que hace el compilador, cuando usas índices de arrays multidimensionales.</div>
<div><br></div><div>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,</div>
<div><br></div><div>for( int i=0; i<nCantElementos; i++ )<br>  matizMultidimensional[i] = 0.0;</div><div><br></div><div>Eso sí, habría que hacer un "cásting" para pasar el parámetro del tipo correcto; esto es,</div>
<div><br></div><div><span style="font-family:arial,sans-serif;font-size:13px">asignarCeros( </span><span style="font-family:arial,sans-serif;font-size:13px">numeroDimensiones, dimensiones, (double *)matrizMultidimensional );</span><br>
</div><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:13px">o si quieres ser más formal,</span></div><div><span style="font-family:arial,sans-serif;font-size:13px"><br>
</span></div><div><span style="font-size:13px;font-family:arial,sans-serif">asignarCeros( </span><span style="font-size:13px;font-family:arial,sans-serif">numeroDimensiones, dimensiones, reinterpret_cast< double * >( matrizMultidimensional ) );</span><span style="font-family:arial,sans-serif;font-size:13px"><br>
</span></div><div><br></div><div>Otra solución es usar la función estándar, 'memset()' (declarada en <cstring>); esto es,<br></div><div><br></div><div>memset( <span style="font-family:arial,sans-serif;font-size:13px">reinterpret_cast< void * >( matrizMultidimensional ), 0, 3*4*5*6*sizeof(double) );</span></div>
<div><br></div><div>Hay que indicar la cantidad de bytes del "array".</div><div><br></div><div>Nota: esto se funcionará porque la representación de 0 (cero de tipo 'int') coincide con la de 0 (cero de tipo 'double').</div>
<div><br></div><div><br></div><div>Espero que esto te oriente.</div><div><br></div><div>Steven</div><div><br></div></div></div></div>