Sarvesh Dalvi12 Ответов: 2

Как исправить ошибку "0x0000005" в C++


Я делаю простую змеиную игру на c++, используя связанный список. Код работал нормально, но внезапно он начал сбоить с этой ошибкой :


"Процесс вернул -1073741819 (0xC0000005) время выполнения : 2.301 с нажмите любую клавишу, чтобы продолжить. "


Я искал об этом на других форумах и понял, что это вызвано тем, что я пытался получить доступ к ограниченной памяти. Я хочу знать, что вызвало эту ошибку и как я могу ее исправить ? Ниже приведен код, дающий ошибку :

Что я уже пробовал:

#include <iostream>
#include<string.h>
#include<malloc.h>
#include<windows.h>
#include<stdlib.h>

using namespace std;

struct Node
{
    string data;
    Node* link;
    int x_cor;
    int y_cor;
};

void createMap(string map[25][25]);
void printMap(string map[25][25]);
void createSnake(Node** head,Node** tail,string map[25][25]);
void pushNode(struct Node** head,Node** tail,string map[25][25]);

void ShowConsoleCursor(bool x)
{
    HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO info;
    GetConsoleCursorInfo(out,&info);
    info.bVisible = x;
    SetConsoleCursorInfo(out,&info);
}

int main()
{
    string map[25][25];
    Node* head;
    Node* tail;
    ShowConsoleCursor(false);
    createMap(map);
    createSnake(&head,&tail,map);
    printMap(map);

    for(int i=0;i<10;i++)
    {
        system("CLS");
        pushNode(&head,&tail,map);
        printMap(map);
        Sleep(500);
    }

    cout<<head->x_cor<<" ";
    cout<<head->y_cor;
    return 0;
}

void createMap(string map[25][25])
{
    for(int i=0;i<25;i++)
    {
        for(int j=0;j<25;j++)
        {
            if((i==0)||(i==24)||(j==0)||(j==24))
                map[i][j] = "# ";
            else
                map[i][j] = "  ";
        }
    }
}

void printMap(string map[25][25])
{
    cout<<"\n";
    for(int i=0;i<25;i++)
    {
        cout<<"  ";
        for(int j=0;j<25;j++)
        {
            cout<<map[j][i];
        }
        cout<<endl;
    }
}

void createSnake(Node** head,Node** tail,string map[25][25])
{
    Node* temp;
    Node* newNode;
    for(int i=2;i<7;i++)
    {
        newNode =(Node*)malloc(sizeof(Node));
        newNode->x_cor = i;
        newNode->y_cor = 3;
        newNode->data = "O ";
        if(i==2)
        {
            (*tail) = newNode;
            temp = newNode;
        }
        if(i == 6)
        {
            (*head) = newNode;
        }
        if(i>0)
        {
            temp->link = newNode;
            temp = temp->link;
        }
        map[newNode->x_cor][newNode->y_cor] = newNode->data;
    }
    free(temp);
    free(newNode);
}

void pushNode(struct Node** head,Node** tail,string map[25][25])
{
    Node* newNode =(Node*)malloc(sizeof(Node));
    newNode->data = "O ";
    newNode->x_cor = (*head)->x_cor;
    newNode->y_cor = (*head)->y_cor;
    (*head)->link = newNode;
    (*head) = (*head)->link;
    ((*head)->x_cor)++;
    map[(*head)->x_cor][(*head)->y_cor] = newNode->data;
    int x = (*tail)->x_cor;
    int y = (*tail)->y_cor;
    Node* temp;
    temp = (*tail);
    (*tail) = (*tail)->link;
    free(temp);
    map[x][y] = "  ";
    free(newNode);
    free(temp);
}

2 Ответов

Рейтинг:
2

OriginalGriff

Не имея возможности запустить свой код в точно таких же обстоятельствах и с теми же входными данными, что и вы, мы не можем сказать точно. Но... если это только начало происходить, тогда вам нужно посмотреть, какие изменения вы сделали совсем недавно - и мы понятия не имеем, что это было.

Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Как вы его используете, зависит от вашей системы компилятора, но быстрый поиск в Google имени вашей IDE и "отладчика" должен дать вам необходимую информацию.

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

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!


Sarvesh Dalvi12

Спасибо за ответ ..... Я, конечно, попробую отладить, но, поскольку вы просили выяснить, какие изменения я внес в свой код до того, как произошла эта ошибка, Я ничего не изменил . Внезапно после повторного построения кода появилась эта ошибка

OriginalGriff

Если бы вы ничего не изменили, то сборка не создавала бы новый exe - файл-сборка проверяет временные метки модификации и только компилирует и / или связывает измененные части.

Итак, вы говорите "ничего не изменилось", но перестройка подразумевает "ничего не изменилось, что я могу вспомнить" ... а это совсем другое дело.

Рейтинг:
1

Rick York

