草庐IT

c++ - 在 Code::Blocks 中调试我的 C++ 项目时出现 "Program received signal SIGSEGV, Segmentation fault. In ?? () ()"

coder 2024-02-03 原文

第一次发帖。 我正在做一项大学作业,要求我完成一个模拟契约(Contract)桥牌游戏开标的程序。我获得了以下包含主要功能的文件:

/// File: bridge.cpp
/// Creates a deck of cards, shuffles them and displays them.

#include <iostream>
#include <iomanip>
#include <fstream>
#include "game.h"

const int NUM_DEALS = 4;

using namespace std;

int main(int argc, char *argv[]) {

   Game game;
   ifstream infile;
   bool fromFile = false;

   if (argc == 2) {

      // open the file and check it exists
      infile.open(argv[1]);
      if (infile.fail()) {
         cerr <<  "Error: Could not find file" << endl;
         return 1;
      }
      fromFile = true;
   }

   for (int deal = 0; deal < NUM_DEALS; deal++) {
      game.setup(fromFile);
      if (fromFile) {
         infile >> game;
      }
      game.deal();
      game.auction();
      cout << game << endl;
      cout << endl << "=============================================================="    << endl << endl;
      game.nextDealer();
   }

   // close the file
   if (argc == 2) {
      infile.close();
   }

   return 0;
}

我已经完成了模拟卡片对象、牌组对象、手对象和游戏对象的其他类,但是当我单击“构建并运行”时我的程序崩溃了。下一个合乎逻辑的步骤是调试,但当我这样做时,我在调试器窗口中得到以下输出:

Building to ensure sources are up-to-date
Selecting target: 
Release
Adding source dir: C:\Users\Jack\Documents\CodeBlocks\BridgeAssignment\
Adding source dir: C:\Users\Jack\Documents\CodeBlocks\BridgeAssignment\
Adding file: C:\Users\Jack\Documents\CodeBlocks\BridgeAssignment\bin\Release\BridgeAssignment.exe
Changing directory to: C:/Users/Jack/Documents/CodeBlocks/BridgeAssignment/.
Set variable: PATH=.;C:\Program Files (x86)\CodeBlocks\MinGW\bin;C:\Program Files (x86)\CodeBlocks\MinGW;C:\Program Files (x86)\PHP;C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Intel\iCLS Client;C:\Program Files\Intel\iCLS Client;C:\Program Files (x86)\AMD APP\bin\x86_64;C:\Program Files (x86)\AMD APP\bin\x86;C:\Windows\System32;C:\Windows;C:\Windows\System32\wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Sony\VAIO Improvement;C:\Program Files (x86)\Sony\VAIO Startup Setting Tool;C:\Program Files (x86)\Windows Live\Shared;C:\Program Files (x86)\Jahshaka\..\gtk2\bin;C:\Program Files (x86)\Jahshaka\..\mlt\bin;C:\Program Files (x86)\OpenLibraries\bin;C:\Users\Jack\AppData\Local\Smartbar\Application;C:\Program Files\Microsoft\Web Platform Installer;C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0;C:\Program Files (x86)\Windows Kits\8.0\Windows Performance Toolkit;C:\Program Files\Microsoft SQL Server\110\Tools\Binn;C:\Program Files (x86)\QuickTime\QTSystem;C:\Program Files (x86)\Autodesk\Backburner
Starting debugger: C:\Program Files (x86)\CodeBlocks\MINGW\bin\gdb.exe -nx -fullname  -quiet  -args C:/Users/Jack/Documents/CodeBlocks/BridgeAssignment/bin/Release/BridgeAssignment.exe
done
Registered new type: wxString
Registered new type: STL String
Registered new type: STL Vector
Setting breakpoints
Reading symbols from C:\Users\Jack\Documents\CodeBlocks\BridgeAssignment\bin\Release\BridgeAssignment.exe...(no debugging symbols found)...done.
Debugger name and version: GNU gdb (GDB) 7.5
Child process PID: 13628
Program received signal SIGSEGV, Segmentation fault.
In ?? () ()

如果这有助于解决问题,这是我的其他类(class)。

卡片.h:

#include <string>
#include <iostream>
#ifndef CARD_H
#define CARD_H

