mas
уже указатель. Массивы в C - указатели. Не надо &
использовать где вы его возвращаете. Только в этом случае оно скомпилируется, но работать не будет, потому что mas - локальный массив. По выходу из функции это будет указатель на отчищенную память. Надл выделять массив через malloc. int a
- нужны шаблоны, да. Гуглите variadic template, но это мрак и ужас. В любом случае это будет весьма громоздкий и непонятный код.operator<<
для ostream
и вашей структуры и выводите через cout << *s1
.for (int dx = -1; dx <= 1; ++dx) {
for (int dy = -1; dy <= 1; ++dy) {
if (dx == 0 && dy == 0) continue;
int nx = (i + dx + height) % height;
int ny = (j + dy + SIZE) % SIZE;
neighbours += proc_states[iter][nx * SIZE + ny];
}
}
const int dx[8] = {0, 1, 1, 1, 0, -1, -1, -1};
const int dy[8] = { 1, 1, 0, -1, -1, -1, 0, 1};
...
for (int k = 0; k < 8; ++k) {
int nx = i + dx[k];
int ny = j + dy[k];
...
}
(i + dx + SIZE) % SIZE
есть лишний +SIZE
, ибо -1 % SIZE == -1
и чтобы для 0 предыдущее значение было SIZE-1 надо прибавить лишний SIZE под модулем. ++i
быстрее. Практически - нет, потому что компиляторы могут и то и другое соптимизировать в одни и те же ассемблерные инструкции в большинстве случаев. Исключение, если инкримент используется в выражении. Но тогда они не взаимозаменяемы. Еще может быть случай, если i какого-то странного типа и инкрименты перегружены и криво написаны. Или если оптимизация отключена при компиляции. Или у вас доисторический компилятор. (long long int*) calloc(len_s1, sizeof(int));
вы выделяете массив int на len_s1 элементов, а потом работаете с ним, как с массивом long long той же длины. Но long long занимает больше байт! Поэтому вы выделяете меньше памяти, чем используете, а это UB. %d
. Еще, scanf возвращает количество прочитанных значений. Т.е. сравнивать надо с тройкой, а не единицей.