提问者:小点点

Visual Studio C++在主函数末尾触发断点


我和我的团队正在为我们的项目做一个游戏,我不断遇到这个错误,经过一些测试,它似乎发生在主函数的末尾。我不知道这是怎么发生的,因为大部分的代码是从我们的老师,我们需要修复他故意放置的bug和添加额外的功能。这是代码:

#include <winuser.h>
#include <iostream>
#include <time.h>
#include <conio.h>
#include <thread>
using namespace std;

#define MAX_CAR 5
#define MAX_CAR_LENGTH 40
#define MAX_SPEED 3

POINT** X;
POINT Y;
int cnt = 0;
int MOVING;
int SPEED;
int HEIGHT_CONSOLE = 29, WIDTH_CONSOLE = 119;
bool STATE;

void FixConsoleWindow() {
    HWND consoleWindow = GetConsoleWindow();
    LONG_PTR style = GetWindowLongPtr(consoleWindow, GWL_STYLE);
    style = style & ~(WS_MAXIMIZEBOX) & ~(WS_THICKFRAME);
    SetWindowLongPtr(consoleWindow, GWL_STYLE, style);
}

void GotoXY(int x, int y) {
    COORD coord;
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

void ResetData() {
    MOVING = 'D';
    SPEED = 1;
    Y = { 18,  19 };
    if (X == NULL) {
        X = new POINT * [MAX_CAR];
        for (int i = 0; i < MAX_CAR; i++) {
            X[i] = new POINT[MAX_CAR_LENGTH];
        }

        for (int i = 0; i < MAX_CAR; i++) {
            int temp = rand() % (WIDTH_CONSOLE - MAX_CAR_LENGTH) + 1;
            for (int j = 0; j < MAX_CAR_LENGTH; j++) {
                X[i][j].x = temp + j;
                X[i][j].y = 2 + 5 * i;
            }
        }
    }
}

void DrawBoard(int x, int y, int width, int height, int curPosX = 0, int curPosY = 0) {
    GotoXY(x, y);
    for (int i = 1; i < width; i++) {
        cout << 'X';
    }
    cout << 'X';
    GotoXY(x, height + y);
    for (int i = 1; i < width; i++) {
        cout << 'X';
    }
    cout << 'X';
    for (int i = y + 1; i < height + y; i++) {
        GotoXY(x, i);
        cout << 'X';
        GotoXY(x + width, i);
        cout << 'X';
    }
    GotoXY(curPosX, curPosY);
}

void StartGame() {
    system("cls");
    ResetData();
    DrawBoard(0, 0, WIDTH_CONSOLE, HEIGHT_CONSOLE);
    STATE = true;
}

void GabageCollect() {
    for (int i = 0; i < MAX_CAR; i++) {
        delete[] X[i];
    }
    delete[] X;
}

void ExitGame(HANDLE t) {
    GabageCollect();
    system("cls");
    TerminateThread(t, 0);
}

void PauseGame(HANDLE t) {
    SuspendThread(t);
}

void ProcessDeath() {
    STATE = false;
    GotoXY(0, HEIGHT_CONSOLE + 2);
    cout << "Dead, type y to continue or any key to exit";
}

void ProcessFinish(POINT& p) {
    SPEED == MAX_SPEED ? SPEED = 1 : SPEED++;
    p = { 18,19 };
    MOVING = 'D';
}

void DrawCars() {
    for (int i = 0; i < MAX_CAR; i++) {
        for (int j = 0; j < MAX_CAR_LENGTH; j++) {
            GotoXY(X[i][j].x, X[i][j].y);
            std::cout << '.';
        }
    }
}

void DrawPlayer(const POINT& p, char s) {
    GotoXY(p.x, p.y);
    cout << s;
}

bool IsImpact(const POINT& p) //d=Y.y     p = Y
{
    if (p.y == 1 || p.y == 19) return false;
    for (int i = 0; i < MAX_CAR; i++)
    {
        for (int j = 0; j < MAX_CAR_LENGTH; j++)
        {
            if (p.x == X[i][j].x && p.y == X[i][j].y) return true;
        }
    }
    return false;
}

void MoveCars(int x1, int y1)
{
    for (int i = 1; i < MAX_CAR; i += 2)
    {
        cnt = 0;
        do
        {
            cnt++;
            for (int j = 0; j < MAX_CAR_LENGTH - 1; j++)
            {
                X[i][j] = X[i][j + 1];
            }
            X[i][MAX_CAR_LENGTH - 1].x + 1 == WIDTH_CONSOLE + x1 ? X[i][MAX_CAR_LENGTH - 1].x = 1 : X[i][MAX_CAR_LENGTH - 1].x++;
        } while (cnt < SPEED);
    }
    for (int i = 0; i < MAX_CAR; i += 2)
    {
        cnt = 0;
        do
        {
            cnt++;
            for (int j = MAX_CAR_LENGTH - 1; j > 0; j--)
            {
                X[i][j] = X[i][j - 1];
            }
            X[i][0].x - 1 == 0 + x1 ? X[i][0].x = WIDTH_CONSOLE + x1 - 1 : X[i][0].x--;
        } while (cnt < SPEED);
    }
}


void EraseCars()
{
    for (int i = 0; i < MAX_CAR; i += 2)
    {
        cnt = 0;
        do
        {
            GotoXY(X[i][MAX_CAR_LENGTH - 1 - cnt].x, X[i][MAX_CAR_LENGTH - 1 - cnt].y);
            cout << " ";
            cnt++;
        } while (cnt < SPEED);
    }
    for (int i = 1; i < MAX_CAR; i += 2)
    {
        cnt = 0;
        do
        {
            GotoXY(X[i][0 + cnt].x, X[i][0 + cnt].y);
            cout << " ";
            cnt++;
        } while (cnt < SPEED);
    }
}


void MoveRight()
{
    if (Y.x < WIDTH_CONSOLE - 1)
    {
        DrawPlayer(Y, ' ');
        Y.x++;
        DrawPlayer(Y, 'Y');
    }
}

void MoveLeft()
{
    if (Y.x > 1)
    {
        DrawPlayer(Y, ' ');
        Y.x--;
        DrawPlayer(Y, 'Y');
    }
}

void MoveDown()
{
    if (Y.y < HEIGHT_CONSOLE - 1)
    {
        DrawPlayer(Y, ' ');
        Y.y++;
        DrawPlayer(Y, 'Y');
    }
}

void MoveUp()
{
    if (Y.y > 1)
    {
        DrawPlayer(Y, ' ');
        Y.y--;
        DrawPlayer(Y, 'Y');
    }
}

void SubThread()
{
    while (1)
    {
        if (STATE)
        {
            switch (MOVING)
            {
            case 'A':
                MoveLeft();
                break;
            case 'D':
                MoveRight();
                break;
            case'W':
                MoveUp();
                break;
            case'S':
                MoveDown();
                break;
            }
            MOVING = ' ';
            EraseCars();
            MoveCars(0, 0);
            DrawCars();
            if (IsImpact(Y))
            {
                ProcessDeath();
            }
            if (Y.y == 1)
            {
                ProcessFinish(Y);
                Sleep(50);
            }
        }
    }
}
void main()
{
    int temp;
    FixConsoleWindow();
    srand(time(NULL));
    StartGame();
    thread t1(SubThread);
    while (1)
    {
        temp = toupper(_getch());
        if (STATE == 1)
        {
            EraseCars();
            if (temp == 27)
            {
                ExitGame(t1.native_handle());
                break;
            }
            else if (temp == 'P')
            {
                PauseGame(t1.native_handle());
                temp = toupper(_getch());
                if (temp == 'B')
                    ResumeThread((HANDLE)t1.native_handle());
            }
            else
            {
                if (temp == 'D' || temp == 'A' || temp == 'W' || temp == 'S')
                {
                    MOVING = temp;
                }
            }
        }
        else
        {
            if (temp == 'Y') StartGame();
            else
            {
                ExitGame(t1.native_handle());
                break;
            }
        }
    }
}

这是错误的图像:https://imgur.com/pgjjx2w基本上,这是一个横穿马路的游戏,每次你走到最上面,它会保存位置,你不能再走那个位置了(还在继续),当你撞上汽车时游戏就结束了(现在是点线)。提前致谢


共1个答案

匿名用户

您在此处创建了std::thread对象:

thread t1(SubThread);

但您没有为此调用join()detach()

这会导致在对象被破坏时调用std::terminate()(程序中止)。

如果希望等待线程结束,则调用t1.join();如果希望在从main()函数返回之前让线程自由运行,则调用t1.detach()

另一种选择是直接使用createThread()而不是std::thread来创建线程。这可能更好,因为您正在使用t1.native_handle()对线程进行操作。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(visual|studio|c++|主|函数|末尾|触发|断点)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?