using namespace std;

enum Suit {CLUBS, DIAMONDS, HEARTS, SPADES};

enum Rank {TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE};

class Card
{
    public:
        Card();

        Card(Rank rank, Suit suit);

        Card(string);

        ~Card();

        Rank getRank();

        Suit getSuit();

        bool operator() (Card*, Card*);

        friend ostream& operator<<(ostream&, Card&);

    private:
        Suit suit;

        Rank rank;
};

#endif // CARD_H

卡片.cpp:

#include "card.h"
#include <iostream>

Card::Card()
{
    this->suit = CLUBS;
    this->rank = TWO;
}

Card::Card(Rank rank, Suit suit)
{
    this->suit = suit;
    this->rank = rank;
}

Card::Card(string str)
{
    char rank = str.at(0);
    char suit = str.at(1);
    Rank cardRank = TWO;
    Suit cardSuit = CLUBS;
    switch(rank)
    {
        case '2': cardRank = TWO;
            break;
        case '3': cardRank = THREE;
            break;
        case '4': cardRank = FOUR;
            break;
        case '5': cardRank = FIVE;
            break;
        case '6': cardRank = SIX;
            break;
        case '7': cardRank = SEVEN;
            break;
        case '8': cardRank = EIGHT;
            break;
        case '9': cardRank = NINE;
            break;
        case 'T': cardRank = TEN;
            break;
        case 'J': cardRank = JACK;
            break;
        case 'Q': cardRank = QUEEN;
            break;
        case 'K': cardRank = KING;
            break;
        case 'A': cardRank = ACE;
            break;
    }
    switch(suit)
    {
        case 'C': cardSuit = CLUBS;
            break;
        case 'D': cardSuit = DIAMONDS;
            break;
        case 'H': cardSuit = HEARTS;
            break;
        case 'S': cardSuit = SPADES;
            break;
    }
    this->suit = cardSuit;
    this->rank = cardRank;
}

Card::~Card()
{

}

Rank Card::getRank()
{
    return this->rank;
}

Suit Card::getSuit()
{
    return this->suit;
}

bool Card::operator() (Card* cardOne, Card* cardTwo)
{
    if (cardOne->getSuit() > cardTwo->getSuit())
    {
        return cardOne->getRank() >= cardTwo->getRank();
    }
    else if (cardOne->getSuit() < cardTwo->getSuit())
    {
        return cardOne->getRank() > cardTwo->getRank();
    }
    else
    {
        return cardOne->getRank() > cardTwo->getRank();
    }
}

ostream& operator <<(ostream& out, Card& card)
{
    string cardID = "";
    switch(card.getRank())
    {
        case TWO: cardID += "2";
            break;
        case THREE: cardID += "3";
            break;
        case FOUR: cardID += "4";
            break;
        case FIVE: cardID += "5";
            break;
        case SIX: cardID += "6";
            break;
        case SEVEN: cardID += "7";
            break;
        case EIGHT: cardID += "8";
            break;
        case NINE: cardID += "9";
            break;
        case TEN: cardID += "T";
            break;
        case JACK: cardID += "J";
            break;
        case QUEEN: cardID += "Q";
            break;
        case KING: cardID += "K";
            break;
        case ACE: cardID += "A";
    }
    switch(card.getSuit())
    {
        case CLUBS: cardID += "C";
            break;
        case DIAMONDS: cardID += "D";
            break;
        case HEARTS: cardID += "H";
            break;
        case SPADES: cardID += "S";
            break;
    }
    out << cardID;
    return out;
}

Deck.h:

#ifndef DECK_H
#define DECK_H
#include "card.h"
#include <iostream>

using namespace std;

class Deck
{
    public:
        Deck();

        virtual ~Deck();

        void reset();

        Card* dealNextCard();

        void shuffle();

        friend ostream& operator<<(ostream&, Deck&);

        friend istream& operator>>(istream&, Deck&);

    private:
        int cardsDealt;
        Card** deckArray;

};

#endif // DECK_H

甲板.cpp:

#include "Deck.h"
#include "Card.h"
#include "random.h"
#include <iostream>

