Задать вопрос
Colinp
@Colinp
Учу C++

Возможно ли избежать ошибку чтения в массиве если алгоритм задействует ячейку которой нет?

Привет! Суть ошибки такая. Я делаю симуляцию клеточного аппарата "Жизнь". При исполнении алгоритма, который меняет состояние клетки, он проверяет ячейку которой нет (не выделена память). Что в таком случае стоит сделать? Стоит ли выделить массив больше дабы избежать ошибки?

Некоторое пояснение:
Алгоритм проходит по двумерному массиву, к примеру 5x5. И при исполнении, когда он находится на ячейке к примеру [0][0], то он проверяет ячейки [-1][0] и т.п. Т.е пытается получить доступ фактически ни к чему.

Что в этом случае будет сделать легче или разумнее? Изучаю C++ некоторое время и поэтому вместо копирования с чего-либо решил спросить у комьюнити хабра. Заранее спасибо, с радостью приму любую критику!

Код тут
#define EMPTY_CELL ' '
#define CLAIM_CELL '#'

#include <cstdio>
#include <windows.h> //смешная библиотека, ничего не понимаю


const int cols = 5, rows = 5;
const bool isInfinit = true;
int steps = 25;
const int delayTime = 1000;

void Log(const char* msg) {
    printf(msg);
    printf("\n");
}// а
void LogPrefers() {
    printf("PREFERS: \n");
    printf("\t cols %d\n", cols);
    printf("\t rows %d\n", rows);
    printf("\t infinity %d\n", isInfinit);
    printf("\t steps %d\n", steps);
    printf("\t delay %d\n", delayTime);
}

int main(int argc, char* argv[]) {
    // Initialize simulation field
    LogPrefers();
    Log("Start initializing <?");
    char** field = new char* [cols];
    for (size_t i = 0; i < cols; ++i) {
        field[i] = new char[rows];
    }
    Log("Memory initialized <!");
    Log("Initializing by fill <?");
    for (size_t i = 0; i < cols; ++i) {
        for (size_t k = 0; k < rows; ++k) {
            field[i][k] = ' ';
        }
    }
    field[2][2] = '#';
    Log("Memory initialized <!");
    Log("Start simulation <?");
    Log("Started <!");
    // Simulation
    do {
        int temp = 0;
        for (size_t i = 0; i < cols; ++i) {
            for (size_t k = 0; k < rows; ++k) { // Господи, заработай пожалуйста с первого раза, аминь
                // Проверка соседей вокруг клетки.
                if (field[i - 1][k - 1] != NULL && field[i - 1][k - 1] == CLAIM_CELL) temp += 1;
                else if (field[i][k - 1] != NULL && field[i - 1][k - 1] == CLAIM_CELL) temp += 1;
                else if (field[i + 1][k - 1] != NULL && field[i - 1][k - 1] == CLAIM_CELL) temp += 1;
                else if (field[i - 1][k] != NULL && field[i - 1][k - 1] == CLAIM_CELL) temp += 1;
                else if (field[i + 1][k] != NULL && field[i - 1][k - 1] == CLAIM_CELL) temp += 1;
                else if (field[i + 1][k + 1] != NULL && field[i - 1][k - 1] == CLAIM_CELL) temp += 1;
                else if (field[i][k + 1] != NULL && field[i - 1][k - 1] == CLAIM_CELL) temp += 1;
                else if (field[i - 1][k + 1] != NULL && field[i - 1][k - 1] == CLAIM_CELL) temp += 1;
                if (temp == 3 || temp == 2) {
                    field[i][k] == '#';
                }
                else {
                    field[i][k] == ' ';
                }
                temp = 0; // Сбрасываем счётчик!111
            }
        }
        for (size_t i = 0; i < cols; ++i) {
            printf("\n");
            for (size_t k = 0; k < rows; ++k) {
                printf("%c", field[i][k]);
            }
        }
        steps -= 1;
        //Sleep(delayTime);
    } while (steps > 0 || isInfinit);

    // Free ramm from simulation field  linux suck
    Log("! END !");
    for (int i = 0; i < cols; ++i) {
        delete[] field[i];
    }
    delete[] field;

    return 0;
}
  • Вопрос задан
  • 105 просмотров
Подписаться 1 Простой 5 комментариев
Ответ пользователя Сергей Соловьев К ответам на вопрос (2)
AshBlade
@AshBlade
Просто хочу быть счастливым
Граничные значения обрабатывать особенным образом:
- Если это первая и последняя строка, то не берем в учет верхнюю или нижнюю строки соответственно
- Если это самый левый или правый столбец, то не берем в учет левый или правый (относительно текущего) столбец соответственно

Т.е. в каждый цикл дополнительно вставляются окаймляющие участки (для этих случаев)
Ответ написан
Комментировать