undefined reference problem



  • Hi, ich bin totaler C++ Anfänger und versuche gerade ein erstes Programm zum laufen zu bringen. Der Fehler ist:
    undefined reference to 'pokermind::pokermind()'
    Ich benutze Code::Blocks
    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};
    
      pokermind()
      {
      }
    //...
    }
    

    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;
    
        unsigned char boardcheck(char card); // checked ob card bereits im board vorhanden ist. gibt -1 oder den index zurück.
    };
    
    #endif // POKERMIND_H_INCLUDED
    

    Vielen Dank schon mal im Vorraus für die Hilfe



  • Schreibe bitte in eine Zeile vor Deinem Code ``` und in eine Zeile nach Deinem Code ```. Alternativ markiere Deinen Code und klicke auf das </> über dem Bearbeitungsfenster.

    pokermind.h:

    #ifndef POKERMIND_H_INCLUDED
    #define POKERMIND_H_INCLUDED
    
    #include <vector>
    
    class pokermind
    {
    public:
        pokermind();  // aber warum einen leeren Konstruktor überhaupt hinschreiben!?
        void setboardadd(char card);
        void setboardremove(char card);
    private:
        std::vector<char> vucboard = { -1 };  // ist mir auch irgendwie unklar, wozu das soll
        unsigned char boardcheck(char card);
    };
    
    #endif /* POKERMIND_H_INCLUDED */
    

    pokermind.cpp:

    #include <vector>
    
    #include "pokermind.h"
    
    pokermind::pokermind()
    {
    }
    
    void pokermind::setboardadd(char card)
    {
        // ...
    }
    
    void pokermind::setboardremove(char card)
    {
        // ...
    }
    
    unsigned char pokermind::boardcheck(char card)
    {
        // ...
    }
    

    ps: "Vorraus" schreibt man mit stummem 'h'.



  • Wie compilierst/linkst du das Programm?

    Wie lautet die vollständige Fehlermeldung?



  • @mmmmmmmm sagte in undefined reference problem:

    unsigned char boardcheck(char card); // checked ob card bereits im board vorhanden ist. gibt -1 oder den index zurück.
    

    "unsigned char" ist eine vorzeichenlose ganzzahlige Zahl. Daher wird die Funktion in keinem Fall "-1" zurück geben.



  • 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 function main':| C:\c++\poker\pokerface.cpp|6|undefined reference topokermind::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. 🤔



  • @Swordfish

    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:

    Wie sieht denn nun Dein kompletter Code aus?

    ?



  • @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.

    std::vector::size()

    @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 in pokermind.cpp. Man inkludiert die Definition der Klasse (bei Dir in pokermind.h) in der Implementierung (bei Dir pokermind.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 und

    bool 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);
    }
    

Log in to reply