Deck::Deck()
{
    deckArray = new Card*[52];
    int counter = 0;
    cardsDealt = 0;
    for (int i = 0; i < 13; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            *deckArray[counter] = Card((Rank)i, (Suit)j);
            counter++;
        }
    }
}

Deck::~Deck()
{
    //dtor
}

void Deck::reset()
{
    cardsDealt = 0;
}

Card* Deck::dealNextCard()
{
    cardsDealt++;
    return deckArray[cardsDealt-1];
}

void Deck::shuffle()
{
    Random rand;
    int index1 = rand.randomInteger(0,53);
    int index2 = rand.randomInteger(0,53);
    Card temp = *deckArray[index1];
    deckArray[index1] = deckArray[index2];
    *deckArray[index2] = temp;
}

ostream& operator<<(ostream& out, Deck& deck)
{
    string cards = "";
    for (int i = 0; i < 52; i++)
    {
        out << " " << deck.deckArray[i];
    }
    return out;
}

istream& operator>>(istream& in, Deck& deck)
{
    string text[52];
    for (int i = 0; i < 52; i++)
    {
        in >> text[i];
    }
    for (int i = 0; i < 52; i++)
    {
        char rank = text[i].at(0);
        char suit = text[i].at(1);
        Rank cardRank = TWO;
        Suit cardSuit = CLUBS;
        switch(rank)
        {
            case '2': cardRank = TWO;
                break;
            case '3': cardRank = THREE;
                break;
            case '4': cardRank = FOUR;
                break;
            case '5': cardRank = FIVE;
                break;
            case '6': cardRank = SIX;
                break;
            case '7': cardRank = SEVEN;
                break;
            case '8': cardRank = EIGHT;
                break;
            case '9': cardRank = NINE;
                break;
            case 'T': cardRank = TEN;
                break;
            case 'J': cardRank = JACK;
                break;
            case 'Q': cardRank = QUEEN;
                break;
            case 'K': cardRank = KING;
                break;
            case 'A': cardRank = ACE;
                break;
        }
        switch(suit)
        {
            case 'C': cardSuit = CLUBS;
                break;
            case 'D': cardSuit = DIAMONDS;
                break;
            case 'H': cardSuit = HEARTS;
                break;
            case 'S': cardSuit = SPADES;
                break;
        }
        *deck.deckArray[i] = Card(cardRank, cardSuit);
    }
    return in;
}

手.h:

#ifndef HAND_H
#define HAND_H
#include "card.h"
#include <iostream>
#include <vector>
#include <set>

class Hand
{
    public:
        Hand();

        virtual ~Hand();

        void clear();

        void addCard(Card*);

        string makeBid();

        friend ostream& operator<< (ostream&, Hand&);

    private:
        unsigned int strength;

        unsigned int highCardPoints;

        unsigned int lengthPoints;

        int addHighCards(vector<Card*>);

        int findLengthPoints(vector<Card*>);

        void getStrength();

        bool balanced;

        void getBalance();

        void getWinningSuit();

        set<int> suitLen;

        vector<Card*> clubs;

        vector<Card*> diamonds;

        vector<Card*> hearts;

        vector<Card*> spades;

        vector< vector<Card*> > winningSuit;

        vector<string> winningSuitStr;
};
#endif // HAND_H

手.cpp:

#include "Hand.h"
#include "card.h"
#include <vector>
#include <set>
#include <iterator>
#include <iostream>

Hand::Hand()
{
    strength = 0;
    balanced = false;
}

Hand::~Hand()
{
    //dtor
}

void Hand::clear()
{
    clubs.clear();
    diamonds.clear();
    hearts.clear();
    spades.clear();
    strength = 0;
    balanced = false;
}

void Hand::addCard(Card* card)
{
    switch(card->getSuit())
    {
        case CLUBS: clubs.push_back(card);
            break;
        case DIAMONDS: diamonds.push_back(card);
            break;
        case HEARTS: hearts.push_back(card);
            break;
        case SPADES: spades.push_back(card);
            break;
    }
}

void Hand::getBalance()
{
    if ((suitLen.count(4)==2 && suitLen.count(3)==1 && suitLen.count(2)==1)
        || (suitLen.count(4)==1 && suitLen.count(3)==3))
        {
            balanced = true;
        }
        else
        {
            balanced = false;
        }
}

