Fehlermeldung wegen Vektor



  • Hallo, ich hab mich ein wenig mit Vektoren probiert um in meinem Programm zu verhindern das zweimal dasselbe Wort gewählt wird. Allerdings zeigt er mir nun eine Fehlermeldung wo ich nicht genau weiß wie ich diese beheben kann.

    E0289 Keine Instanz des Konstruktors ""std::vector<_Ty, _Alloc>::vector [mit _Ty=char, _Alloc=std::allocator<char>]"" stimmt mit der Argumentliste überein.

    C2440 "Initialisierung": "initializer list" kann nicht in "std::vector<char,std::allocator<char>>" konvertiert werden

    Hier wäre jetzt einmal der Code Ausschnitt wo auch der Vektor angewendet wird.

    case ('1'): {	//Tiere-Spielblatt
    
    			vector<char> vTiere = { "Hase", "Fuchs", "L\224we", "Hamster", "Ente", "Lamm", "Hecht", "Zander", "Katze", "Hund", "Schwein", "Huhn", "Maus", "Zebra", "Nilpferd", "Robbe", "Ziege", "Kuh",
    					"Dachs", "Wildschwein", "Reh", "Wolf", "K\201ken", "Taube", "Amsel", "Drossel", "Fink", "Star", "Eule", "Hahn", "Goldfisch", "Koi", "Affe", "Gorilla", "Panda", "Braunb\204r",
    					"Eisb\204r", "Schaf", "Koala", "Giraffe", "Elefant", "Schmetterling", "Marienk\204fer", "Biene", "Wespe", "Hummel", "Hornisse", "Kaulquappe", "Frosch", "Hai", "Rochen", "Faultier",
    					"Jaguar", "Gazelle", "Falke", "Delfin", "Tiger", "Puma", "Leopard", "Schnecke", "Schlange", "Eichh\224rnchen", "Eidechse", "Gecko", "Krabbe", "Tintenfisch", "Wal", "Blattlaus",
    					"Floh", "Zecke", "Wanze", "Spinne", "Nashorn", "Schildkr\224te", "Pinguin" };
    
    			for (i = 0; i < 5; i++) {
    				for (j = 0; j < 5; j++) {
    					zahl = (rand() % 75);
    					cout << setw(13) << vTiere[zahl] << " | " << fixed;
    
    					swap(vTiere[zahl], vTiere.back());
    					vTiere.pop_back();
    				}
    
    				cout << "------------------------------------------------------------------------------|\n";
    			}
    			cout << "\n\n";
    			getchar();
    		} break;
    


  • Ein std::vector<char> ist eine Liste für Einträge mit je einem einzelnen Zeichen. Du möchtest aber Zeichenketten (engl. String), d. h. mehrere Zeichen, pro Eintrag anlegen. Das kannst Du z. B. so erreichen:

    #include <vector>
    #include <string>
    
    int main()
    {
      std::vector<std::string> tiere = { "Katz", "Maus" };
    }
    


  • Danke für die schnelle Antwort, ich habe es jetzt auf string umgeändert, wenn ich dann aber das Programm ausführe kommt diese Meldung und das Programm hängt sich komplett auf und lässt sich von allein nicht mehr schließen.

    http://www.bilder-upload.eu/thumb/420fb7-1524812571.png



  • Dann greifst Du wohl mit vTiere[zahl] auf ein nicht vorhandenes Element zu. zahl muss zwischen 0 und vTiere.size() - 1 liegen (- 1 beachten!) - alles andere ist undefiniert.



  • Dein eigentlicher "Fehler" ist, dass du 75 fest im Programm stehen hast. Solche "magischen Zahlen" rufen eigentlich immer danach, dass bei der kleinsten Änderung etwas kaputt geht. Verwende also (außer vielleicht 0, 1, 2) so wenig wie möglich feste Zahlen im Programm, sondern nimm stattdessen entweder benannte Konstanten oder ermittle den Wert vor Ort.

    Mittels pop_back löscht du in jedem Schleifendurchgang ein Element, deine 75 ist ab dann also nicht mehr richtig (setze stattdessen vTiere.size() ein)



  • Dankeschön, das ergibt natürlich einen Sinn jetzt.

    Ich habe meine 75 jetzt ausgetauscht mit dem vTiere.size() und nun funktioniert alles einwandfrei.


Log in to reply