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.


Log in to reply