void Hand::getWinningSuit()
{
    if (clubs.size() >= diamonds.size() && clubs.size() >= hearts.size() && clubs.size() >= spades.size())
    {
        winningSuit.push_back(clubs);
        winningSuitStr.push_back("C");
    }
    if (diamonds.size() >= clubs.size() && diamonds.size() >= hearts.size() && diamonds.size() >= spades.size())
    {
        winningSuit.push_back(diamonds);
        winningSuitStr.push_back("D");
    }
    if (hearts.size() >= clubs.size() && hearts.size() >= diamonds.size() && hearts.size() >= spades.size())
    {
        winningSuit.push_back(hearts);
        winningSuitStr.push_back("H");
    }
    if (spades.size() >= clubs.size() && spades.size() >= diamonds.size() && spades.size() >= hearts.size())
    {
        winningSuit.push_back(spades);
        winningSuitStr.push_back("S");
    }
}

int Hand::addHighCards(vector<Card*> suit)
{
    int highCardPoints = 0;
    for (unsigned int i = 0; i < suit.size(); i++)
    {
        switch(suit[i]->getRank())
        {
            case ACE: highCardPoints += 4;
                break;
            case KING: highCardPoints += 3;
                break;
            case QUEEN: highCardPoints += 2;
                break;
            case JACK: highCardPoints += 1;
                break;
            default:
                break;
        }
    }
    return highCardPoints;
}

int Hand::findLengthPoints(vector<Card*> suit)
{
    if (suit.size() > 4)
    {
        return suit.size() - 4;
    }
    return 0;
}

void Hand::getStrength()
{
    highCardPoints = 0;
    lengthPoints = 0;
    highCardPoints += addHighCards(clubs);
    highCardPoints += addHighCards(diamonds);
    highCardPoints += addHighCards(hearts);
    highCardPoints += addHighCards(spades);
    lengthPoints += findLengthPoints(clubs);
    lengthPoints += findLengthPoints(diamonds);
    lengthPoints += findLengthPoints(hearts);
    lengthPoints += findLengthPoints(spades);
    strength = highCardPoints + lengthPoints;
}

string Hand::makeBid()
{
    suitLen.insert(clubs.size());
    suitLen.insert(diamonds.size());
    suitLen.insert(hearts.size());
    suitLen.insert(spades.size());
    getStrength();
    getBalance();
    getWinningSuit();
    if (balanced)
    {
        if (strength >= 0 && strength <= 12)
        {
            if (suitLen.count(6)==1)
            {
                if (winningSuit[0]==clubs)
                {
                    return "PASS";
                }
                else
                {
                    return "2" + winningSuitStr[0];
                }
            }
            else if (suitLen.count(6)==2)
            {
               return "2" + winningSuitStr[0];
            }
            else if (suitLen.count(7)==1)
            {
                return "3" + winningSuitStr[0];
            }
            else if (suitLen.count(8)==1)
            {
                return "4" + winningSuitStr[0];
            }
            else
            {
                return "PASS";
            }
        }
        else if (strength >= 13 && strength <= 21)
        {
            if (winningSuit.size()==2 && winningSuit[0].size()>=5)
            {
                return "1" + winningSuitStr[0];
            }
            else if (winningSuit.size()>=2 && winningSuit[0].size()==4)
            {
                return "1" + winningSuitStr[winningSuitStr.size()-1];
            }
            else
            {
                return "1" + winningSuitStr[0];
            }
        }
        else /**< if (strength >= 22)*/
        {
            return "2C";
        }
    }
    else
    {
        if (strength >= 0 && strength <= 12)
        {
            return "PASS";
        }
        else if (strength == 13 || strength == 14 || strength == 18 || strength == 19)
        {
            if (clubs.size() == diamonds.size())
            {
                if (clubs.size() == 4)
                {
                    return "1D";
                }
                return "1C";
            }
            else
            {
                if (clubs.size() > diamonds.size())
                {
                    return "1C";
                }
                return "1D";
            }
        }
        else if (strength >= 15 && strength <= 17)
        {
            return "1 NT";
        }
        else if (strength == 20 || strength == 21)
        {
            return "2 NT";
        }
        else
        {
            return "2C";
        }
    }
}

