что я делаю не так и как я могу улучшить свой код - PullRequest
0 голосов
/ 07 мая 2020

может кто-нибудь объяснить мне, почему, если я нажимаю кнопку s или кнопку d, это вызывает ошибку сегментации, но с кнопкой и кнопкой w он работает нормально. Это просто функция для перемещения игрока p по квадрату, как змея. *

void move(){

    int i;
    int j;
    char choice;

    scanf("%s",&choice);

    for (i = 0; i < rows; ++i) {
        for (j = 0; j < cols; ++j) {
            if(maze[i][j] == 'p' && choice == 'a') {
                char tmp =  maze[i][j];
                maze[i][j] = maze[i][j-1];
                maze[i][j-1] = tmp;
            }

            if(maze[i][j] == 'p' && choice == 'w'){
                char tmp =  maze[i][j];
                maze[i][j] = maze[i-1][j];
                maze[i-1][j] = tmp;
            }

            if(maze[i][j] == 'p' && choice == 'd') {
                char tmp = maze[i][j];
                maze[i][j] = maze[i][j+1];
                maze[i][j+1] = tmp;
            }

            if(maze[i][j] == 'p' && choice == 's') {
                char tmp =  maze[i][j];
                maze[i][j] = maze[i+1][j];
                maze[i+1][j] = tmp;
            }
        }
    }
}

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Добро пожаловать в Stack Overflow, и добро пожаловать в программирование!

Согласно связанным комментариям, segfault, скорее всего, вызван выходом за границы вашего maze[][] массива. В нескольких комментариях вы спрашиваете, как вы можете справиться с этой ситуацией.

В интересах предоставления наиболее конструктивного совета, вместо того, чтобы давать вам код, я собираюсь спросить вопрос:

Как в программировании мы заставляем что-то происходить или не происходить при определенных c условиях?

Итак, опишите для себя условия в который вы должны не делать ссылки, такие как i + 1 или j - 1, а затем добавлять соответствующие logi c в свой код.

Я также призываю вас спросить себя:

Сколько раз моя функция move() изменяет maze[][] для одного входа?

Запишите свой ответ, а затем добавьте операторы вывода или, например, функция show(), которая выводит общее текущее состояние maze[][] в самой внутренней части ваших циклов в move(). Посмотрите, соответствует ли ожидаемый ответ вашему фактическому результату.


Что касается вашего описания этой программы, когда вы:

"нажимаете кнопку s или d, это вызывает ошибку сегментации. но с кнопкой и кнопкой w он работает нормально "

... Я бы сказал, что только появляется , чтобы работать, когда вы нажимаете кнопку a или w кнопка. Фактически, всякий раз, когда вы ссылаетесь за пределы массива (что может произойти независимо от того, какой из w, a, s или d нажат), поведение будет undefined . Так что, случайно, способ компиляции программы (для вас, в определенное время) может не сразу привести к сбою при нажатии w. Когда вы обращаетесь за пределами массива, вы можете получить доступ к памяти, к которой можно получить доступ, и она будет казаться работающей; но вы можете получить доступ к памяти, которая недоступна для вашего процесса, и это будет segfault.

Ошибки, связанные с неопределенным поведением , могут быть наиболее тонкими. Logi c служит в качестве ограждения, а операторы вывода отладки для отображения фактических изменений значений могут немного помочь.

0 голосов
/ 07 мая 2020

С самого начала, этот код неверен

char choice;

scanf("%s",&choice);

Выбор - один символ - как он может содержать строку из нескольких символов?

Это было бы лучше

char choice[101];

scanf("%100s", choice);

Включит строку длиной до 100 символов

101 - ничего не связанное с Джорджем Оруэллом - позволяет добавить нулевой символ

Вы также должны проверить возвращаемое значение из scanf. Пожалуйста, прочтите страницу руководства для scanf

Кстати - мне не удалось прочитать остальную часть кода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...