I have written some code (please see below) to create a magic square. The only way I could figure out how to complete it while using functions included using double and triple pointers. Can someone please give me a suggestion on how to eliminate the double and triple pointers.
#include <stdio.h>
#include <stdlib.h>
void allocate(int ***, int);
void create_square(int **, int);
int main(void)
{
int **matrix;
int size;
int i;
printf("Enter an odd number for the size of the matrix: ");
scanf("%d", &size);
printf("\n\n");
allocate(&matrix, size);
create_square(matrix, size);
for (i = 0; i < size; i++)
free(matrix[i]);
free(matrix);
return 0;
}
void allocate(int ***mat, int s)
{
int i, k;
int **pmat;
pmat = malloc(s * sizeof(*pmat));
for (i = 0; i < s; ++i)
pmat[i] = malloc(s * sizeof(**pmat));
for (i = 0; i < s; i++)
for (k = 0; k < s; k++)
pmat[i][k] = 0;
*mat = pmat;
}
/* move up (decrement index), wrapping if necessary */
int move_up(int cur, int s)
{
if (cur == 0)
return s - 1;
return cur - 1;
}
/* move right (increment index), wrapping if necessary */
int move_right(int cur, int s)
{
if (cur == s - 1)
return 0;
return cur + 1;
}
/* pointer just to have a conveniently-named alias for the same function */
int (*move_down)(int, int) = move_right;
void create_square(int **mat, int s)
{
int j = 0;
int k = s / 2; /* middle for odd numbers only */
int i, lk, lj;
for (i = 1; i <= s*s; i++)
{
mat[j][k] = i;
/* save the last position in case the new is already set */
lj = j;
lk = k;
/* move */
j = move_up(j, s);
k = move_right(k, s);
/* if new position is already set, go back to last and move down */
if (mat[j][k] != 0)
{
j = move_down(lj, s);
k = lk;
}
/* back to top for assignment */
}
/* print matrix */
for (j = 0; j < s; j++)
{
for (k = 0; k < s; k++)
printf("%d ", mat[j][k]);
printf("\n");
}
}