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>