Visual Studio 2015击中断点

时间:2017-01-25 15:48:39

标签: c++ arrays multithreading visual-studio-2015

当我运行代码时,我得到了消息Scattegories.exe has triggered a breakpoint. 它发生在我进入我的阵列的第12个nuber之后,但阵列仍然有一个" spot"为了它。 也有一个线程,所以可能是这样,但似乎工作正常。 所以我不知道它是什么,谢谢。

// A program to keep track of points and time and to give a random letter for the game scattergories
#include<iostream>
#include<ctime>
#include<string>
#include <chrono>
#include <thread>
using std::cout;
using std::cin;
using std::string;
using std::getline;
using namespace std::chrono_literals;
using std::this_thread::sleep_for;

void ltr()    //gives a random letter
{
    char letter;
    letter = rand() % 26 + 65;         //assigns a random letter in ascii code to a char (resulting in a random letter)
    cout << "The letter is " << letter << "\n";
}

void timer()
{
    cout << "You got 1.5 minutes to finish\n";    //Changing the duration of the timer is done by changing the value of 'i' in the "for" loop
    for (int i = 10; i > 0; i--)
    {
        sleep_for(1s);
    }
    cout << "DING DONG!!! DING DONG!!! Time's up!!!\n";
}

void table(int plr)
{
    string ctr[12] = { "A cuntry", "A city", "An animal", "A plant", "A object", "A name", "Food", "Drink", "A game", "A movie", "A book", "A famous person" };
    string lst[6][12];           //first dimantion: how many players. second dimantion: how many catagories, third dimantion(if added) will be the round
    cin.ignore();                  //To avoid the "getline" reading the last input
    for (int x = 0; x<plr; x++)       //the player changes only after the previus player finishes
    {
        std::thread t1(timer);       //gives time to write the words. Optimaly it would run in the background while each player writes the words.
        for (int i = 0; i<12; i++)        //changing catagory
        {
            cout << ctr[i] << ": ";
            getline(cin, lst[x][i]);
        }
        system("cls");
        cout << "Next player\n";
    }
    for (int x = 0; x<plr; x++)                   //this part (the whole "for" loop) is for confirming evreything is writen down
    {
        cout << "Player number " << x + 1 << ": ";
        for (int i = 0; i<12; i++)
        {
            cout << lst[x][i] << "    ";
        }
        cout << "\n";
    }
    sleep_for(5s);
}

int points()        //points gained per round
{
    int a, b, c, sum;
    cout << "How many sections only you got?\n";          //worth 15 points
    cin >> a;
    cout << "How many words only you got?\n";       //worth 10 points
    cin >> b;
    cout << "How many words you and another person got?\n";    //worth 5 points
    cin >> c;
    sum = a * 15 + b * 10 + c * 5;
    return sum;           //Note: It doesn't matter how many sections there are.
}

int act()    //running the program
{
    int Players, Points[6];
    cout << "How many people are playing? (Up to six players)";
    cin >> Players;
    ltr();
    table(Players);
    //Points = points();
    cout << "You have earned " << Points << " this round\n\n";
    return 1;
}

int main()
{
    auto start = std::chrono::high_resolution_clock::now();
    srand(time(NULL));    //gives a differant pattern of letters every time
    int Points;
    Points = act();
    for (;;)          //inf loop
    {
        int ph;
        cout << "Press 1 to continue or anything else to stop\n";
        cin >> ph;
        if (ph == 1)
        {
            Points += act();    //keeping score of the rounds
        }
        else
        {
            auto end = std::chrono::high_resolution_clock::now();
            break;
        }
    }
    cout << "You have earned a total of " << Points << " great job!";
    sleep_for(5s);       //time to read the last text
    return 0;
}

/* 
   To do list:
   -Convert to arduino
   -Make timer work in background of of table
   -Check if words in the table (for differant players) are the same and give points accordingly
   -Check if words are actual words (connect an online dictonary?)
   -Make interface? (if possible and I have time to learn how)
   -Think of what to do with Hardwear
   -Comment rest of the code
*/

1 个答案:

答案 0 :(得分:4)

std::thread::~thread说:

  

如果* this有一个关联的线程(joinable()== true),则调用std :: terminate()。

如果您销毁了可加入的std::thread,则会调用std::terminate()。 Visual Studio会在std::terminate()上打破,以便您检查出错的地方。在void table(int plr)中,您创建了一个std::thread t1(timer);的帖子,但您从未加入该帖子或从中删除。

要解决此问题,您的timer方法应该更改为在玩家完成转弯时立即返回,然后主线程应该加入。{/ p>