Problem beim Kompilieren
-
Hallo ich habe ein kleines Poker programm geschrieben allerdings gibt es fehler beim Kompilieren und ich komme nicht weiter..
Ich stelle hier mal die Codes rein falls jemand einen Fehler findet würde ich mich über eine Korrektur freuen:
**
main.cpp**#include <iostream> #include "Deck.h" using namespace std; int main( int argc, char *argv[] ) { Deck * deck = new Deck(); deck->shuffle(); // shuffle the deck deck->deal(3); // deal 3 cards from the deck deck->deal(2); // deal 2 more cards from the deck deck->dealNext(); // should be the 6 card down in the deck // 3 + 2 + 1 + 47 = 53 , which is more then we have to deal deck->deal(47); // this should cause an error to be printed deck->dealNext(); // lets try to deal one more card just to see, it should give an error cout << endl; // if we shuffle again then we should be able to deal again without an error deck->shuffle(); deck->deal(52); // deal all cards in deck that we just shuffled return(0); }
Deck.cpp
#include <iostream> // basic input output stream #include <iomanip> // input output manipulation #include <algorithm> // random_shuffle() #include "Deck.h" using namespace std; // Constructor Deck::Deck() { card = new Card(); this->initialize(); } // Deconstructor Deck::~Deck() { delete card; } // Function: initialize // Purpose: void Deck::initialize( void ) { for( int position = 0; position < card->getTotalCards(); position++ ) this->setDeckValue( position ); } // Function: shuffle // Purpose: shuffle the deck in a randomly void Deck::shuffle( void ) { // TODO: this way of shuffling is not random enough random_shuffle( this->deck, this->deck+52 ); card->setRemaining( card->getTotalCards() ); // reset the remaining cards on each shuffle } void Deck::deal( int dealNum ) { // TODO: exception handling needed if( this->hasNext() ) { for( int position = 0; position < dealNum; position++ ) this->dealNext(); } else { // TODO: exception handling here // for now i will just do cout some shit cout << "Error: no more cards to deal" << endl; } } void Deck::dealNext( void ) { if( this->hasNext() ) { int position = ( card->getTotalCards() - card->getRemaining() ); this->printConsole( position ); card->setRemaining( card->getRemaining() - 1 ); } else { // TODO: exception handling here // for now i will just do cout some shit cout << "Error: no more cards to deal" << endl; } } bool Deck::hasNext( void ) { bool available = false; if( card->getRemaining() != 0 ) available = true; return( available ); } void Deck::printConsole( int deckPosition ) { cout << setw( 5 ) << setiosflags( ios::right ) << card->getFaceName( card->getCardNum( this->getDeckValue( deckPosition ) ) ) << " of " << setw( 8 ) << setiosflags( ios::left ) << card->getSuitName( card->getSuitNum( this->getDeckValue( deckPosition ) ) ) << ( (deckPosition + 1) % 4 == 0 ? '\n' : '\t' ); } void Deck::setDeckValue( int value ) { // TODO: exception handling needed this->deck[ value ] = value; } void Deck::setDeckValue( int position, int value ) { // TODO: exception handling needed this->deck[ position ] = value; } int Deck::getDeckValue( int position ) const { // TODO: exception handling needed return( this->deck[ position ] ); }
Card.h
#ifndef CARD_H_ #define CARD_H_ class Card { public: Card(); // constructor ~Card(); // deconstructor int remaining; // number of cards remaining/available // set functions int setRemaining( int ); // calculate and set remaing cards // get functions int getCardNum( int ); // get card number int getSuitNum( int ); // get suit number int getTotalCards( void ) const; // get the number of cards in a deck int getTotalSuits( void ) const; // get the number of suits in a deck const char *getFaceName( int ) const; // get card face name const char *getSuitName( int ) const; // get card suit name int getRemaining( void ); // get the number of remaining cards available private: const int TOTAL_CARDS; // constant total number of cards const int TOTAL_SUITS; // constant total number of suits const static char *FACE[ 13 ]; // constant array of each different card face name const static char *SUIT[ 4 ]; // constant array of each different card suit name }; // end Card class #endif
Deck.h
#ifndef DECK_H_ #define DECK_H_ #include "Card.h" class Deck { public: Deck(); // constructor ~Deck(); // deconstructor void shuffle( void ); // shuffle deck void deal( int ); // deal a specific number of cards bool hasNext( void ); // check for another card to deal void dealNext( void ); // deal the next card in the deck void printConsole( int ); // print to console private: int deck[ 52 ]; // deck of cards Card * card; // create a pointer to our cards void initialize( void ); // initialize deck // utility set functions void setDeckValue( int ); // set a deck value of 0 -> 51, position and value are the same void setDeckValue( int, int ); // set a deck value of 0 -> 51, position and value are different // utility get functions int getDeckValue( int ) const; // get a deck value }; // end Deck class #endif
Card.cpp
#include "Card.h" using namespace std; //const int Card::TOTAL_CARDS = 52; // total number of cards //const int Card::TOTAL_SUITS = 4; // total number of different suits // constant card names const char * Card::FACE[ 13 ] = { "Ace", "King", "Queen", "Jack", "Ten", "Nine", "Eight", "Seven", "Six", "Five", "Four", "Three", "Deuce" }; // constant suit names const char * Card::SUIT[ 4 ] = { "Spades", "Hearts" , "Diamonds", "Clubs" }; // Constructor Card::Card(): TOTAL_CARDS(52),TOTAL_SUITS(4),remaining(52){} // Deconstructor Card::~Card() { // TODO: de-initialize objects here } int Card::setRemaining( int value ) { // TODO: exception handling needed this->remaining = value; } int Card::getCardNum( int value ) { //TODO: exception handling needed return( value % 13 ); } int Card::getSuitNum( int value ) { // TODO: exception handling needed return( value / 13 ); } const char * Card::getFaceName( int value ) const { //TODO: exception handling needed return( this->FACE[ value ] ); } const char * Card::getSuitName( int value ) const { //TODO: exception handling needed return( this->SUIT[ value ] ); } int Card::getTotalCards( void ) const { //TODO: exception handling needed return( this->TOTAL_CARDS ); } int Card::getTotalSuits( void ) const { //TODO: exception handling needed return( this->TOTAL_SUITS ); } int Card::getRemaining( void ) { return( this->remaining ); }
Fehlermeldung:
1>------ Erstellen gestartet: Projekt: Poker, Konfiguration: Release Win32 ------ 1>Kompilieren... 1>main.cpp 1>.\main.cpp(34) : fatal error C1010: Unerwartetes Dateiende während der Suche nach dem vorkompilierten Header. Haben Sie möglicherweise vergessen, im Quellcode "#include "stdafx.h"" einzufügen? 1>Deck.cpp 1>.\Deck.cpp(111) : fatal error C1010: Unerwartetes Dateiende während der Suche nach dem vorkompilierten Header. Haben Sie möglicherweise vergessen, im Quellcode "#include "stdafx.h"" einzufügen? 1>Card.cpp 1>.\Card.cpp(77) : fatal error C1010: Unerwartetes Dateiende während der Suche nach dem vorkompilierten Header. Haben Sie möglicherweise vergessen, im Quellcode "#include "stdafx.h"" einzufügen? 1>Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\?????\Eigene Dateien\Visual Studio 2008\Projects\Poker\Poker\Release\BuildLog.htm" gespeichert. 1>Poker - 3 Fehler, 0 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
-
Das hatten wir schon unzählige mal. Poste die Fehlermeldung, das liest sich ja kein Mensch durch...
-
allerdings gibt es fehler beim Kompilieren
welchen?
btw:
Deck * deck = new Deck();
1. wieso?
2. du hast delete vergessen
3. nimmDeck deck;
und dann einfach.
statt->
und gibts nen grund, wieso du das
this->
immer mitschreibst? macht den code nicht gerade leserlicherbb
-
Öffne ein neues Projekt ohne vorkompilierte Header. In Visual Studio kann man das gleich beim erstellen des Projekt's einstellen.
-
Ohne vorkompilierte Header arbeiten. Projektoptionen->C/C++->Precompiled Headers
-
Habe nun die Precompiled Headers deaktiviert nun kommt folgende Fehlermeldung:
1>------ Erstellen gestartet: Projekt: Poker, Konfiguration: Release Win32 ------ 1>Kompilieren... 1>Card.cpp 1>.\Card.cpp(3) : error C2871: 'std': Es ist kein Namespace mit diesem Namen vorhanden 1>Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\???\Eigene Dateien\Visual Studio 2008\Projects\Poker\Poker\Release\BuildLog.htm" gespeichert. 1>Poker - 1 Fehler, 0 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
-
bitte copy&paste die _aktuelle_
Card.cpp
noch mal - zumindest die ersten 3 Zeilen...bb
-
ok hier nochmal die Zeilen:
#include "Card.h" using namespace std; //const int Card::TOTAL_CARDS = 52; // total number of cards
-
und die fehlermeldung findest du nicht logisch?
da du hast alle includes weggemacht hast, kennt der compiler dort keinen namespace std. du brauchst also diese using direktive nicht. die brauchst du immer nur, wenn du sowas _davor_ machst:
#include <standard_header>
wobeistandard_header
für all die 49 namen hier stehen kann:
http://www.cplusplus.com/reference/bb
-
Also muss da nun was genau machen??
-
Die Zeile wegmachen...
btw:
Card::Card(): TOTAL_CARDS(52),TOTAL_SUITS(4),remaining(52){}
wird den nächsten Fehler geben...
Wieso kannst du im Buch/Tutorial deiner Wahl nachlesenbb
-
Also Card::Card(): TOTAL_CARDS(52),TOTAL_SUITS(4),remaining(52){} einfach löschen
dann des "using namespace std;" löschen
und dann kompilieren??
-
Jetzt gibt es folgenden Fehler:
1>------ Erstellen gestartet: Projekt: Poker, Konfiguration: Release Win32 ------ 1>Kompilieren... 1>Card.cpp 1>Verknüpfen... 1>Deck.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: __clrcall Card::Card(void)" (??0Card@@$$FQAM@XZ)". 1>C:\Dokumente und Einstellungen\????\Eigene Dateien\Visual Studio 2008\Projects\Poker\Release\Poker.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise. 1>Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\????\Eigene Dateien\Visual Studio 2008\Projects\Poker\Poker\Release\BuildLog.htm" gespeichert. 1>Poker - 2 Fehler, 0 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
-
JadenJesse schrieb:
Also Card::Card(): TOTAL_CARDS(52),TOTAL_SUITS(4),remaining(52){} einfach löschen
nein(sonst passiert genau das, was jz passierst ist: du bekommst nen linker-fehler, weil du die fkt deklarierst aber nirgendwo definiert hast) - und ich seh auch gerade, dass die zeile doch keinen fehler verursachen wird... hatte nur die zeile hier gesehen:
//const int Card::TOTAL_CARDS = 52; // total number of cards
und war deshalb davon ausgeganen, dass es ne static-variable ist...
warum hast du die beiden varialben eigtl in caps geschrieben? (macht man eigtl nur bei makros oder globalen konstanten)
und wieso speicherst du es als member? versteh den sinn dahinter nicht... es wird sich ja wohl kaum von instanz zu instanz ändern...JadenJesse schrieb:
des "using namespace std;" löschen
und dann kompilieren??
japp
bb
-
Habe das was du sagtest,was ich löschn soll wieder hinzugefügt...
Nun kommt folgender Fehler:
1>------ Erstellen gestartet: Projekt: Poker, Konfiguration: Release Win32 ------ 1>Kompilieren... 1>Card.cpp 1>Verknüpfen... 1>Code wird generiert. 1>c:\dokumente und einstellungen\????\eigene dateien\visual studio 2008\projects\poker\poker\card.cpp(32) : error C4716: 'Card::setRemaining': Muss einen Wert zurückgeben 1>LINK : fatal error LNK1257: Fehler bei Codegenerierung. 1>Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\????\Eigene Dateien\Visual Studio 2008\Projects\Poker\Poker\Release\BuildLog.htm" gespeichert. 1>Poker - 2 Fehler, 0 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
-
JadenJesse schrieb:
Habe das was du sagtest,was ich löschn soll wieder hinzugefügt...
Nun kommt folgender Fehler:
1>------ Erstellen gestartet: Projekt: Poker, Konfiguration: Release Win32 ------ 1>Kompilieren... 1>Card.cpp 1>Verknüpfen... 1>Code wird generiert. 1>c:\dokumente und einstellungen\????\eigene dateien\visual studio 2008\projects\poker\poker\card.cpp(32) : error C4716: 'Card::setRemaining': Muss einen Wert zurückgeben 1>LINK : fatal error LNK1257: Fehler bei Codegenerierung. 1>Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\????\Eigene Dateien\Visual Studio 2008\Projects\Poker\Poker\Release\BuildLog.htm" gespeichert. 1>Poker - 2 Fehler, 0 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
Der Rückgabewert von
setRemaining
solltevoid
und nichtint
sein.
-
boar...
was verstehst du denn an der fehlermeldung nicht?
int Card::setRemaining( int value ) { // TODO: exception handling needed this->remaining = value; }
rein interesse-halber:
hast du den quelltext selbst geschrieben? oder nur erweitert?ich würde dir nahe legen, erst mal ein wenig selbst zu überlegen und falls du dann noch nicht drauf kommst, erst mal dein buch/tutorial weiterlesen oder nachschlagen und wenn dus dann noch nicht weist, kannste immernoch fragen...
aber das hier find ich gerade ziemlich nervig...bb
-
asdasd schrieb:
JadenJesse schrieb:
Habe das was du sagtest,was ich löschn soll wieder hinzugefügt...
Nun kommt folgender Fehler:
1>------ Erstellen gestartet: Projekt: Poker, Konfiguration: Release Win32 ------ 1>Kompilieren... 1>Card.cpp 1>Verknüpfen... 1>Code wird generiert. 1>c:\dokumente und einstellungen\????\eigene dateien\visual studio 2008\projects\poker\poker\card.cpp(32) : error C4716: 'Card::setRemaining': Muss einen Wert zurückgeben 1>LINK : fatal error LNK1257: Fehler bei Codegenerierung. 1>Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\????\Eigene Dateien\Visual Studio 2008\Projects\Poker\Poker\Release\BuildLog.htm" gespeichert. 1>Poker - 2 Fehler, 0 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
Der Rückgabewert von
setRemaining
solltevoid
und nichtint
sein.Das ist jetzt komisch sobald ich das einstelle kommt
1>------ Erstellen gestartet: Projekt: Poker, Konfiguration: Release Win32 ------ 1>Kompilieren... 1>Card.cpp 1>.\Card.cpp(28) : error C2182: 'value': Unzulässige Verwendung des Typs 'void' 1>Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\????\Eigene Dateien\Visual Studio 2008\Projects\Poker\Poker\Release\BuildLog.htm" gespeichert. 1>Poker - 1 Fehler, 0 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
-
poste doch mal das stück quelltext, zu der die fehlermeldung gehört (definition und deklaration der fkt) und der verwendeten fkt/var! wenn du das tust, hilft dir bestimmt iwann der nächste.
-
// Constructor Card::Card(): TOTAL_CARDS(52),TOTAL_SUITS(4),remaining(52){} // Deconstructor Card::~Card() { // TODO: de-initialize objects here } int Card::setRemaining( int value ) { // TODO: exception handling needed this->remaining = value; } int Card::getCardNum( int value ) { //TODO: exception handling needed return( value % 13 ); }
das ist der code der zur fehlermeldung gehört