Klasse ValueGets: Fehler!
-
Ich verstehs auch nicht so ganz
Hast dir aber Mühe gegeben bei der Beschreibung, das verdient ein 
Sollen "first" und "last" an eine fremde Funktion oder Klasse übergeben werden oder an eine, die in der Klasse ValueGets existiert?
-
Badestrand schrieb:
Ich verstehs auch nicht so ganz
Hast dir aber Mühe gegeben bei der Beschreibung, das verdient ein 
Danke, ich habs nur so gut erklärt, wie möglich

Badestrand schrieb:
Sollen "first" und "last" an eine fremde Funktion oder Klasse übergeben werden oder an eine, die in der Klasse ValueGets existiert?
nein, die Funktion(en) befindet bzw. befinden sich in meiner Klasse, ValueGets

class ValueGets { public: void Mainblabla(std::vector<char> free); int User1(std::vector<char> &free); int User2(std::vector<char> &free); int Steuerung(std::vector<char> &free); // Hier wird geprüft, ob die Eingaben in User1 und User2 so eingegeben wurden, wie vorausgesetzt.(zbsp. wenn hier die Zahl 2 und 4 vorausgesetzt ist und man, 2 und 4 eingibt[in User1() und User2()],dann passiert irgendwas zbsp. free[2] wird dann free[4], in dem Fall also free[first] = free[last];
// Ende von Public und begin von private: private: std::vector<char> free; int first, last; };das gleiche würd ich mit first und last anstellen:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-188047-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.htmlNur betrifft das free leider.
Aso hab noch was vergessen zu sagen.. ich bin der Threadersteller von meinem Link da im Thread, heiß also Thomas
Also beim vorigen hab ich eine Referenz in der Funktion machen müssen, anstatt nen normalen Vektor:
class Test { public: void output_int(const std::vector<int>& Ger); void eingabe(std::vector<int>& Ger); void ausgabe(std::vector<int> Ger); private: int e1, e2; }; void Test::output_int(const std::vector<int>& Ger) { for(int etwas = 0; etwas != Ger.size(); ++etwas) { std::cout << Ger[etwas] << std::endl; } } void Test::eingabe(std::vector<int>& Ger) { std::cin >> e1 >> e2; Ger[e1] = Ger[e2]; } void Test::ausgabe(std::vector<int> Ger) { output(Ger); eingabe(Ger); output(Ger); }Mfg
-
dernichtswissende@Thomas schrieb:
Badestrand schrieb:
Ich verstehs auch nicht so ganz
Hast dir aber Mühe gegeben bei der Beschreibung, das verdient ein 
Danke, ich habs nur so gut erklärt, wie möglich

Randfrage: Und an welcher Stelle passiert nicht das, was du erwartet hast?
class ValueGets { public: void Mainblabla(std::vector<char> free); int User1(std::vector<char> &free); int User2(std::vector<char> &free); int Steuerung(std::vector<char> &free); // Hier wird geprüft, ob die Eingaben in User1 und User2 so eingegeben wurden, wie vorausgesetzt.(zbsp. wenn hier die Zahl 2 und 4 vorausgesetzt ist und man, 2 und 4 eingibt[in User1() und User2()],dann passiert irgendwas zbsp. free[2] wird dann free[4], in dem Fall also free[first] = free[last];
// Ende von Public und begin von private: private: std::vector<char> free; int first, last; };Dir ist klar, daß das Klassenelement 'free' absolut nichts mit dem Parameter zu tun hat, den du zwischen deinen Methoden austauschst?
-
CStoll schrieb:
dernichtswissende@Thomas schrieb:
Badestrand schrieb:
Ich verstehs auch nicht so ganz
Hast dir aber Mühe gegeben bei der Beschreibung, das verdient ein 
Danke, ich habs nur so gut erklärt, wie möglich

Randfrage: Und an welcher Stelle passiert nicht das, was du erwartet hast?
class ValueGets { public: void Mainblabla(std::vector<char> free); int User1(std::vector<char> &free); int User2(std::vector<char> &free); int Steuerung(std::vector<char> &free); // Hier wird geprüft, ob die Eingaben in User1 und User2 so eingegeben wurden, wie vorausgesetzt.(zbsp. wenn hier die Zahl 2 und 4 vorausgesetzt ist und man, 2 und 4 eingibt[in User1() und User2()],dann passiert irgendwas zbsp. free[2] wird dann free[4], in dem Fall also free[first] = free[last];
// Ende von Public und begin von private: private: std::vector<char> free; int first, last; };Dir ist klar, daß das Klassenelement 'free' absolut nichts mit dem Parameter zu tun hat, den du zwischen deinen Methoden austauschst?
in Mainblabla(..) wenn ich eine Funktion aufrufe, die
for(int etwas = 0; etwas != free.size(); ++etwas) { std::cout << free[etwas] << std::endl; }beinhaltet. Sie sollte normalerweise an einer anderen Position sein usw..
Erklärt es mir bitte bzw. helft mir, ich hab einen fehler, den ich nicht finde..Also nochmal:
Das "Gebiet" bzw. "Feld" sieht so aus:
A B C D E F GSo nun wird das in Mainblabla aufgerufen.. also mit free=>(vector<char> free)..
dann wird User1 darum nach zwei Zahlen gefragt. Dann wird noch dazu in User1 die Funktion Steuerung(), aufgerufen. Sie beinhaltet sowas wie zbsp. dass wenn der Benutzer 1 und dann 5 eingibt, dann vom elemtent 1 zum Element 5 im Vektor ein Buchstabe erscheint.
Zbsp. hat der Vektor wie oben, 7 Elemente:A B C D E F G 0 1 2 3 4 5 6dass wenn zbsp. alles andere außer 1 und 5 eingegeben wird, dass eine entsprechende Fehlermeldung mit cout ausgegeben wird.
Wenn zbsp. 1 und 5 eingegeben wurde, sieht das so aus(first = 1, last = 5)A B C D E [b][u]B[/u][/b] G 0 1 2 3 4 5 6Haben Sie mich nun verstanden?

Mit freundlichen Gruessen
Thomas
-
OK, ich glaube, jetzt habe ich verstanden, was die Funktion machen soll - aber was macht sie tatsächlich?
-
Ich habs nicht ganz verstanden

Also es gibt eine Menge an Buchstaben. Es gibt zwei Benutzer, die jeweils zwei Zahlen eingeben müssen/wollen/sollen. Die Menge der Buchstaben soll dann, abhängig von der Eingabe, modifiziert werden. Stimmt das so
Und das Problem dabei ist, dass in Steuerung die Variablen first und last nicht das enthalten, was sie enthalten sollen? Oder wie? Ich verstehe nicht ganz, wo jetzt der Fehler ist, oder welcher Teil des Programmes sich nicht so verhält, wie er soll

Aso, und ich glaube, du brauchst keinen hier zu Siezen

-
CStoll schrieb:
OK, ich glaube, jetzt habe ich verstanden, was die Funktion machen soll - aber was macht sie tatsächlich?
Badestrand schrieb:
Ich habs nicht ganz verstanden

Also es gibt eine Menge an Buchstaben. Es gibt zwei Benutzer, die jeweils zwei Zahlen eingeben müssen/wollen/sollen. Die Menge der Buchstaben soll dann, abhängig von der Eingabe, modifiziert werden. Stimmt das so
Ja, aber nur wenn man bei der Eingabe in User1() und User2() bestimmtest eingibt, dann funktioniert dann auch.
Badestrand schrieb:
Und das Problem dabei ist, dass in Steuerung die Variablen first und last nicht das enthalten, was sie enthalten sollen? Oder wie? Ich verstehe nicht ganz, wo jetzt der Fehler ist, oder welcher Teil des Programmes sich nicht so verhält, wie er soll

Ich glaube,das Problem ist eher,dass die Variablen als lokale Variablen behandelt werden und sich deswegen nichts tut, obwohl ich das in der Funktion Steuerung() mit der If Abfrage und mittendrinn(in der IfAnweisung) noch das
free[first] = free[last]; reingeschrieben hab
Es ist glaub ich einfach nur,weil ich keine Referenzen oder sonstiges gemacht hab, aber obwohl ich es schon versucht hab,funktionierts immer noch nicht.
Also d.h dass sich vonA B C D E F G 0 1 2 3 4 5 6auf
A B C D E B G 0 1 2 3 4 5 6nicht ändert, weil ich keine Referenzen oder Zeiger oder was auch immer an bestimmte Funktionen nicht übergeben hab..
Mfg
-
class ValueGets { public: void Mainblabla(std::vector<char> free); int User1(std::vector<char> &free); int User2(std::vector<char> &free); private: int first, last; }; void ValueGets::Mainblabla(std::vector<char> free) { while(std::cin) { ZeigListe(free); User1(free); ZeigListe(free); User2(free); } } int ValueGets::User1(std::vector<char> &free) { std::cout << "Spieler 1 first: "; std::cin >> first; std::cout << std::endl << "Spieler 1 last: "; std::cin >> last; std::cout << std::endl; Steuerung(free); return 1; // Willst du hier nix mit dem Ergebnis von Steuerung anstellen? // Also z.B. // return Steuerung( free ); // ? } int ValueGets::User2(std::vector<char> &free) { std::cout << "Spieler 2 first: "; std::cin >> first; std::cout << std::endl << "Spieler 2 last: "; std::cin >> last; std::cout << std::endl; Steuerung(free); return 1; // und hier auch.. :) } int ValueGets::Steuerung(std::vector<char> &free) { std::cout << "ValueGets::Steuerung: first=" << first << "; last=" << last << endl; if(/*...*/) { if(last == first - 15) { free[last - 4] = free[first - 15]; free[first] = 'G'; return free[last - 4]; } else { std::cout << "Fehler in der Einstellung." << std::endl; return 0; } } else { std::cout << "Deaktiviert. " << std::endl; return 0; } }Und irgendwo (ich glaube vor der Eingabe) muss evtl noch ein cin::ignore(...) rein.
Ich hab hier nur die Ausgabe in Steuerung eingefügt und einen Kommentar. Wär nett, wenn du dann beschreibst, was davon nicht das tut, was es soll

-
funktioniert trotz des return Steuerung(free); noch immer nicht

-
was genau spucken denn die Hilfsausgaben aus, die Badestrand dort eingebaut hat? (btw, wenn verfügbar, solltest du das Programm mal durch den Debugger laufen lassen)
-
Es funktioniert nur,wenn ich die IF-Anweisung,also
if(/*...*/) { if(last == first - 15) { free[last - 4] = free[first - 15]; free[first] = 'G'; //return free[last - 4]; ohne return, weil void^^ } else { std::cout << "Fehler in der Einstellung." << std::endl; //return 0; } } else { std::cout << "Deaktiviert. " << std::endl; //return 0; }in MainBlabla gleich einfüge..
-
Aber dir ist schon klar, dass first und last immer nur für einen Nutzer gültig sind? Also nachdem User2 eingegeben hat, dass dann die Eingabe des ersten weg ist? Und wo musst du sie in Mainblabla einfügen, damit es funktioniert?
-
da kommt immer die Antwort "Deaktiviert" also von der Else, obwohl es stimmt..
-
Thomas W. schrieb:
da kommt immer die Antwort "Deaktiviert" also von der Else, obwohl es stimmt..
Und was für Werte werden ausgepsuckt, wenn du am Anfang der Funktion den Inhalt von first und last ausgeben lässt?
-
CStoll schrieb:
Thomas W. schrieb:
da kommt immer die Antwort "Deaktiviert" also von der Else, obwohl es stimmt..
Und was für Werte werden ausgepsuckt, wenn du am Anfang der Funktion den Inhalt von first und last ausgeben lässt?
also die richtigen.
Wenn ich zbsp. 1 und 25 eingebe, kommt 1 25 heraus, also eh das richtige.Aber ich glaube,dass ich das Problem schon gefunden hatte. In Steuerung() war so eine If-Anweisung:
int ValueGets::Steuerung(std::vector<char> &free) { std::cout << "ValueGets::Steuerung: first=" << first << "; last=" << last << endl; if(/*...*/) { if(last == first - 15) { free[last - 4] = free[first - 15]; free[first] = 'G'; return free[last - 4]; } else { std::cout << "Fehler in der Einstellung." << std::endl; return 0; } } else { std::cout << "Deaktiviert. " << std::endl; return 0; } }Also die mit dem Kommentar drinnen als Bedingung^^ if(/.../) wenn ich die und die else mitm Deaktiviert weglasse, funktionierts wunderbar:
if(last = first ..) { //... } else { //.. }aber das würde mich nun wirklich interessieren, warum das nicht ging?!
hmm sobald ich es herausgefunden habe,schreibe ich die Antwort
Danke allen herzlichst, die mitgeholfen haben

Mfg
-
Thomas W. schrieb:
aber das würde mich nun wirklich interessieren, warum das nicht ging?!
hmm sobald ich es herausgefunden habe,schreibe ich die Antwort
Vermutlich weil du die dortige Bedingung falsch formuliert hast (wenn du uns sagst, was (a) dort genau steht und (b) die Bedingung überprüfen soll, können wir auch Verbesserungsvorschläge machen).
-
CStoll schrieb:
Thomas W. schrieb:
aber das würde mich nun wirklich interessieren, warum das nicht ging?!
hmm sobald ich es herausgefunden habe,schreibe ich die Antwort
Vermutlich weil du die dortige Bedingung falsch formuliert hast (wenn du uns sagst, was (a) dort genau steht und (b) die Bedingung überprüfen soll, können wir auch Verbesserungsvorschläge machen).
ahso, du (od. ihr) wollt mir doch helfen? Danke, find ich echt nett

in der main.cpp(also anfangsdatei) hab ich eine globale Variable:
unsigned char xx = 1; // Smileydas bringt schon was, auch wenn ich nur jetzt in der If so schreibe:
if(free[first] == 1) // free ist ein vector vom Typ char, first ist ein Integer { //.. }wenn ich die If-Anweisung weglasse, funzt alles perfekt, aber das will ich ja nicht ^^ die muss unbedingt da sein(gründe nenn ich erstmal nicht, werdet dann sehen, sobald ich fertig bin).
Auch hab ich extra versucht noch dazu in der Klassen-headerdatei noch eine globale Variable zu machen um dann den Namen der Variable zu vergleichen:
unsigned char abc = 1; ... if(free[first] == abc) { //.. }funzt auch nicht^^
Mfg
-
Und was für ein Wert steht an der Position 'first' in deinem vector?
-
Das kannst du übrigens auch generell so machen. Wenn dein Proggi aus irgendwelchen mysteriösen Gründen nicht in eine if-Abfrage eintritt, es aber sollte, ist es am Besten, dir die Werte ausgeben zu lassen:
// Hier kannst du dann sehen, _warum_ die Bedingung nie erfüllt wird. cout << "if (x == y) -> x=" << x << "; y=" << y << endl; if ( x == y ) // hier die Bedingung stimmt nie { ... }Solche Testausgaben sind meiner Meinung nach verdammt wichtig, wenn man einen Fehler hat! Alternativ, wenn du dich mit dem Debugger auskennst, kannst du vor/an der Abfrage einen Breakpoint setzen. Da pausiert dann das Programm und du kannst dir alle Kontext-Variablen angucken, also auch, welche Werte x und y haben.

-
leicht OT: Bin ich eigentlich der einzige, der eine leichte Gänsehaut bei einem Variablennamen "free" bekommt ?
Ist zwar nicht verboten, würde ich aber trotzdem nicht machen....
Gruß,
Simon2.