Hola<br><br>Estoy realizando un programa muy sencillo para crear un cuadrado mágico, es decir, un cuadrado que dado un número entero impar <i>num</i>, cree una matriz de <i>num</i>*<i>num</i> y lo rellene con números enteros (de 1 a <i>num</i>) de modo que la diagonal, cada fila y cada columna sumen lo mismo. La cuestión es que para solucionar este programa creo un array de punteros para contener los elementos de la matriz y me sucede algo muy curioso con calloc, he resaltado el código en negrita para localizarlo mejor.<br>
<br>La cuestión es que para num = 5 como ejemplo, crea correctamente el array de punteros, y crea perfectamente los 4 primeros arrays, inicializandolos a 0.<br><br>**matriz = 0x602010<br>*matriz[0] = 0x602030<br>*matriz[1] = 0x602050<br>
*matriz[2] = 0x602070<br>*matriz[3] = 0x602090<br>*matriz[4] = 0x6020b0<br><br>En el momento que asigna a matriz[4] la dirección 0x6020b0 el elemento matriz[0][0] pasa de 0 a 6299824. SI cambio esto a 0 con una instrucción del tipo matriz [0][0] = 0; *matriz[4] deja de estar referenciado. Da igual que utilice la notación de arrays (matriz[i] o la de punteros *(matriz+i) ) Existe algún vinculo a la memoria que haya pasado por alto?<br>
<br>Muchas gracias por la ayuda.<br>Xan.<br><br>Posteo el código a continuación:<br><br>void crtCuadrado (int num) // num viene de la función main, que se encarga de comprobar que es un número impar<br>{<br><br> int **matriz; /* Puntero a array de punteros para reservar espacio en memoria para almacenar los numeros */<br>
int i; /* Indices para bucles */<br> int fil, col; /* Indices de fila y columna */<br> int tope = num*num; /* Será el valor máximo que pueden tomar los números del cuadrado, es decir num*num */<br>
<br><b> /** Reservamos memoria para el array de punteros, cada puntero de este array referencia cada fila de enteros **/<br> matriz = (int**)malloc((num) * sizeof (int));<br><br> /** Se reserva memoria para cada fila poniendo a 0 sus elementos, por eso se utiliza calloc, que hace las dos cosas a la vez **/<br>
for (i = 0; i < num; i++)<br> {<br> *(matriz+i) = (int*)calloc (num, sizeof(int));<br> }<br><br> </b><i>(A partir de aquí el código funciona correctamente, salvo por el detalle de que llega a un elemento que no está a 0 y eso hace que todo salte por los aires)</i><br>
<i> /** Se coloca el número 1 en la mitad de la primera fila **/ <br> fil = 0;<br> col = num/2; //(num/2) nos da la mitad de la fila<br><br> *(*(matriz + fil)+col) = 1;<br><br> for (i = 2; i <= tope; i++) /* i tomará todos los restantes valores desde 2 hasta num^2 */<br>
{<br> fil = fil - 1; // Se sube una fila<br> col = col + 1; // Se situa una columna a la derecha<br><br> /** Se comprueba si fil o col se han salido del rango de la matriz (num) y se reajustan sus valores dentro del rango **/<br>
if (fil < 0 || fil >= num || col < 0 || col >= num)<br> chkRango (&fil, &col, num);<br><br> if (*(*(matriz + fil) + col)) // Si ese elemento es distinto de 0 se reajusta su posición<br>
{<br> fil = fil + 2; // Nos colocamos en la posición inferior al último elemento<br> col = col - 1;<br><br> /** Se comprueba si fil o col se han salido del rango de la matriz (num) y se reajustan sus valores dentro del rango **/<br>
chkRango (&fil, &col, num);<br> }<br><br> /** Una vez comprobados y ajustados los indices se asigna el valor al array **/<br><br> *(*(matriz + fil) + col) = i;<br><br> }<br><br>
<br> /*** Asignados todos los valores, se pinta en pantalla el cuadrado mágico ***/<br> printf("\n\n");<br> printf("Cuadrado magico de orden %d",num);<br> printf("\n****************************\n\n");<br>
<br><br> for (fil = 0; fil < num; fil++)<br> {<br> for (col = 0; col < num; col++)<br> {<br> printf ("%d ", matriz[fil][col]);<br> }<br><br> printf ("\n");<br>
}<br><br> /*** Finalmente se vacía la memoria reservada ***/<br> for (i = 0; i < num; i++)<br> free (matriz[i]);<br><br> free (matriz);<br>}<br><br>void chkRango (int *fil, int *col, int num)<br>{<br>
if (*fil < 0)<br> *fil = num + *fil;<br><br> if (*col < 0)<br> *col = num + *col;<br><br> if (*fil >= num)<br> *fil = (*fil - num);<br><br> if (*col >= num)<br> *col = (*col - num);<br>
}</i><br><br><br clear="all"><br>-- <br>Una vez le preguntaron al Buda que es lo que a él más le sorprendía de la humanidad. El Buda respondió: "Los hombres, que pierden la salud para juntar dinero, y luego pierden el dinero para recuperarla y que por pensar ansiosamente en el futuro olvidan el presente de tal forma, que acaban por no vivir ni el presente ni el futuro. Viven como si nunca fuesen a morir, y mueren como si nunca hubiesen vivido".<br>
<br>