2015-10-06 57 views
0

顯然,因爲它的段錯誤,C++編譯器不會輸出任何東西?我在寫一些C++代碼時遇到了一些麻煩。我是一個新手,我一直在尋找這段時間現在...我無法弄清楚。如何調試C++ segfault?

我最好的猜測是它在Deck()構造函數中的某個地方,任何人都可以給我一隻手?

任何幫助,將不勝感激!

謝謝!

跟進:未來,有沒有人有任何調試segfaults的好方法?

Deck.cpp

#include "Deck.h" 

#include <iostream> 
#include <string> 
#include <vector> 
#include <algorithm> 

using std::ostream; 
using std::vector; 

const string Deck::RANKS[13] = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"}; 
const string Deck::SUITS[4] = {"H","D","C","S"}; 
string cards[52]; 
int card = 0; 


Deck::Deck() : size(0) 
{ 
    for (int i = 0; i < 13; i++) 
    { 
     for (int j = 0; j < 4; j++) 
     { 
      cards[size] = RANKS[i] + SUITS[j]; 
      size++; 
     } 
    } 

    shuffle(); 
} 

Deck::~Deck() {} 

void Deck::shuffle() 
{ 
    size = MAX_SIZE; 
    std::random_shuffle(&cards[0], &cards[MAX_SIZE-1]); 
} 

string Deck::getCard() 
{ 
    card++; 
    return cards[card-1]; 
} 

加入deck.h

#ifndef DECK_H 
#define DECK_H 


#include <ostream> 
#include <string> 
#include <vector> 
using std::ostream; 
using std::string; 
using std::vector; 

class Deck 
{ 
private: 
    static const int MAX_SIZE = 52; 
    static const string RANKS[13]; 
    static const string SUITS[4]; 
    static const string DECK[52]; 

    int size; 


public: 
    Deck(); 
    ~Deck(); 
    void shuffle(); 
    string getCard(); 
    int getDeckSize() const {return size;} 
    friend ostream& operator<<(ostream&, const Deck&); 
}; 

#endif 

Main.cpp的

#include <iostream> 
#include "Deck.h" 
using namespace std; 

int main() 
{ 


    int pairs = 0; 

    for(int x = 0; x < 100; x++) 
    { 
     cout << "yep"; 

     Deck deck; 
     cout << "awooga"; 

     deck.shuffle(); 
     cout << "hai"; 

     string cards[2]; 

     cards[0] = deck.getCard(); 
     cards[1] = deck.getCard(); 

     for(int y = 0; y < 5; y++) 
     { 
      string tempCard = deck.getCard(); 
      if(cards[0].compare(tempCard) == 0 || cards[1].compare(tempCard) == 0) 
      { 
       pairs++;  
      } 
     } 
    } 


    cout << pairs; 

    return 0; 
} 
+5

你用調試器通過代碼?這通常可以幫助很多...輸出語句的存在表明你依靠它們來告訴你代碼執行得有多遠。學習使用你的調試器。 – Steve

+1

*調試幫助請* ---使用GDB ... –

+2

當日有用的事實:像gdb這樣的調試器可以告訴你發生段錯誤的確切位置+回溯,而像valgrind這樣的工具有時可以告訴你更多信息。你應該學習如何使用它們。 –

回答

5

您的問題是getCard有副作用,增加每次card值你叫它。只要你調用它超過52次,你的程序可能會崩潰。請注意0​​是一個全局變量,並且在您創建新卡組時不會重置爲零。

我還注意到您撥打random_shuffle的電話有一個錯誤。結束迭代器需要超出容器的實際末尾,而不是指向,最終結果爲(所以它是半開範圍)。

最後,爲了在一般情況下調試分段錯誤,請在您的系統上啓用核心轉儲,並使用gdb將核心附加到您的二進制文件。這有時會給你一個很好的線索從哪裏開始。

+0

感謝您的所有迴應!研究現在獲取這些調試器。 getCard函數有意義,卡片可以超過52次。但是,每7次調用一次getCard(循環外2次,內循環中5次)後,我創建了一個新的卡片。這不會重置getCard正在使用的變量計數器嗎? – k9b

+0

@ k9b:我看不到代碼將'card'重置爲零。 –

+0

您的卡變量位於Deck.cpp文件的全局名稱空間中。哎呀。 – aslg