ostream& operator<<(ostream& out, Hand& hand)
{
    out << "SPADES : ";
    for (unsigned int i = 0; i < hand.spades.size(); i++)
    {
        out << hand.spades[i] << " ";
    }
    out << endl;
    out << "HEARTS : ";
    for (unsigned int i = 0; i < hand.hearts.size(); i++)
    {
        out << hand.hearts[i] << " ";
    }
    out << endl;
    out << "DIAMONDS : ";
    for (unsigned int i = 0; i < hand.diamonds.size(); i++)
    {
        out << hand.diamonds[i] << " ";
    }
    out << endl;
    out << "CLUBS : ";
    for (unsigned int i = 0; i < hand.clubs.size(); i++)
    {
        out << hand.clubs[i] << " ";
    }
    out << endl;
    out << hand.highCardPoints << " HCP, " << hand.lengthPoints << " LP, Total = " << hand.strength << endl;
    return out;
}

游戏.h:

#ifndef GAME_H
#define GAME_H
#include <iostream>
#include "Deck.h"
#include "Hand.h"

enum Position {NORTH, EAST, SOUTH, WEST};

class Game
{
    public:
        Game();

        virtual ~Game();

        void setup(bool);

        void deal();

        void auction();

        void nextDealer();

        friend ostream& operator<< (ostream&, Game&);

        friend istream& operator>> (istream&, Game&);

    private:
        Deck gameDeck;

        Hand** gameHands;

        Position dealer;

        string* openingBid;

};

#endif // GAME_H

游戏.cpp:

#include "Game.h"
#include "Deck.h"
#include "Hand.h"
#include <iostream>

Game::Game()
{
    gameDeck = Deck();
    gameHands = new Hand*[4];
    gameHands[0] = new Hand();
    gameHands[1] = new Hand();
    gameHands[2] = new Hand();
    gameHands[3] = new Hand();
    dealer = NORTH;
}

Game::~Game()
{
    //dtor
}

void Game::setup(bool fromFile)
{
    if (!fromFile)
    {
        gameDeck.shuffle();
        gameDeck.reset();
        for (unsigned int i = 0; i < 4; i++)
        {
            gameHands[i]->clear();
        }
    }
}

void Game::deal()
{
    for (unsigned int i = 0; i < 52; i++)
    {
        gameHands[(i%4)+1]->addCard(gameDeck.dealNextCard());
    }
}

void Game::auction()
{
    openingBid = new string[2];
    openingBid[0] = "PASS";
    openingBid[1] = "PASS";
    for (unsigned int i = 0; i < 4; i++)
    {
        if (gameHands[i]->makeBid() != "PASS")
        {
            switch(i)
            {
                case 0: openingBid[0] = "NORTH";
                    break;
                case 1: openingBid[0] = "EAST";
                    break;
                case 2: openingBid[0] = "SOUTH";
                    break;
                case 3: openingBid[0] = "WEST";
                    break;
            }
            openingBid[1] = gameHands[i]->makeBid();
            break;
        }
    }
}

void Game::nextDealer()
{
    int temp = (int)dealer;
    temp++;
    temp = temp % 4;
    dealer = (Position)temp;
}

ostream& operator<< (ostream& out, Game& game)
{
    out << "NORTH";
    out << game.gameHands[0];
    out << endl;
    out << "EAST";
    out << game.gameHands[1];
    out << endl;
    out << "SOUTH";
    out << game.gameHands[2];
    out << endl;
    out << "WEST";
    out << game.gameHands[3];
    out << endl;
    return out;
}

istream& operator>> (istream& in, Game& game)
{
    in >> game.gameDeck;
    return in;
}

这也是我正在使用的预制随机类。

随机.h:

#ifndef _random_h
#define _random_h


/// This class provides several functions for generating pseud-random numbers.
///
class Random {
public:

   /// \brief
   ///
   /// Initialize the randomizer.
   ///
   Random();


   /// \brief
   ///
   /// Generates a random integer number greater than or equal to low and less than high.
   /// \param low int - lower bound for range (inclusive).
   /// \param high int - upper bound for range (exclusive).
   /// \return int - A random integer number greater than or equal to low and less than high.
   ///
   int randomInteger(int low, int high);

