Для последней части вопроса, в C этот прототип функции будет выглядеть так, если вы последуете остальным моим советам:
void BuildDoublyEvenMagicSquare(int *mat, int Order);
Есть несколько способов сделать это. Здесь делаются некоторые вещи, которые просто не могут быть выполнены в C, так что вам придется пойти на немного другой подход. Самая большая вещь - это вектор C ++. C ++ vector
подобен массиву C, но он выполняет все управление памятью за вас. Это означает, например, что довольно удобно иметь массив массивов, где в C это только добавило бы вашей головной боли управления ресурсами.
Объявление C ++:
vector<int> varname(5);
примерно соответствует объявлению C:
int varname[5];
Но в C ++ вы можете сделать это:
int randominteger = 7;
vector<int> varname(randominteger);
и в C это недопустимо, если у вас нет совместимого с C99 компилятора (-std = c99 в gcc):
int randominteger = 7;
int varname[randominteger];
Вы не можете иметь массивы с переменным числом элементов в C, поэтому вам придется прибегнуть к calloc
или malloc
и выполнить собственное управление памятью, например:
/* Not that this is not necessary and shouldn't be done (as it's *
* prone to memory leaks) if you have a C99 compliant compiler. */
int randominteger = 7;
int *varname = calloc(randominteger, sizeof(int));
if (varname == NULL) {
/* Die horribly of running out of memory. */
}
В этом случае я предполагаю, что вы собираетесь развернуть свой массив массивов в один длинный массив чисел C, достаточно большой, чтобы вместить ответ, чтобы вы могли уменьшить количество бит памяти, которыми вы должны управлять , Для этого я бы использовал вызов типа mat = calloc(order * order, sizeof(int));
в main
, что также означает, что вам придется звонить free(mat)
, когда вы закончите с ним в конце main
.
Я также предполагаю, что вы разворачиваете массив, чтобы у вас больше не было массива массивов. Это означает, что вам нужно будет выполнить некоторые математические операции, чтобы превратить строку, индекс столбца в линейный индекс в массиве. Что-то вроде row * order + column
.
Вам придется повторить процедуру, которую я предложил для main
в каждой из функций, которые создают магический квадрат, потому что каждая из них создает временные массивы для хранения вещей, которые уходят в конце функции.