cout gibt das char array nich aus!



  • Hallo liebe Community!
    Zuerst möchte ich sagen, dass das mein erster Beitrag ist, also nochmal ein herzliches Hallo!
    So nun zu meinem Problem:
    Zu einem PC-Spiel namens W(orld) o(f) T(anks) haben ein anderes WoT-Forenmitglied und ich ein Programm zur Berechnung von XP geschrieben, soweit auch kein Problem, wenn auch etwas unübersichtlich! In der Grundform funktionierte auch alles einwandfrei, bis ich denn Ausgabetext formatieren wollte, jetzt gibt das Programm an einer bestimmten Stelle den Text nicht aus! Meine Frage an auch: Warum ist das so und wie kann ich den Fehler (in Zeile 111-117) beheben?
    Danke schonmal im Voraus
    Mux

    #include <iostream>
    #include <string.h>
    #include <iomanip>
    
    using namespace std;
    
    const int LEN = 30;
    const int anzahl = 14;
    
    int main()
    {
    
    char *DeutscheJP[9] = {"PanzerJagerI\n","MarderII\n",
                          "Hetzer\n","StugIII\n",
                          "JgdPzIV\n","JagdPanther\n",
                          "Ferdindand\n","JagdTiger\n"};
    char *DeutscheP [15] = {"Leichttraktor\n","PzKpfwII\n",
                          "PzKpfwIIIAusfA\n",
                          "PanzerIII\n",                     
                          "PanzerIV\n","3601H\n",
                          "TigerI\n","TigerII\n",
                          "4502AusfB\n","Maus\n",
                          "PanzerIII/IV\n","3001P\n",
                          "3002DB\n","Panther\n",
                          };
    char *DeutscheA [5] =  {"Bison\n","SturmpanzerII\n",
                           "Grille\n","Hummel\n"
                          };
    class String {
      public:
      char *s;                 // Zeichenkette
      int Xp;
      String(void)  {s=new char [20];};
    }; 
    
            String panzer[LEN];
            String zielpanzer;
            int start,ziel;
            panzer[0].s="Leichttraktor\0"; panzer[0].Xp=0;
            panzer[1].s="PzKpfwII\0"; panzer[1].Xp=175;
            panzer[2].s="PzKpfwIIIAusfA\0"; panzer[2].Xp=1135;
            panzer[2].Xp=panzer[2].Xp+panzer[0].Xp+panzer[1].Xp;
            panzer[3].s="PanzerIII\0"; panzer[3].Xp=4235;
            panzer[3].Xp=panzer[3].Xp+panzer[2].Xp+panzer[0].Xp;
            panzer[4].s="PanzerIV\0"; panzer[4].Xp=15455;
            panzer[4].Xp=panzer[4].Xp+panzer[3].Xp+panzer[0].Xp;
            panzer[5].s="3601H\0"; panzer[5].Xp=29955;
            panzer[5].Xp=panzer[5].Xp+panzer[4].Xp+panzer[0].Xp;
            panzer[6].s="TigerI\0"; panzer[6].Xp=54065;
            panzer[6].Xp=panzer[6].Xp+panzer[5].Xp+panzer[0].Xp;
            panzer[7].s="TigerII\0"; panzer[7].Xp=120495;
            panzer[7].Xp=panzer[7].Xp+panzer[6].Xp+panzer[0].Xp;
            panzer[8].s="4502AusfB\0"; panzer[8].Xp=185750;
            panzer[8].Xp=panzer[8].Xp+panzer[7].Xp+panzer[0].Xp;
            panzer[9].s="Maus\0"; panzer[9].Xp=279870;
            panzer[9].Xp=panzer[9].Xp+panzer[8].Xp+panzer[0].Xp;
            panzer[10].s="PanzerIII/IV\0"; panzer[10].Xp=15455;
            panzer[10].Xp=panzer[10].Xp+panzer[3].Xp+panzer[0].Xp;
            panzer[11].s="3001P\0"; panzer[11].Xp=29635;
            panzer[11].Xp=panzer[11].Xp+panzer[10].Xp+panzer[0].Xp;
            panzer[12].s="3002DB\0"; panzer[12].Xp=41180;
            panzer[12].Xp=panzer[12].Xp+panzer[11].Xp+panzer[0].Xp;
            panzer[13].s="Panther\0"; panzer[13].Xp=99135;
            panzer[13].Xp=panzer[13].Xp+panzer[12].Xp+panzer[0].Xp;
            panzer[14].s="Bison\0"; panzer[14].Xp=155;
            panzer[15].s="SturmpanzerII\0"; panzer[15].Xp=3605;
            panzer[15].Xp=panzer[15].Xp+panzer[14].Xp+panzer[0].Xp;
            panzer[16].s="Grille\0"; panzer[16].Xp=14445;
            panzer[16].Xp=panzer[16].Xp+panzer[15].Xp+panzer[0].Xp;
            panzer[17].s="Hummel\0"; panzer[17].Xp=48190;
            panzer[17].Xp=panzer[17].Xp+panzer[16].Xp+panzer[0].Xp;
            panzer[18].s="PanzerJagerI\0"; panzer[18].Xp=185;
            panzer[19].s="MarderII\0"; panzer[19].Xp=1425;
            panzer[19].Xp=panzer[19].Xp+panzer[18].Xp+panzer[0].Xp;
            panzer[20].s="Hetzer\0"; panzer[20].Xp=5145;
            panzer[20].Xp=panzer[20].Xp+panzer[19].Xp+panzer[0].Xp;
            panzer[21].s="StugIII\0"; panzer[21].Xp=12435;
            panzer[21].Xp=panzer[21].Xp+panzer[20].Xp+panzer[0].Xp;
            panzer[22].s="JgdPzIV\0"; panzer[22].Xp=34785;
            panzer[22].Xp=panzer[22].Xp+panzer[21].Xp+panzer[0].Xp;
            panzer[23].s="JagdPanther\0"; panzer[23].Xp=69240;
            panzer[23].Xp=panzer[23].Xp+panzer[22].Xp+panzer[0].Xp;
            panzer[24].s="Ferdindand\0"; panzer[24].Xp=98630;
            panzer[24].Xp=panzer[24].Xp+panzer[23].Xp+panzer[0].Xp;
            panzer[25].s="JagdTiger\0"; panzer[25].Xp=256040;
            panzer[25].Xp=panzer[25].Xp+panzer[24].Xp+panzer[0].Xp;
    
            cout<<"Willkommen beim XP Calculator made by Stevie04&Panzer_mux!\n\n"; // Des konnt ich mir nich verkneifen ;D
            cout << "Deutsche Panzer:\n" 
                 << "\n***Panzer***" 
                 << endl;
            for (int i=0; i < anzahl; i++){       // Damit alles angezeigt wird
              cout.fill('/');                     // Deklaration für füll zeichen
              cout << setiosflags(ios::right)     // Rechtsbündige-Schrift
                   << setw(15) << DeutscheP  [i]  //Das die Wörter bis 15 Zeichen mit dem Zeichen / aufgefüllt werden 
                   << resetiosflags(ios::right)
                   << flush;
              };
            cout << "\n***Artillerie***" << endl;
    
            for (int i=0; i < 9; i++) {
              cout.fill('/');
              cout << setiosflags(ios::right)
                   << setw(15) << DeutscheA [i]
                   << resetiosflags(ios::right)
                   << flush;
              };
    
            cout <<"\n***JagdPanzer***\n" << endl;  
            for (int i =0; i<14;i++)  {
              cout.fill('/');
              cout << setiosflags(ios::right)
                   << setw(15) << DeutscheJP [i]
                   << resetiosflags(ios::right)
                   << flush;
              };
    
            cout<<"\nBitte geben Sie den Namen Ihres Startpanzers aus der oberen Liste ein:" "\n"<< flush;
            cin>> zielpanzer.s;
    
            for (int i=0;i<LEN;i++)//startpanzer aussuchen
                    if(strncmp(panzer[i].s,zielpanzer.s,20)==0)
                            {start=i; break;}
            cout<<"Bitte geben Sie den Namen Ihres Zielpanzers aus der oberen Liste ein:" "\n";
            cin>> zielpanzer.s;
            for (int i=0;i<LEN;i++)//startpanzer aussuchen
                    if(strncmp(panzer[i].s,zielpanzer.s,20)==0)
                            {ziel=i;break;}
            panzer[3].Xp=panzer[start].Xp-panzer[ziel].Xp;
            cout<< "Ergebnis:" << panzer[3].Xp*(-1) << "XP" "\n";
            cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());
    cin.get(); 
    }
    

    Gemeint is das Char Array: DeutscheJP... probierts doch mal aus 🙂 (WIn 7 müsste probleme machen. wenn ja dann die header StdAfx.h einbinden!)



  • Du solltest darauf achten, dass deine Ausgabeschleifen nicht weiter laufen, als deine Arrays groß sind.

    Allgemein könntest du davon profitieren, wenn du statt Arrays std::vector und statt char-Zeigern std::string verwendest.



  • hu!? Von denen hab ich noch nichts gehört 😞 Bin noch neuling auf dem c++ gebiet!
    könntest du mir bitte noch die gesamte syntax für die funktionen posten? wäre nett!
    Mux



  • Probier mal folgendes:

    #include <iostream>
    #include <string.h>
    #include <iomanip>
    
    using namespace std;
    
    const int LEN = 30;
    const int anzahl = 14;
    
    int main()
    {
    
    char *DeutscheJP[9] = {"PanzerJagerI\n","MarderII\n",
                          "Hetzer\n","StugIII\n",
                          "JgdPzIV\n","JagdPanther\n",
                          "Ferdindand\n","JagdTiger\n"};
    
    char *DeutscheP [15] = {"Leichttraktor\n","PzKpfwII\n",
                          "PzKpfwIIIAusfA\n",
                          "PanzerIII\n",                    
                          "PanzerIV\n","3601H\n",
                          "TigerI\n","TigerII\n",
                          "4502AusfB\n","Maus\n",
                          "PanzerIII/IV\n","3001P\n",
                          "3002DB\n","Panther\n",
                          };
    
    char *DeutscheA [5] =  {"Bison\n","SturmpanzerII\n",
                           "Grille\n","Hummel\n"
                          };
    class String {
      public:
      char *s;                 // Zeichenkette
      int Xp;
      String(void)  {s=new char [20];};
    };
    
            String panzer[LEN];
            String zielpanzer;
            int start,ziel;
            panzer[0].s="Leichttraktor\0"; panzer[0].Xp=0;
            panzer[1].s="PzKpfwII\0"; panzer[1].Xp=175;
            panzer[2].s="PzKpfwIIIAusfA\0"; panzer[2].Xp=1135;
            panzer[2].Xp=panzer[2].Xp+panzer[0].Xp+panzer[1].Xp;
            panzer[3].s="PanzerIII\0"; panzer[3].Xp=4235;
            panzer[3].Xp=panzer[3].Xp+panzer[2].Xp+panzer[0].Xp;
            panzer[4].s="PanzerIV\0"; panzer[4].Xp=15455;
            panzer[4].Xp=panzer[4].Xp+panzer[3].Xp+panzer[0].Xp;
            panzer[5].s="3601H\0"; panzer[5].Xp=29955;
            panzer[5].Xp=panzer[5].Xp+panzer[4].Xp+panzer[0].Xp;
            panzer[6].s="TigerI\0"; panzer[6].Xp=54065;
            panzer[6].Xp=panzer[6].Xp+panzer[5].Xp+panzer[0].Xp;
            panzer[7].s="TigerII\0"; panzer[7].Xp=120495;
            panzer[7].Xp=panzer[7].Xp+panzer[6].Xp+panzer[0].Xp;
            panzer[8].s="4502AusfB\0"; panzer[8].Xp=185750;
            panzer[8].Xp=panzer[8].Xp+panzer[7].Xp+panzer[0].Xp;
            panzer[9].s="Maus\0"; panzer[9].Xp=279870;
            panzer[9].Xp=panzer[9].Xp+panzer[8].Xp+panzer[0].Xp;
            panzer[10].s="PanzerIII/IV\0"; panzer[10].Xp=15455;
            panzer[10].Xp=panzer[10].Xp+panzer[3].Xp+panzer[0].Xp;
            panzer[11].s="3001P\0"; panzer[11].Xp=29635;
            panzer[11].Xp=panzer[11].Xp+panzer[10].Xp+panzer[0].Xp;
            panzer[12].s="3002DB\0"; panzer[12].Xp=41180;
            panzer[12].Xp=panzer[12].Xp+panzer[11].Xp+panzer[0].Xp;
            panzer[13].s="Panther\0"; panzer[13].Xp=99135;
            panzer[13].Xp=panzer[13].Xp+panzer[12].Xp+panzer[0].Xp;
            panzer[14].s="Bison\0"; panzer[14].Xp=155;
            panzer[15].s="SturmpanzerII\0"; panzer[15].Xp=3605;
            panzer[15].Xp=panzer[15].Xp+panzer[14].Xp+panzer[0].Xp;
            panzer[16].s="Grille\0"; panzer[16].Xp=14445;
            panzer[16].Xp=panzer[16].Xp+panzer[15].Xp+panzer[0].Xp;
            panzer[17].s="Hummel\0"; panzer[17].Xp=48190;
            panzer[17].Xp=panzer[17].Xp+panzer[16].Xp+panzer[0].Xp;
            panzer[18].s="PanzerJagerI\0"; panzer[18].Xp=185;
            panzer[19].s="MarderII\0"; panzer[19].Xp=1425;
            panzer[19].Xp=panzer[19].Xp+panzer[18].Xp+panzer[0].Xp;
            panzer[20].s="Hetzer\0"; panzer[20].Xp=5145;
            panzer[20].Xp=panzer[20].Xp+panzer[19].Xp+panzer[0].Xp;
            panzer[21].s="StugIII\0"; panzer[21].Xp=12435;
            panzer[21].Xp=panzer[21].Xp+panzer[20].Xp+panzer[0].Xp;
            panzer[22].s="JgdPzIV\0"; panzer[22].Xp=34785;
            panzer[22].Xp=panzer[22].Xp+panzer[21].Xp+panzer[0].Xp;
            panzer[23].s="JagdPanther\0"; panzer[23].Xp=69240;
            panzer[23].Xp=panzer[23].Xp+panzer[22].Xp+panzer[0].Xp;
            panzer[24].s="Ferdindand\0"; panzer[24].Xp=98630;
            panzer[24].Xp=panzer[24].Xp+panzer[23].Xp+panzer[0].Xp;
            panzer[25].s="JagdTiger\0"; panzer[25].Xp=256040;
            panzer[25].Xp=panzer[25].Xp+panzer[24].Xp+panzer[0].Xp;
    
            cout<<"Willkommen beim XP Calculator made by Stevie04&Panzer_mux!\n\n"; // Des konnt ich mir nich verkneifen ;D
            cout << "Deutsche Panzer:\n"
                 << "\n***Panzer***"
                 << endl;
            for (int i=0; i < anzahl; i++){       // Damit alles angezeigt wird
              cout.fill('/');                     // Deklaration für füll zeichen
              cout << setiosflags(ios::right)     // Rechtsbündige-Schrift
                   << setw(15) << DeutscheP  [i]  //Das die Wörter bis 15 Zeichen mit dem Zeichen / aufgefüllt werden
                   << resetiosflags(ios::right)
                   << flush;
              };
            cout << "\n***Artillerie***" << endl;
    
            for (int i=0; i < 4; i++) {
              cout.fill('/');
              cout << setiosflags(ios::right)
                   << setw(15) << DeutscheA [i]
                   << resetiosflags(ios::right)
                   << flush;
              };
    
            cout <<"\n***JagdPanzer***\n" << endl;  
            for (int i =0; i<8;i++)  {
              cout.fill('/');
              cout << setiosflags(ios::right)
                   << setw(15) << DeutscheJP [i]
                   << resetiosflags(ios::right)
                   << flush;
              };
    
            cout<<"\nBitte geben Sie den Namen Ihres Startpanzers aus der oberen Liste ein:" "\n"<< flush;
            cin>> zielpanzer.s;
    
            for (int i=0;i<LEN;i++)//startpanzer aussuchen
                    if(strncmp(panzer[i].s,zielpanzer.s,20)==0)
                            {start=i; break;}
            cout<<"Bitte geben Sie den Namen Ihres Zielpanzers aus der oberen Liste ein:" "\n";
            cin>> zielpanzer.s;
            for (int i=0;i<LEN;i++)//startpanzer aussuchen
                    if(strncmp(panzer[i].s,zielpanzer.s,20)==0)
                            {ziel=i;break;}
            panzer[3].Xp=panzer[start].Xp-panzer[ziel].Xp;
            cout<< "Ergebnis:" << panzer[3].Xp*(-1) << "XP" "\n";
            cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());
    cin.get();
    }
    

    Ich habe die Laufweite der Schleifen geändert. Du hast wohl über die Größe des Arrays hinaus gelesen.

    Zu deinem Code: Der ist nicht nur unübersichtlich, der ist einfach nur Mist, fehleranfällig und auch fehlerhaft. Speicherreservierung ohne Freigabe...

    Hier mal der Anfang eines anderen Ansatzes:

    #include <vector>
    #include <iostream>
    #include <string>
    
    struct Fahrzeug
    {
    	std::string name;
    	int xp;
    
    	Fahrzeug(std::string n, int x) 
    		: name(n), xp(x)
    	{
    	}
    };
    
    typedef std::vector<Fahrzeug> Fahrzeuge;
    
    void Ausgabe(const Fahrzeuge& vec);
    
    int main()
    {
    	Fahrzeuge DeutschePanzer;
    	Fahrzeuge JagdPanzer;
    	Fahrzeuge Artillerien;
    
    	// Panzer hinzufügen
    	DeutschePanzer.push_back(Fahrzeug("Deutscher Panzer", 10));
    	JagdPanzer.push_back(Fahrzeug("Jagdpanzer", 50));
    	Artillerien.push_back(Fahrzeug("Artillerie", 100));
    
    	// Ausgabe
    	std::cout << "--- Deutsche Panzer ---" << std::endl;
    	Ausgabe(DeutschePanzer);
    
    	std::cout << "\n--- JagdPanzer ---" << std::endl;
    	Ausgabe(JagdPanzer);
    
    	std::cout << "\n--- Artillerien ---" << std::endl;
    	Ausgabe(Artillerien);
    
    	return 0;
    }
    
    void Ausgabe(const Fahrzeuge& vec)
    {
    	for (Fahrzeuge::const_iterator it = vec.begin(); it != vec.end(); ++it)
    	{
    		std::cout << it->name << ", " << it->xp << " XP" << std::endl;
    	}
    }
    


  • haha 😉 der code is nich von mir sondern von stevie04^^ ich bin nur fürs äußerliche und verbesserungen zuständig 🙂 wir sind beide noch neulinge! Aber Danke für eure beiden antworten und es funktioniert jetzt! Danke nochmal
    Mux


  • Mod

    string...vector...

    Prog_mux schrieb:

    hu!? Von denen hab ich noch nichts gehört 😞 Bin noch neuling auf dem c++ gebiet!

    Du hast anscheinend einen Lehrer gefunden, der dir wohl auch erst Einradfahren beibringen würde, bevor er erwähnt, dass es auch Zweiräder mit Stützrädern gibt.



  • ich bin mein lehrer 😉 ich hab erstmal nur ein buch mit grundlagen durchgelesen und bin grad halb mit OOP buch durch


  • Mod

    Prog_mux schrieb:

    ich bin mein lehrer 😉 ich hab erstmal nur ein buch mit grundlagen durchgelesen

    Dann war das vermutlich ein schlechtes Buch. Denn (char-)Arrays sind zwar für C Grundlagen, aber für C++ sind das exotische Randthemen. vector und string sind stattdessen die Grundlagen.



  • grundsätzlich stand das da auch nich drin, kam eher noch aus meinem C-Wissen! Das buch hatte wirklich nur die absoluten grundlagen 🙂 im oop buch wirds noch kommen denk ich!


Anmelden zum Antworten