   /// \brief
   /// Generates a random real number greater than or equal to low and less than high.
   ///
   /// \param low double - lower bound for range (inclusive).
   /// \param high double - upper bound for range (exclusive).
   /// \return double - A random real number greater than or equal to low and less than high.
   ///
   double randomReal(double low, double high);

   /// \brief
   /// Generates a true false outcome based on the probability p.
   /// Calling randomChance(0.30) returns true 30% of the time.
   ///
   /// \param p double - Value between 0 (never) and 1 (always).
   /// \return bool - true or false based on p.
   ///
   bool randomChance(double p);

private:

   /// \brief
   ///
   /// Initializes teh random-number generator so that its results are unpredictable.  If this function is
   /// not called the other functions will return the same values on each run.
   ///
   void randomize();
};

#endif // _random_h

随机.cpp:

#include <cstdlib>
#include <ctime>
#include "random.h"

/// This class provides several functions for generating pseud-random numbers.
///
Random::Random() {
   randomize();
}


/// \brief
/// Generates a random integer number greater than or equal to low and less than or equal to high.
///
/// \param low int - lower bound for range (inclusive).
/// \param high int - upper bound for range (inclusive).
/// \return int - A random integer number greater than or equal to low and less than or equal to high.
///
int Random::randomInteger(int low, int high) {
   double d = double(rand()) / (double(RAND_MAX) + 1);
   int k = int(d * (high - low  + 1));
   return low + k;
}

/// \brief
/// Generates a random real number greater than or equal to low and less than high.
///
/// \param low double - lower bound for range (inclusive).
/// \param high double - upper bound for range (exclusive).
/// \return double - A random real number greater than or equal to low and less than high.
///
double Random::randomReal(double low, double high) {
   double d = double(rand()) / (double(RAND_MAX) + 1);
   return low + d * (high - low);
}

/// \brief
/// Generates a true false outcome based on the probability p.
/// Calling randomChance(0.30) returns true 30% of the time.
///
/// \param p double - Value between 0 (never) and 1 (always).
/// \return bool - true or false based on p.
///
bool Random::randomChance(double p) {
   return randomReal(0, 1) < p;
}

/// \brief
///
/// Initializes the random-number generator so that its results are unpredictable.  If this function is
/// not called the other functions will return the same values on each run.
///
void Random::randomize() {
   srand(int(time(NULL)));
}

我一直在互联网上寻找这个问题的解决方案,但似乎没有适合我的方案,运行时崩溃,调试时出现 SIGSEGV。希望这里有人能帮助我,我越来越绝望了,哈哈。

谢谢。

最佳答案

您的代码太多无法确定,但问题很可能出在您的套牌构造函数中。

Deck::Deck()
{
  // Here you allocate space for 52 pointers, not Cards
  deckArray = new Card*[52];
  ...
    // at this location there's no space for a card but for a pointer
    //*deckArray[counter] = Card((Rank)i, (Suit)j);
    // so you should do this instead:
    deckArray[counter] = new Card((Rank)i, (Suit)j);
    // to allocate needed space for the card
  ...
}

总而言之,您永远不会分配存储卡片所需的空间。

关于c++ - 在 Code::Blocks 中调试我的 C++ 项目时出现 "Program received signal SIGSEGV, Segmentation fault. In ?? () ()",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23108126/

有关c++ - 在 Code::Blocks 中调试我的 C++ 项目时出现 "Program received signal SIGSEGV, Segmentation fault. In ?? () ()"的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  3. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  4. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  5. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  6. ruby-on-rails - Rails 3 I18 : translation missing: da. datetime.distance_in_words.about_x_hours - 2

    我看到这个错误:translationmissing:da.datetime.distance_in_words.about_x_hours我的语言环境文件:http://pastie.org/2944890我的看法:我已将其添加到我的application.rb中:config.i18n.load_path+=Dir[Rails.root.join('my','locales','*.{rb,yml}').to_s]config.i18n.default_locale=:da如果我删除I18配置,帮助程序会处理英语。更新:我在config/enviorments/devolpment

  7. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  8. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  9. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  10. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

随机推荐