Многократное использование массива в функции C ++

Я работаю над игрой жизни Конвея и у меня проблемы с массивами. Я могу передать массив 2d в мою функцию, которая оценивает текущий мир. Результаты возвращаются, как они должны. Затем, когда прошло снова, я получаю все виды мусора. Я думаю, что это связано с памятью, но я не уверен, как это исправить.

0 0 0 0 0

0 0 1 0 0

0 0 1 0 0

0 0 1 0 0

0 0 0 0 0

превращается в

0 0 0 0 0

0 0 0 0 0

0 1 1 1 0

0 0 0 0 0

0 0 0 0 0

но если это пройдет второй раз, мои результаты сходят с ума

1946813184 32767 1946813184 32767 1946812520

32767 1946813184 1 1411353440 32767

-1983101020 0 1 0 1411353160

32767 1946813184 1 1946815600 32767

1 0 1946813176 32767 1946815600

Вот мой код

#include <iostream>
#include <string>
#include <ctype.h>
#include <cstring>
#include <stdlib.h>using std::cout;
using std::cin;
using std::endl;
using std::string;

void updateWorld(int world[][5], int x, int y);
int choice();

int main() {
int world[5][5] = {{ 0, 0, 0, 0, 0},
{ 0, 0, 1, 0, 0},
{ 0, 0, 1, 0, 0},
{ 0, 0, 1, 0, 0},
{ 0, 0, 0, 0, 0}};updateWorld(world, 5, 5); //Call function first time
for (int i = 0; i < 5; i++) {    //print array
cout << endl;
for (int j = 0; j < 5; j++) {
cout << world[i][j] << " ";
}
}

updateWorld(world, 5, 5); //Call function second time
for (int i = 0; i < 5; i++) {    //print array
cout << endl;
for (int j = 0; j < 5; j++) {
cout << world[i][j] << " ";
}
}return 0;
}

bool validNum(string str) {
bool valid = true;
for (int i = 0; i < str.length() && valid == true; i++) {
valid = isdigit(str.at(i));
}
return valid;
}

void updateWorld(int worldi[][5], int x, int y) {
int worldo[5][5];
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) { //counts through all the cells
int life = 0;            // keeps track of the life around the cell
for (int a = -1; a < 2; a++) {
for (int b = -1; b < 2; b++) { //these two loops check every neighbor cell
int c = a;
int d = b;
if (i+a < 0) {
c = x;
} else if (i + a > x-1) {
c = 0;
} else {
c = i + a;
}
if (j+b < 0) {
d = y;
} else if (j+b > y-1){
d = 0;
} else {
d = j + b;
}

if (worldi[c][d] == 1) {
life++;
//   << ":" << life << endl;
} // cout << c << "," << d << ":" << life << endl;
}
}
life = life - worldi[i][j]; // subtract the cells self value
if (worldi[i][j] == 1 && life < 2) { // implent the 4 rules
worldo[i][j] = 0;
} else if (worldi[i][j] == 1 && 1 < life && life < 4) {
worldo[i][j] = 1;
} else if (worldi[i][j] == 1 && life > 3) {
worldo[i][j] = 0;
} else if (worldi[i][j] == 0 && life == 3) {
worldo[i][j] = 1;
}
}

}
for (int i = 0; i < x; i++) { //set the input arrary to the temp output array
for (int j = 0; j < y; j++) {
worldi[i][j] = worldo[i][j];
}
}
}

0

Решение

Вы забыли инициализировать worldo в updateWorld, Измените строку:

int worldo[5][5];

в

int worldo[5][5] = {0};
3

Другие решения

В вашем коде 2 проблемы:

  1. Вы забыли инициализировать ваш временный массив: worldo, до 0. Без очистки памяти ваш массив будет заполнен мусором. Это потому, что пространство для массивов берется случайным образом из памяти. Там нет никакой гарантии, что начальное значение. Вот почему вам настоятельно рекомендуется установить начальное значение переменной, вместо того, чтобы использовать его напрямую. Чтобы справиться с вашей ошибкой, вы можете сделать одно из следующих: memset(worldo, 0, sizeof(worldo)) или же int worldo = {0};

  2. когда i+a < 0, c должно быть равно ‘c = x — 1’ вместо c = x, и когда j + b < 0 ваш d должно быть d = y - 1,

2

По вопросам рекламы [email protected]