undefined reference problem
-
Wie compilierst/linkst du das Programm?
Wie lautet die vollständige Fehlermeldung?
Ich habe ein leeres Projekt gemacht und die Dateien reingeadded. Ich benutze Code Blocks.
Die vollständige Fehlermeldung lautet:||=== Build: Debug in poker (compiler: GNU GCC Compiler) ===|
C:\c++\poker\pokermind.cpp||In member function 'void pokermind::setboardremove(char)':|
C:\c++\poker\pokermind.cpp|50|warning: value computed is not used [-Wunused-value]|
obj\Debug\poker\pokerface.o||In functionmain':| C:\c++\poker\pokerface.cpp|6|undefined reference to
pokermind::pokermind()'|
C:\c++\poker\pokerface.cpp|8|undefined reference to `pokermind::setboardadd(char)'|
||error: ld returned 1 exit status|
||=== Build failed: 3 error(s), 1 warning(s) (0 minute(s), 3 second(s)) ===|
-
@It0101 sagte in undefined reference problem:
"unsigned char" ist eine vorzeichenlose ganzzahlige Zahl. Daher wird die Funktion in keinem Fall "-1" zurück geben.
Ok, danke, aber mir geht es aktuell nur darum es zum laufen zu bringen.
-
Hast du den Code ("pokermind.cpp") denn so wie von @Swordfish gepostet, benutzt?
-
@Th69 sagte in undefined reference problem:
Hast du den Code ("pokermind.cpp") denn so wie von @Swordfish gepostet, benutzt?
Ok, mein Fehler ich hatte die Kommentierungen im Code übersehen.
-
@Swordfish sagte in undefined reference problem:
pokermind(); // aber warum einen leeren Konstruktor überhaupt hinschreiben!?
Ich versuche nur die Struktur erstmal zum laufen zu bringen und dann später kommt eventuell was in den Konstruktur.
" std::vector<char> vucboard = { -1 }; // ist mir auch irgendwie unklar, wozu das soll"
Ich definiere einen vector der von den Funktionen bearbeitet wird.
Die Struktur von pokermind.cpp habe ich. Ich habe sie nur weggelassen (//...) weil ich gelesen habe das man seinen Code kurz und prägnant halten soll.
-
@mmmmmmmm sagte in undefined reference problem:
Ich definiere einen vector der von den Funktionen bearbeitet wird.
Ja, aber was soll die
-1
als Element des Vektors? Soll das anzeigen, daß er leer ist?Wie sieht denn nun Dein kompletter Code aus? Wie wird Compiler und Linker aufgerufen? Was steht (alles!) im Ausgabefenster von Code::Blocks?
-
@Swordfish sagte in undefined reference problem:
@mmmmmmmm sagte in undefined reference problem:
Ich definiere einen vector der von den Funktionen bearbeitet wird.
Ja, aber was soll die
-1
als Element des Vektors? Soll das anzeigen, daß er leer ist?Das ist die Anfangsinitialisierung. Jetzt wo du nachfragst kommt mir die Idee das das nicht funktionieren könnte.
-
@mmmmmmmm sagte in undefined reference problem:
Das ist die Anfangsinitialisierung. Jetzt wo du nachfragst kommt mir die Idee das das nicht funktionieren könnte.
Das es eine Initialisierung ist, ist klar. Das Funktioniert schon. Meine Frage war auch nicht was es ist sondern wozu.
-
@Swordfish sagte in undefined reference problem:
@mmmmmmmm sagte in undefined reference problem:
Das ist die Anfangsinitialisierung. Jetzt wo du nachfragst kommt mir die Idee das das nicht funktionieren könnte.
Das es eine Initialisierung ist, ist klar. Das Funktioniert schon. Meine Frage war auch nicht was es ist sondern wozu.
OK, dieser vector spiegelt das Board bei einem Pokerspiel wieder. Auf diesen vector soll innerhalb der gesamten Klasse zugegriffen werden können. Ich hoffe das beantwortet die Frage.
-
@Swordfish sagte in undefined reference problem:
Wie sieht denn nun Dein kompletter Code aus? Wie wird Compiler und Linker aufgerufen? Was steht (alles!) im Ausgabefenster von Code::Blocks?
?
@mmmmmmmm sagte in undefined reference problem:
OK, dieser vector spiegelt das Board bei einem Pokerspiel wieder. Auf diesen vector soll innerhalb der gesamten Klasse zugegriffen werden können. Ich hoffe das beantwortet die Frage.
Ich habe noch keine Partie Poker gespielt bei der bei Spielbeginn eine
-1
auf dem Tisch rumlag.
-
Danke, ich hatte übersehen das deine Funktionen alle ein pokermind:: haben. Jetzt beschwert sich der Kompiler über etwas anderes aber das werde ich erstmal alleine versuchen zu lösen. Vielen Dank.
-
-
@Swordfish sagte in undefined reference problem:
@Swordfish sagte in undefined reference problem:
Wie sieht denn nun Dein kompletter Code aus? Wie wird Compiler und Linker aufgerufen? Was steht (alles!) im Ausgabefenster von Code::Blocks?
?
@mmmmmmmm sagte in undefined reference problem:
OK, dieser vector spiegelt das Board bei einem Pokerspiel wieder. Auf diesen vector soll innerhalb der gesamten Klasse zugegriffen werden können. Ich hoffe das beantwortet die Frage.
Ich habe noch keine Partie Poker gespielt bei der bei Spielbeginn eine
-1
auf dem Tisch rumlag.Ok, das ist halt mein Status für ein leeres Board. Ich komme von Java und da kann mein Array nicht leer sein. Ich vermute in C++ geht das mit einem Pointer auf einen vector.
-
@mmmmmmmm sagte in undefined reference problem:
Ok, das ist halt mein Status für ein leeres Board.
@mmmmmmmm sagte in undefined reference problem:
Ich komme von Java und da kann mein Array nicht leer sein.
Ein
std::vector
ist ja auch kein Array. Ein Array kann in C++ auch nicht "leer" sein.@mmmmmmmm sagte in undefined reference problem:
Ich komme von Java und da kann mein Array nicht leer sein. Ich vermute in C++ geht das mit einem Pointer auf einen vector.
Hör auf mit Pointern. Deshalb sollst Du ja den kompletten Code zeigen, weil Du sicher noch anderen Unfug gebaut hast. Man lernt aus seinen Fehlern. Nur wenn man die Fehler selbst nicht erkennt ist auch die Chance vertan etwas zu lernen.
-
Ok, aktueller Code:
pokerface.cpp
#include <pokermind.h> #include <iostream> int main() { pokermind poa; poa.setboardadd(1); }
pokermind.cpp
#include <iostream> #include <vector> class pokermind { std::vector<char> vucboard = {1, -1}; pokermind() { } char pokermind::boardcheck(char card) { for (unsigned char uca = 0; uca < vucboard.size(); uca++) { if (vucboard[uca] == card) { return uca; } } return -1; } void pokermind::setboardadd(char card) { if (card != -1) { if (vucboard[0] == -1) { vucboard[0] = card; } else if ((boardcheck(card) == -1) & (vucboard.size() < 5)) { vucboard.push_back(card); } } } void pokermind::setboardremove(char card) { if (card != -1) { int uca = boardcheck(card); if (uca != -1) { if (vucboard[0] == -1) { vucboard[0] == card; } else { vucboard.erase(vucboard.begin() + uca - 1); } } } } };
pokermind.h:
#ifndef POKERMIND_H_INCLUDED #define POKERMIND_H_INCLUDED #include <vector> class pokermind { public: pokermind(); void setboardadd(char card); // fügt, falls möglich, dem board card zu. void setboardremove(char card); // entfernt, falls möglich, card vom board private: std::vector<char> vucboard; char boardcheck(char card); // checked ob card bereits im board vorhanden ist. gibt -1 oder den index zurück. }; #endif // POKERMIND_H_INCLUDED
Meine aktuelle Fehlermeldung:
||=== Build: Debug in poker (compiler: GNU GCC Compiler) ===|
C:\c++\poker\pokermind.cpp|13|error: extra qualification 'pokermind::' on member 'boardcheck' [-fpermissive]|
C:\c++\poker\pokermind.cpp|26|error: extra qualification 'pokermind::' on member 'setboardadd' [-fpermissive]|
C:\c++\poker\pokermind.cpp|41|error: extra qualification 'pokermind::' on member 'setboardremove' [-fpermissive]|
C:\c++\poker\pokermind.cpp||In constructor 'pokermind::pokermind()':|
C:\c++\poker\pokermind.cpp|10|error: 'initialize' was not declared in this scope|
C:\c++\poker\pokermind.cpp||In member function 'void pokermind::setboardremove(char)':|
C:\c++\poker\pokermind.cpp|51|warning: value computed is not used [-Wunused-value]|
||=== Build failed: 4 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|Eine schnelle Googlesuche sagt mir das ich die pokermind:: wieder entfernen soll. Also auf gut Deutsch ich habe keine Ahnung was ich tun soll.
-
Mit
class pokermind { // ... };
definierst Du die Klasse zweimal, einmal in
pokermind.h
und einmal inpokermind.cpp
. Man inkludiert die Definition der Klasse (bei Dir inpokermind.h
) in der Implementierung (bei Dirpokermind.cpp
). Schau Dir noch mal mein Beispiel weiter oben genau an.@mmmmmmmm sagte in undefined reference problem:
char pokermind::boardcheck(char card) { for (unsigned char uca = 0; uca < vucboard.size(); uca++) { if (vucboard[uca] == card) { return uca; } } return -1; }
Das Ding soll nichts anderes tun als eine Karte finden? std::find()
@mmmmmmmm sagte in undefined reference problem:
void pokermind::setboardadd(char card) { if (card != -1) { if (vucboard[0] == -1) { vucboard[0] = card; } else if ((boardcheck(card) == -1) & (vucboard.size() < 5)) { vucboard.push_back(card); } } }
Wie schon angedeutet.
vucboard
nicht initialisieren undbool pokermind::setboardadd(char card) { if (card == -1 || vucboard.size() == 5) return false; vucboard.push_back(card); return true; }
@mmmmmmmm sagte in undefined reference problem:
void pokermind::setboardremove(char card) { if (card != -1) { int uca = boardcheck(card); if (uca != -1) { if (vucboard[0] == -1) { vucboard[0] == card; } else { vucboard.erase(vucboard.begin() + uca - 1); } } } }
~>
void pokermind::setboardremove(char card) { if (card == -1) return; // early-exit. Nicht alles andere nochmal in Klammern zwingen. if (vucboard.size()) vucboard.erase(std::remove(vucboard.begin(), vucboard.end(), card), vucboard.end()); else vucboard.push_back(card); }
Soll nur das erste gefundene Element getilgt werden:
void pokermind::setboardremove(char card) { if (card == -1) return; if (vucboard.size()) vucboard.erase(std::find(vucboard.begin(), vucboard.end(), card)); else vucboard.push_back(card); }
-
Dieser Beitrag wurde gelöscht!
-
Vielen Dank (nochmals) für deine Hilfe. Die doppelte Klassendefinition war das Problem. Inzwischen läuft mein Programm. Es terminiert aber jedesmal wenn ich auf meinen vector zugreife. Ich lese mir erstmal durch was du zuletzt geschrieben hast.
-
Was hast Du denn mit
@mmmmmmmm sagte in undefined reference problem:
std::vector<char> vucboard = {1, -1};
aus
pokermind.cpp
gemacht? Steht das jetzt wo anders, diese Initialisierung?
-
#include <iostream> #include <pokermind.h> #include <vector> std::vector<char> vucboard = {1, -1}; pokermind::pokermind() { } char pokermind::boardcheck(char card) { for (unsigned char uca = 0; uca < vucboard.size(); uca++) { if (vucboard[uca] == card) { return uca; } } return -1; } void pokermind::setboardadd(char card) { if (card != -1) { std::cout << vucboard[0]; if (vucboard[0] == -1) { vucboard[0] = card; } else if ((boardcheck(card) == -1) & (vucboard.size() < 5)) { vucboard.push_back(card); } } } void pokermind::setboardremove(char card) { if (card != -1) { int uca = boardcheck(card); if (uca != -1) { if (vucboard[0] == -1) { vucboard[0] == card; } else { vucboard.erase(vucboard.begin() + uca - 1); } } } }
Ich hatte einfach die Klassendefinition gelöscht und dafür die Header Datei included. Wieso meine vector Initialisierung nicht akzeptiert wird ist mir auch nicht klar.