Процесс завершен с возвращаемым значением 3221226356 при записи системы ("cls") - PullRequest
0 голосов
/ 30 января 2020

Я делаю игру змейкой в ​​консоли, но всякий раз, когда я пишу system ("cls") в функции рисования, она пишет "Процесс завершен с возвращаемым значением 3221226356" на экране вывода. Я думаю, что есть некоторая утечка памяти, но я не смог найти точную причину, по которой это происходит.

Вы также можете увидеть этот код по адресу: https://github.com/Lakshay-Dhingra/Snake-Game

Вот мой код: // Скомпилировано в Dev-C ++ (Windows) с компилятором mingw std-c ++ 11

#include<iostream>
#include<conio.h>
#include <unistd.h>
#include<cstdlib>
using namespace std;

class Node
{
    int x;
    int y;
    Node *link;

    public:
    Node(int ix,int iy)
    {
        x=ix;
        y=iy;
        link=nullptr;
    }

    int getx()
    {
        return x;
    }
    void setx(int x)
    {
        this->x=x;
    }
    int gety()
    {
        return y;
    }
    void sety(int y)
    {
        this->y=y;
    }

    Node* getLink()
    {
        return link;
    }
    void setLink(Node* x)
    {
        link=x;
    }
};

class LL
{
    public:
    Node* head;
    LL()
    {
        head=nullptr;
    }

    void insert(int x,int y)
    {
        Node* mynode=new Node(x,y);
        Node* temp=head;
        head=mynode;
        head->setLink(temp);
    }

//  For Debugging:
//  void showList()
//  {
//      Node* cur=head;
//      while(cur->getLink()!=nullptr)
//      {
//          cout<<cur->getx()<<" "<<cur->gety()<<" --> ";
//          cur=cur->getLink();
//      }
//      cout<<cur->getx()<<" "<<cur->gety()<<endl;
//  }

    int* show(int l)
    {

        int* arr=new int(2*l);
        int i=0;
        Node* cur=head;
        while(cur!=nullptr)
        {
            arr[i]=cur->getx();
            arr[i+1]=cur->gety();
            i+=2;
            cur=cur->getLink();
        }
        return arr;
    }

    ~LL()
    {
        Node* temp=head;
        while(head!=nullptr)
        {
            temp=head->getLink();
            delete head;
            head=temp;
        }
    }
};

class Snake
{
    int length;
    LL* mysnake;

    public:
    Snake(int l,int x,int y)
    {
        mysnake=new LL();
        for(int i=0;i<l;i++)
        {
            mysnake->insert((x+i),y);
        }
        length=l;
    }

    int getLength()
    {
        return length;
    }

    void eatFood(int x,int y)
    {
        length+=1;
        mysnake->insert(x,y);
    }

    int* showSnake()
    {
        return mysnake->show(length);
    }

    int getHeadX()
    {
        return mysnake->head->getx();
    }
    int getHeadY()
    {
        return mysnake->head->gety();
    }
};

class Window
{
    int length;
    int hieght;
    Snake* snk;
    int* arr;

    public:
    Window(int l,int h,int posx,int posy)
    {

        length=l;
        hieght=h;
        snk=new Snake(4,posx-3,posy);
        arr=snk->showSnake();

//      rungame();
//      For Debugging:
//      for(int i=0;i<2*(sk.getLength());i++)
//      {
//          cout<<arr[i]<<" ";
//      }
    }

    void rungame()
    {
        char ch;
        while(true)
        {
            if(kbhit())
            {
            ch = _getch();
            if(int(ch)==27)
                break;
            }
            draw();
        }
    }

    void draw()
    {
        system("cls");
//      arr=snk->showSnake();
//      cout<<"world ";
        bool flag;
        for(int i=0;i<length;i++)
        {
            for(int j=0;j<hieght;j++)
            {
                flag=0;
                if(i==0||i==length-1||j==0||j==hieght-1)
                {
                    cout<<"#";
                    flag=1;
                }
                else
                {
                    for(int k=0;k<snk->getLength();k++)
                    {
                        if(i==arr[2*k]&&j==arr[2*k+1])
                        {
                            cout<<"O";
                            flag=1;
                        }
                    }
                }

                if(flag==0)
                {
                    cout<<" ";
                }
            }
            cout<<endl;
        }
//      For Debugging:
//      for(int k=0;k<snk->getLength();k++)
//          cout<<arr[2*k]<<" "<<arr[2*k+1]<<" ";
        usleep(100000);
    }
};

int main()
{
    Window win(30,50,15,25);
    win.rungame();
    return 0;
}

Ответы [ 2 ]

1 голос
/ 30 января 2020

unistd.h - это заголовок UNIX (Linux, MacOS и т. Д. c ...), его не следует включать в проект Windows. Это может быть причиной.

Вызов system("clear"); в Linux SO.

Затем вам нужно заменить такие функции, как usleep(), который принадлежит unistd.h и не можно использовать в проекте Windows.

Я считаю, что windows.h имеет некоторые похожие функции.

0 голосов
/ 30 января 2020

Ошибка 3221226356 - это 0xc0000374 в шестнадцатеричном формате, что является STATUS_HEAP_CORRUPTION.

Я пропустил его при первом чтении, но оно вызвано вашим выделением в show():

int* arr=new int(2*l);

Это выделяет пробелы для одного int и заполняет его значением 2*l. Впоследствии вы записываете в нераспределенную / неинициализированную память: arr[1], arr[2] и т. Д.

Немедленное исправление просто:

int* arr = new int[2*l];

Это выделяет место для 2*l int значений.

В долгосрочной перспективе вам лучше использовать std::vector<int> или отказаться от всего этого бизнеса с массивами и переходить по связанному списку напрямую, когда вам нужно (в вашей функции draw, для пример).

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