Array als Parameter übergeben



  • Ich wollte mal versuchen ob ich es hinbekomme ein Tic Tac Toe Spiel zu programmieren (für die Konsole).
    Ich habe einen Fehler bei der übergabe des Arrays:

    #include <iostream>
    
    using namespace std;
    
    void spielfeld(char);
    
    int main(){
        char feld[10] = {'0','1','2','3','4','5','6','7','8','9'};
    
        spielfeld(feld[10]);
    
        return 0;
    }
    
    void spielfeld(char feld[10]){
        system("cls");
        std::cout << "Tic Tac Toe";
    
        cout << "     |     |     " << endl;
    	cout << "  " << feld[1] << "  |  " << feld[2] << "  |  " << feld[3] << endl;
    	cout << "_____|_____|_____" << endl;
    	cout << "     |     |     " << endl;
    	cout << "  " << feld[4] << "  |  " << feld[5] << "  |  " << feld[6] << endl;
    	cout << "_____|_____|_____" << endl;
    	cout << "     |     |     " << endl;
    	cout << "  " << feld[7] << "  |  " << feld[8] << "  |  " << feld[9] << endl;
        cout << "     |     |     " << endl << endl;
    
    }
    

    Fehlermeldung: undefined reference to spielfeld(char)

    Kann mir wer weiterhelfen?
    Gruß



  • In deinem Code hat es zwei Probleme.

    Die Signaturen des Prototypen und der Funktion spielfeld stimmen nicht überein. Bei ersterem soll ein char übergeben werden, bei letzterem ein char Array.
    2.
    Beim Aufruf

    spielfeld(feld[10]);
    

    übergibst du feld[10] vom typ char, die Funktion erwartet aber ein char-Array. Ausserdem ist der Zugriff feld[10] undefiniertest Verhalten, da das Array feld nur 10 Elemente hat (d.h. nur die Indizes 0,1,..,9 sind gültig).

    So sollte es klappen:

    void spielfeld(char[]);
    
    int main(){
        char feld[10] = {'0','1','2','3','4','5','6','7','8','9'};
        spielfeld(feld);
    
        return 0;
    }
    
    void spielfeld(char feld[]){
        // ...
    }
    

    In C++ sollte man allerdings im allgemeinen rohe Arrays meiden und std::vector verwenden.



  • Danke für die schnelle Antwort!
    Ja ich habe das auch in meinem Buch gelesen mit dem Vector.
    Nur ich vergesse den immer da mein Lehrer in diesem Fach es immer mit dem Array macht 😕
    Dann werde ich wohl den Vector nun einbauen (versuch gescheitert) 🙂

    Ich dachte den baut man genause ein wie den Array...
    ist aber glaube ich nicht so oder 😕 😕

    #include <iostream>
    #include <vector>
    using namespace std;
    
    void spielfeld(vector<char> ());
    
    int main(){
        vector<char> feld = {'0','1','2','3','4','5','6','7','8','9'};
    
        spielfeld(feld(10));
    
        return 0;
    }
    
    void spielfeld(vector<char> feld(10){
        system("cls");
        std::cout << "Tic Tac Toe";
    
        cout << "     |     |     " << endl;
    	cout << "  " << feld[1] << "  |  " << feld[2] << "  |  " << feld[3] << endl;
    	cout << "_____|_____|_____" << endl;
    	cout << "     |     |     " << endl;
    	cout << "  " << feld[4] << "  |  " << feld[5] << "  |  " << feld[6] << endl;
    	cout << "_____|_____|_____" << endl;
    	cout << "     |     |     " << endl;
    	cout << "  " << feld[7] << "  |  " << feld[8] << "  |  " << feld[9] << endl;
        cout << "     |     |     " << endl << endl;
    
    }
    

    Fehler: Line10 keine Übereinstimmung für Aufruf von (std::vector<char>) (int)
    Line 17 expected , or ... before ( token

    Ich hoffe ich stelle mich nicht allzu blöd an 😃



  • Lies in deinem Buch (welches Buch hast du?) unbedingt noch einmal das Kapitel über Funktionen und std::vector nach. Du scheinst noch nicht ganz verstanden zu haben wie das funktioniert.

    Ich geb dir trotzem einmal die Lösung:

    void spielfeld(vector<char> &);
    
    int main(){
        vector<char> feld = {'0','1','2','3','4','5','6','7','8','9'};
        spielfeld(feld); 
        return 0;
    }
    
    void spielfeld(vector<char> &feld){
    	// ...
    }
    

  • Mod

    In C++ sollte man allerdings im allgemeinen rohe Arrays meiden und std::vector verwenden.

    Quatsch!

    Ändere die Signatur zu
    void spielfeld(char const * ptr)
    Und übergebe einfach "0123456789" an die Funktion. Das ist kürzer und schneller.



  • icarus2 schrieb:

    Lies in deinem Buch (welches Buch hast du?) unbedingt noch einmal das Kapitel über Funktionen und std::vector nach. Du scheinst noch nicht ganz verstanden zu haben wie das funktioniert.

    Danke für die Antwort klappt auch. Ich habe das Buch der C++ Programmierer von Ulrich Breymann. Und ja ich werde mir das nochmal durchlesen, aber ich bin nun Seite 203 und es wurde noch nicht ein Vector als Parameter übergeben, falls ich es nicht übesehen habe.

    Gruß



  • Arcoth schrieb:

    In C++ sollte man allerdings im allgemeinen rohe Arrays meiden und std::vector verwenden.

    Quatsch!

    Du bist also der Meinung, dass man im Allgemeinen std::vector nicht rohen Arrays vorziehen sollte? 🙄

    Arcoth schrieb:

    Ändere die Signatur zu
    void spielfeld(char const * ptr)
    Und übergebe einfach "0123456789" an die Funktion. Das ist kürzer und schneller.

    Ob es schneller ist bezweifle ich. Vielleicht lassen sich Beispiele konstruieren bei denen ein messbarer Unterschied feststellbar ist aber allgemein wirst du da nichts feststellen können (du kannst dies gerne mit einem Beispielprogramm widerlegen). Zudem ist Performance bei einem Tic Tac Toe Spiel vollkommen egal. Ausserdem nehme ich doch stark an, dass er im Programm den Inhalt des Spielfelds verändern und dann das Spielfeld neu ausgeben möchte. Ein "0123456789" kann man nicht verändern ==> Quatsch!



  • icarus2 schrieb:

    Du bist also der Meinung, dass man im Allgemeinen std::vector nicht rohen Arrays vorziehen sollte? 🙄

    std::array statt std::vector und man könnte es unterschreiben. Stringliterale sind natürlich weiterhin okay.


  • Mod

    icarus2 schrieb:

    Du bist also der Meinung, dass man im Allgemeinen std::vector nicht rohen Arrays vorziehen sollte? 🙄

    Richtig. Solange man keinen vector braucht, nimmt man auch keinen. Hier im Forum hat man IMO jedem eingetrichtert, dass es eine Todsünde ist, dem heiligen vector echte Arrays vorzuziehen, und das ist nicht richtig.

    Ob es schneller ist bezweifle ich.

    Vielleicht nicht in diesem Beispiel, da könnten sie tatsächlich Kopf an Kopf liegen. Bedenke aber, das vector en auf dem Heap arbeiten, Aber Arrays auf dem Stack. Das heißt, i. A. kann vector nur langsamer sein als ein Array. Auch wenn es das oft nicht signifikant ist.

    Arcoth schrieb:

    Ausserdem nehme ich doch stark an, dass er im Programm den Inhalt des Spielfelds verändern und dann das Spielfeld neu ausgeben möchte.

    Ich hab' leider nicht den Kontext berücksichtigt...

    In dem Fall deklariert er eben das Feld wie er es braucht.
    Aber die Funktion nimmt natürlich weiterhin eine konstanten Verweis (anders als in deinem Code), schließlich muss er darin nichts verändern.

    Es bleibt dabei, hier braucht man keinen vector .

    Edit:

    std::array statt std::vector und man könnte es unterschreiben.

    Natürlich. Wenn man C++11 hat, dann deklariert er es als eindimensionales std::array und arbeitet damit. 👍



  • So habe das Spiel jedzt dem Vector fertig. 🙂

    Und nochmal danke für die vielen Antworten


Anmelden zum Antworten