2017-01-25 15 views
0

コードを実行するとメッセンジャーが表示されますScattegories.exe has triggered a breakpoint. 12番目のヌードを入力した後に起こりますが、アレイにはまだ「スポット」があります。 スレッドもありますので多分そうですが、うまくいくようです。 私はそれが何であるかわからない、ありがとう。ビジュアルスタジオ2015ブレークポイントを打つ

// 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

ブレークポイントは、コールスタックに沿って、コードの行がバグを引き起こしているまでです。デバッガがブレークポイントをトリガするポイントです。 – drescherjm

+0

トピックをオフにする:['std :: async'があなたの役に立つかもしれません。](http://en.cppreference.com/w/cpp/thread/async) – user4581301

答えて

4

std::thread::~threadはこれを言う:

これは、関連するスレッド(合流可能()== true)を、STD ::終了()が呼び出されていた場合*。

std::threadが参加可能な場合は、std::terminate()が呼び出されます。 Visual Studioは何がうまくいかなかったかを検査できるように、std::terminate()に親切に行きます。 void table(int plr)では、std::thread t1(timer);でスレッドを作成しますが、決してそのスレッドに参加したり、スレッドから切り離したりすることはありません。

これを解決するには、プレーヤーがターンを終了した直後にメインスレッドが参加するようにtimerメソッドを変更する必要があります。

+0

私がする必要があったのは、それを切り離すことでした。 – Sela12

+0

デタッチが機能しているように見えますが、この方法では問題が発生します。例えば、スレッドは '' DING DONG !!! DING DONG !!!を出力します。毎回、おそらく別の出力の真ん中に\ n "'あります。 –

+0

'' DING DONG !!! DING DONG !!!時間が上がった!!! 'n' 'は一時的なものです。私がしたいのは、何かを入力してそのプレイヤーのターンを終了する能力を止めることです。それは、プレイヤーが単語を入力できる時間を制限することになっています。 – Sela12

関連する問題