如何调试C++;赛格断层? 显然,由于它的StEngbug,C++编译器不会输出任何东西吗?我写的一些C++代码有点麻烦。我是个新手,我已经找了一段时间了。。。我想不出来

如何调试C++;赛格断层? 显然,由于它的StEngbug,C++编译器不会输出任何东西吗?我写的一些C++代码有点麻烦。我是个新手,我已经找了一段时间了。。。我想不出来,c++,segmentation-fault,C++,Segmentation Fault,我最好的猜测是它在Deck()构造函数中的某个地方,有人能帮我一下吗 任何帮助都将不胜感激 谢谢 跟进:将来,有没有人有好的调试SEGFULTS的方法 Deck.cpp #include "Deck.h" #include <iostream> #include <string> #include <vector> #include <algorithm> using std::ostream; using std::vector; cons

我最好的猜测是它在Deck()构造函数中的某个地方,有人能帮我一下吗

任何帮助都将不胜感激

谢谢

跟进:将来,有没有人有好的调试SEGFULTS的方法

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”
#包括
#包括
#包括
#包括
使用std::ostream;
使用std::vector;
常量字符串组::秩[13]={“A”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”、“10”、“J”、“Q”、“K”};
常量字符串组::SUITS[4]={“H”、“D”、“C”、“S”};
串卡[52];
int卡=0;
Deck::Deck():大小(0)
{
对于(int i=0;i<13;i++)
{
对于(int j=0;j<4;j++)
{
卡片[尺寸]=等级[i]+套装[j];
大小++;
}
}
洗牌();
}
甲板::~Deck(){}
空牌组::洗牌()
{
尺寸=最大尺寸;
标准::随机洗牌(&cards[0],&cards[MAX_SIZE-1]);
}
字符串组::getCard()
{
卡++;
返回卡[card-1];
}
甲板

#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
#如果没有甲板#
#定义甲板
#包括
#包括
#包括
使用std::ostream;
使用std::string;
使用std::vector;
甲板
{
私人:
静态常数int MAX_SIZE=52;
静态常量字符串秩[13];
静态常量字符串适合[4];
静态常量字符串组[52];
整数大小;
公众:
甲板();
~Deck();
无效洗牌();
字符串getCard();
int getDeckSize()常量{return size;}

friend ostream&operator您的问题是
getCard
有副作用,每次调用时都会增加
card
的值。一旦调用超过52次,您的程序可能会崩溃。请注意,
card
是一个全局变量,在创建新组时不会重置为零

我还注意到您对
random\u shuffle
的调用有一个off by one错误。end迭代器需要超出容器的实际末尾,而不是指向末尾(因此它是半开放范围)


最后,为了调试分段错误,请在系统上启用core转储,并使用gdb将core附加到二进制文件。这有时会给您一个很好的开始位置的线索。

您的问题是
getCard
有副作用,每次调用
card
都会增加它的值。只要您调用它超过52次,您的程序可能会崩溃。请注意,
card
是一个全局变量,在创建新组时不会重置为零

我还注意到您对
random\u shuffle
的调用有一个off by one错误。end迭代器需要超出容器的实际末尾,而不是指向末尾(因此它是半开放范围)


最后,为了调试分段错误,请在系统上启用核心转储,并使用gdb将核心附加到二进制文件。这有时会给您一个很好的线索,从何处开始。

您是否使用调试器逐步完成了代码?这通常会有很大帮助…输出语句的出现表明您依赖于hem告诉你你的代码执行了多远。学习使用调试器。调试帮助请使用GDB…一天中有用的事实:像GDB这样的调试器可以告诉你segfault发生的确切位置和回溯,像valgrind这样的工具有时可以告诉你更多。你应该学习如何使用它们。“有人有调试segfaults的好方法吗?”是的,使用你的调试器。以后不要这样做-现在就做!如果你移动
字符串组[52];
int-card;
.cpp
文件导入头文件,并在
Deck
的构造函数中初始化
card=0;
,则不会出现分段错误。您是否使用调试程序逐步完成代码?这通常会有很大帮助…输出语句的存在表明您正在执行撒谎告诉你代码执行了多远。学会使用调试器。调试帮助请使用GDB…一天中有用的事实:像GDB这样的调试器可以告诉你SEGFULT发生的确切位置和回溯,像valgrind这样的工具有时可以告诉你更多。你应该学会如何使用它们。”有人有什么好的调试segfaults的方法吗?“是的,使用你的调试器。以后不要这样做-现在就做!如果你移动
字符串组[52]
int-card;
.cpp
文件导入头文件,并在
Deck
的构造函数中初始化
card=0;
,则不会出现分段错误。感谢所有的响应!现在查看这些调试器。getCard函数可以解释卡的运行方式。Howe无论如何,我在每7次调用getCard(2次在循环外,5次在循环内)之后创建一个新的组。这不会重置getCard正在使用的变量计数器吗?您的card变量位于Deck.cpp文件的全局命名空间中。Oops.Ah,所以真正的问题是该变量的声明位置。谢谢!感谢所有的响应!现在查看这些调试器。getCard函数可以解释卡如何超过52。但是,我在每7次调用getCard(循环外2次,循环内5次)后创建一个新的数据组。这不会重置getCard正在使用的变量计数器吗?您的card变量位于deck.cpp文件.Oops.Ah中的全局命名空间中,所以真正的问题是该变量的声明位置。谢谢!
#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;
}