Я заметил, что ваш код представляет собой любопытную смесь C и C++. Я сделал небольшую переписку, которая делает объекты из двух частей. В частности, указатели головного и хвостового узлов являются объектом snake, а массив строк-объектом StringMap. Я не стал поправлять логику. В нем все еще есть несколько ошибок. Однако этот код будет компилироваться. Смысл был в том, чтобы немного очистить организацию. Змея объект должен быть уточнен совсем немного больше. Оба его члена создают и инициализируют узлы, и эти операции, на мой взгляд, должны происходить в одном члене Create.

Одна важная вещь : структура узла содержит строку, и это означает, что вы не можете использовать malloc для ее создания. Вы должны использовать new для его создания, чтобы вызвать соответствующий конструктор(ы).

Я надеюсь, что вы найдете это полезным. По крайней мере, это другой способ взглянуть на проблему.

using namespace std;

///////////////////////////////////////////////////////////////////////////////

class StringMap
{
public:
    static const int  MapSize = 25;

    std::string  Map[MapSize][MapSize];

public:
    bool   IsOnEdge( int i, int j );
    void   Create();
    void   Print();
};

///////////////////////////////////////////////////////////////////////////////

bool StringMap::IsOnEdge( int i, int j )
{
    const int mapFirst = 0;
    const int mapLast = MapSize - 1;
    if( i <= mapFirst ) return true;
    if( i >= mapLast )  return true;
    if( j <= mapFirst ) return true;
    if( j >= mapLast )  return true;
    return false;
}

///////////////////////////////////////////////////////////////////////////////

void StringMap::Create()
{
    for( int i = 0; i < MapSize; i++)
    {
        for(int j = 0; j < MapSize; j++ )
        {
            if( IsOnEdge( i, j ) )
                Map[i][j] = "# ";
            else
                Map[i][j] = "  ";
        }
    }
}

///////////////////////////////////////////////////////////////////////////////

void StringMap::Print()
{
    cout<<endl;
    for( int i = 0; i < MapSize; i++)
    {
        cout << "  ";
        for(int j = 0; j < MapSize; j++ )
        {
            cout << Map[j][i];
        }
        cout<<endl;
    }
}

///////////////////////////////////////////////////////////////////////////////

struct Node
{
    std::string data;
    Node *      link;
    int         x_cor;
    int         y_cor;
};

///////////////////////////////////////////////////////////////////////////////

class Snake
{
public:
    void   Create( StringMap & str );
    void   PushNode( StringMap & str );

public:
    Node * pHead = { nullptr };
    Node * pTail = { nullptr };
};

///////////////////////////////////////////////////////////////////////////////

void Snake::Create( StringMap & str )
{
    Node * temp = nullptr;
    const int first = 2;
    const int last = 6;
    for(int i = first; i <= last; i++ )
    {
        Node * newNode = new Node;
        newNode->x_cor = i;
        newNode->y_cor = 3;
        newNode->data = "O ";

        if( i == first )
        {
            pTail = newNode;
            temp = newNode;
        }

        if( i == last )
        {
            pHead = newNode;
        }

        if( i > 0 )
        {
            temp->link = newNode;
            temp = temp->link;
        }
        str.Map[newNode->x_cor][newNode->y_cor] = newNode->data;
    }
}

///////////////////////////////////////////////////////////////////////////////

void Snake::PushNode( StringMap & str )
{
    Node* newNode = new Node;
    newNode->data = "O ";
    newNode->x_cor = pHead->x_cor;
    newNode->y_cor = pHead->y_cor;
    pHead->link = newNode;
    pHead = pHead->link;
    pHead->x_cor++;
    str.Map[ pHead->x_cor][pHead->y_cor] = newNode->data;
    int x = pTail->x_cor;
    int y = pTail->y_cor;
    pTail = pTail->link;
    str.Map[x][y] = "  ";
}

///////////////////////////////////////////////////////////////////////////////

void ShowConsoleCursor( bool vis )
{
    HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO info;
    GetConsoleCursorInfo(out,&info);
    info.bVisible = vis;
    SetConsoleCursorInfo(out,&info);
}

///////////////////////////////////////////////////////////////////////////////

int main()
{
    ShowConsoleCursor( false );

    StringMap str;
    str.Create();

    Snake snake;
    snake.Create( str );
    str.Print();

    for(int i = 0; i < 10; i++ )
    {
        system( "CLS" );
        snake.PushNode( str );

        str.Print();
        Sleep( 500 );
    }

    cout << snake.pHead->x_cor << " ";
    cout << snake.pHead->y_cor << endl;
    return 0;
}


Rick York

С другой стороны, мне следовало бы сделать объект StringMap членом класса Snake, а не аргументом его методов.

Внесение этой модификации будет оставлено в качестве упражнения для читателя. :)

Stefan_Lang

Хорошая работа. Также хорошо заметна проблема с использованием malloc: без запуска программы Моя ставка делается на то, что она вызывает ошибку! Вы должны подчеркнуть это еще раз.

Мой 5.

Rick York

- Спасибо, сэр.