Inhaltlicher Fehler - Vector wird angegelichen



  • HallO! Ich mal wieder! So, wenn ich bei meinem "Vorratsschrank" ein Produkt eingebe, klappt alles super.

    Bsp.:
    Name: 1
    MHD: 1
    Anzahl: 1

    Ok, gebe ich danach nun in einem zweiten durchlauf(!) noch eins ein

    zb
    name 2
    mhd 2
    anzahl 2

    werden danach (gewollt) alle bisherigen produkte ausgegeben. Doch das erste Produkt ist nun ein Klon des zweiten!

    Am besten einfach ausprobieren 😃

    Vielen Dank

    Code:

    #include <iostream>
    #include <conio.h>
    #include <vector>
    #include <Windows.h>
    #include <string>
    
    using namespace std;
    //GLOBALE VARIABELN //
    int aktion_in;
    int zero = 0;
    
    string
    					name,
    					mhd;
    int anzahl;
    //VECTOREN//
    
    	vector<string> _name(zero);
    	vector<string> _mhd(zero);
    	vector<int> _anzahl(zero);
    
    void neu()
    {
    
    				cout<<"Anzahl einzugebener Produkte eingeben!"<<endl;
    				cin>>anzahl;
    				for(int i = 0; i<anzahl; i++)
    					{
    						string _name_,
    								_mhd_;
    							int _anzahl_;
    						cout<<"Name des Produktes eingeben!\n"<<endl;
    						cin>>_name_;
    						_name.push_back(_name_);
    						_name[i] = _name_;
    						cout<<"Mindest-MHD des Produktes eingeben!\n"<<endl;
    						cin>>_mhd_;
    						_mhd.push_back(_mhd_);
    						_mhd[i] = _mhd_;
    						cout<<"Anzahl an Produkten dieser Sorte eingeben!\n"<<endl;
    						cin>>_anzahl_;
    						_anzahl.push_back(_anzahl_);
    						_anzahl[i] = _anzahl_;
    					}
    
    }
    
    void anzahl_neu()
    {
    	int nummer,
    					anzahl_neu;
    					cout<<"Nummer des Produktes angeben, von welchem die Stückzahl geändert werden soll!"<<endl;
    					cin>>nummer;
    					cout<<"Neue Stückzahl eingeben!"<<endl;
    					cin>>anzahl_neu;
    					_anzahl[nummer-1] = anzahl_neu;
    					cout<<"\nProduktname:           "<<_name[nummer-1];
    					cout<<"\nAnzahl:              "<<_anzahl[nummer-1];
    }
    
    void ausgabe()
    {
    	for(int i = 0; i<_name.size(); i++)
    				{
    					cout<<"["<<i+1<<"]"<<endl;
    					cout<<"\nProduktname:           "<<_name[i];
    					cout<<"\nMHD:                 "<<_mhd[i];
    					cout<<"\nAnzahl:              "<<_anzahl[i];
    					cout<<"\n. . . . . . . . . . . . . \n\n"<<endl;
    				}
    }
    
    void fehler()
    {
    	cout<<"FEHLER! Keine gültige Eingabe!"<<endl;
    	getch();
    }
    
    int main ()
    {
    	do
    	{
    	cout<<"Hallo! Bitte geben sie ihre gewünschte Aktion ein! \n [1] - Produkt hinzufügen \n [2] - Stueckzahlen aendern"<<endl;
    	cin>>aktion_in;
    		if(aktion_in == 1 && aktion_in)
    		{
    			neu();
    		}
    		else if(aktion_in == 2)
    		{
    			anzahl_neu();
    		}
    		else if(aktion_in != 1 && aktion_in != 2)
    		{
    			fehler();
    			main();
    		}
    
    	ausgabe();
    	getch();
    	}while(1);
    }
    


  • So Fehler gefunden!

    Der überschreibt immer ab 0 alles und hängt es neu hintendran! Bei 3 neuen elementen werden die ersten 3 überschrieben und trotzdem nochmal neu hintendran gehangen! Aber wie löse ich das Problem nun?



  • cout<<"Name des Produktes eingeben!\n"<<endl;
                            cin>>_name_;
                            _name.push_back(_name_);
                            _name[i] = _name_;
    

    Für was ist denn die 4. Zeile gut?

    PS: gewöhn dir das mit den Unterstrichen gleich mal ab. Das wird dir in Zukunft ne Menge Mühe beim Codelesen ersparen.



  • ja, bin dabei es mir abzugewöhnen 😉

    Diese Zeile setzt den vector string _name[i] auf den String der Eingabe _name_! Glaub ich könnte mir den schritt auch sparen...^^ War nur zu faul ihn wieder rauszustreichen als ich es bemerkt hatte... Morgen werd ich aber wohl wieder ein wenig Zeit finden Flüchtigkeiten zu beheben.

    Zu meinem Prob: Wie sag ich dem Vector, dass er immer am letzten beschriebenem Element anfangen soll zu schreiben?!

    Grüße
    🙂



  • 🤡 heute ist aber nicht der 1. April, oder?

    der Funktionsaufruf "push_back" hängt dein neues Element ja schon an das Ende des Vectors an.



  • 9A91 schrieb:

    Zu meinem Prob: Wie sag ich dem Vector, dass er immer am letzten beschriebenem Element anfangen soll zu schreiben?!

    Grüße
    🙂

    Vielleicht solltest du nen Kaffee trinken, dann den Post von BasicMan01 noch mal lesen und dann gründlich darüber nachdenken.



  • diese zeilen sind bestimmt falsch:

    _name.push_back(_name_);
    _name[i] = _name_;
    

    nur glücklicherweise kommt aus dem Kontext das Richtige Ergebnis herraus. Ich verstehe dein Problem nicht, bei mir kommt das richtige herraus. Über den Code... möchte ich nicht sprechen 😞



  • Ne,

    wenn du ein produkt hinzufügst (nur 1) und wenn das Programm wieder mit der Abfrage ( 1 oder 2) aufwartet, noch eins eingibst, wird das erste überschrieben! Also sind 1 und 2 bei der ausghabe immer gleich!



  • Klar wird das überschrieben weil wie ich sagte dort der Fehler ist! Du addressierst den Vector als Array immer von 0 -> Anzahl als überschreibst du immer die ersten mit dem [i]-Aufruf und hängst zusätzlich mit dem push_back einen dran...

    Edit: Ich hatte leider nur einen Durchlauf gemacht, deshalb meinte ich kommt das richtige aus dem Kontext raus... bei mehreren stimmts natürlich nicht.

    Einfache Lösung: Die [i]-Adressierung löschen.



  • Habs. Der Fehler lag in genau der reklamierten Zeile!

    Genau das ergab den fehler des überschreibens!

    ja, der Code ist schlecht, aber ich bine in Anfänger. Und eure Codes waren damals auch nicht besser 😉

    Wenn einer vieeel Zeit hat, würds mich freuen wenn mal jemand meine stilistischen und inhaltlichen Fehler aufzeigen würde.

    (Ungarische Notation ist mit bekannt)



  • Ungarische Notation benutzt niemand mehr.



  • Warum eigebtlich nicht? Ist doch eigentlich ganz praktisch.... Wegen der schlechten Möglichkeit zum überfliegen, oder wie?



  • Weil es idr. dadurch unleserlicher wird, aber es ist halt Geschmackssache und derzeit nichtmehr in der Mode. Besser ist es aussagekräftige Namen zu verwenden.



  • Stimmt.

    habe ich noch andere riesige "Fehler" gemacht? Will ja voranschreiten 😉



  • Naja du könntest anfangen die Rück- und Übergabewerte der Funktionen zu verwenden. Außerdem kannst du hier einfach mehrere deiner globalen Variablen streichen und innerhalb der Funktionen schreiben.



  • So hab erstmal die Ungarischen Notationen ruasgeworfen und unnötige Variabeln gelöscht...

    Pug, Rückgabewerte... Das Thema mochte ich noch nie... Jürgen wolf ( ICH WEIß!!! :D) hat das ziemlich dumm erklärt und seit dem hege ich einen Groll gegen dieses Kapitel. Wo (wo) hätte ich es den und eventuell auch wie verwenden können?!



  • Hast du schon klassen gehabt? dann könntest du aus deinen 3 vectoren einen machen und diesen über Rückgabewerte zwischen main und Funktionen übergeben (zur Übung).



  • Ja, klassen hatte ich schon, hab aber ab und zu noch ein paar gedanken (Wie dynamische Objekte mit Vectoren anlegen etc)

    Wie meinstn das?

    Also ich nehme nur einen Vector, und... und... Hm, ich glaub ich verstehe deine Idee im Grundgedanken aber darf morgen in der Schule ein Referat über die Biomembran halten und schleif noch ein wenig an meiner PPT... Also ich gucks mir morgen mal genau an... Find ich aber nett einem hier so gut geholfen wird 🙂



  • Dann schau dir das mal an:

    #include <iostream> 
    #include <vector>
    #include <string>
    
    using namespace std; 
    
    class A
    {
    private:
    	int a;
    	string b;
    	double c;
    
    public:
    	A(int aa, string bb, double cc): a(aa), b(bb), c(cc){}
    
        void show()
    	{
    		cout << "a: " << a << endl
    			 << "b: " << b.c_str() << endl
    			 << "c: " << c << endl;
    	}
    };
    
    int main() 
    {
    	vector<A> objekte;
    
    	A obj(1,"string",2);
    	objekte.push_back(obj);
    
    	objekte[0].show();
    
    	system("pause");
    	return 0;
    }
    


  • HighLigerBiMBam schrieb:

    void show()
    {
    cout << "a: " << a << endl
    << "b: " << b.c_str() << endl
    << "c: " << c << endl;
    }[/cpp]

    Dass du darauf verzichtest, den operator<< zu überladen kann ich bei dem zu Helfenden verstehen. Aber warum du b.c_str() aufrufen musst verstehe ich nicht ganz.

    Und dass du anstatt

    A(int aa, string bb, double cc): a(aa), b(bb), c(cc){}
    
    A(int a, string b, double c): a(a), b(b), c(c){}
    

    schreibst, kann ich mir didaktisch nicht erklären.

    Übrigens muss man das "private:" am Anfang einer Klasse nicht schreiben, aber eigentlich schreibt man die Member in der Reihenfolge public-protected-private.


Anmelden zum Antworten