cin wird übersprungen



  • ha, thx man 🙂

    std::cin.clear (); brauchte ich 🙂



  • b4nan1 schrieb:

    std::cin.clear (); brauchte ich 🙂

    Ja... das ist aber nicht alles. Der interne Puffer enthält noch die Zeichen an denen der Parser gescheitert ist, die müssen auch raus.



  • Sone schrieb:

    b4nan1 schrieb:

    std::cin.clear (); brauchte ich 🙂

    Ja... das ist aber nicht alles. Der interne Puffer enthält noch die Zeichen an denen der Parser gescheitert ist, die müssen auch raus.

    Und wie das?



  • b4nan1 schrieb:

    Sone schrieb:

    b4nan1 schrieb:

    std::cin.clear (); brauchte ich 🙂

    Ja... das ist aber nicht alles. Der interne Puffer enthält noch die Zeichen an denen der Parser gescheitert ist, die müssen auch raus.

    Und wie das?

    std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
    


  • // Clear CIN
    	if(!std::cin)
    	{
    		std::cin.clear ();
    		std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
    	}
    

    Ok aber wo befindet sich ::max?

    mfg



  • bzw warum will max ein Bezeichner?

    a und b ok, aber warum ist das nirgendswo zu finden wie das funktionieren soll?



  • Du leerst den Puffer mit cin.ignore().
    Es werden dann solange Zeichen aus dem Puffer geleert, bis entweder Argument 1 Zeichen gelöscht wurden oder das Zeichen Argument 2 erreicht wurde.
    In diesem Fall soll maximal alles gelöscht werden.
    std::numeric_limits<irgendein_arithemetischer_typ>::max() liefert den größten Wert zurück, denn irgendein_arithmetischer_typ annehmen kann.
    In diesme Fall ist irgendein_arithmetischer_typ std::streamsize und wir müssen den maximalen Wert verwenden, weil wir die maximale Anzahl aus dem Puffer löschen wollen.



  • omg langsam finde ich auch die sprache brain like (ohne sinn)

    Ich will was löschen warum so komplizeirt?

    Und wie soll die lösung aussehen? fehlt da was? ich kenne den befehl nicht, da reicht mir nicht der halbe bzw ka was da noch kommen soll.



  • Die haste doch schon oben geschrieben.
    Fehlt nur noch ein #include <limits>.
    Und mit der Komplexität kommt auch hohe Flexibilität.
    Aber mit der Zeit wirst du die Hintergründe dahinter verstehen.


  • Mod

    Ich würde nicht versuchen, den Streams eine Text-GUI aufzudrücken. Wenn du GUI machen willst, dann nimm dafür auch GUI-Mittel, damit ist das was du vor hast ganz einfach. Wenn du die Streams benutzt dann sieh sie als den Datenstrom an, der sie sind. Wenn ein Logikfehler im Format der Eingabe vorliegt, dann ist die Eingabe eben fehlerhaft. Fertig. Versuch dann nicht, interaktiv auf der Eingabe zu werden, sondern sieh es einfach als Fehler an. Denn interaktive Programme setzen eine Menge über die Art und Weise voraus, wie die Eingabe erfolgt (z.B. dass da ein Mensch an einer Tastatur mit Monitor sitzt), die bei den abstrakten Standardeingabe- und Ausgabestreams gar nicht unbedingt gegeben sind.



  • Nein das klapt halt nicht.

    include ist drinne, aber es kommen trd fehler, bzw nur bei der zeile.

    1. Es wird ein Bezeichner erwartet.
    2. Nich genügende Parameter
    3. Syntax fehler
    3. Ungültiger Token auf der rechten seite ::

    Ja das bei der einen zeile ja.
    Das muss ich nicht verstehen, und wie ich oben beschrieben habe, möchte ich 4 int füllen.

    mit std::cin >> key1 >> key2 >> key3 >> key4;

    vil liegt da der fehler?



  • SeppJ ich bin Anfänger.

    Ist klar das es easy ist, wenn man es verstanden hat und auch mehr weiß.

    PS GUI soll was sein?



  • Das sieht so aus, mit Dynamischern Speicher (Eingabe)

    // Clear CIN
    	if (!std::cin)
    	{
    		std::cin.clear ();
    		std::cin.ignore (std::numeric_limits<std::streamsize>::max (), '\n');
    	}
    
    	// Eingabe
    	std::cin >> (int)*key1 >> (int)*key2 >> (int)*key3 >> (int)*key4;
    

    Aber er fickt rum bei eurer zeile mit Puffer Löschen.

    PS: Benutze VS 2012


  • Mod

    b4nan1 schrieb:

    SeppJ ich bin Anfänger.

    Ist klar das es easy ist, wenn man es verstanden hat und auch mehr weiß.

    Deshalb mache ich dich auch darauf aufmerksam, dass du gerade versuchst, das eckige Klötzchen in das runde Loch zu stopfen. Man kann mit viel Gewalt versuchen, einen Stream wie ein interaktives Benutzerinterface zu benutzen, aber dafür ist er nicht gedacht und daher ist es auch so schwierig und selbst wenn es klappt, dann nicht gut.

    PS GUI soll was sein?

    Was macht man denn, wenn man ein Wort nicht kennt?

    P.S.: Mein Rat ist übrigens nicht, dass du dich jetzt auf das nächstbeste GUI-Framework stürzt. Das wäre vermutlich viel zu schwierig. Mein Rat ist, die Streams so zu nutzen wie gedacht. Wenn es einen Fehler gibt, dann sieh die Eingabe als beendet oder fehlerhaft an (je nach Bedürfnis der Programmlogik). Versuch nicht, den Fehler zu korrigieren. Niemanden interessiert es, wie benutzerfreundlich dein Übungsprogramme sind, das ist der unwichtigste Aspekt beim Lernen. Sieh lieber zu, dass deine Programme korrekt funktionieren, schön geschrieben sind und coole Sachen machen.
    Eine schöne Benutzerführung ist wie die Note im Schönschreiben. Im Prinzip könnte es jeder, wenn man sich bloß genug anstrengt, aber der Inhalt des geschriebenen wird dadurch nicht besser. Eventuell sogar schlechter, weil man Zeit mit den Äußerlichkeiten verschwendet.



  • ok, werde mich mal an die streams machen die mal alle kennen zu lern.
    Wenn du eine PDF kennst was bezüglich das abhandelt wäre ich dir sehr verbunden 🙂

    Das ding ist, was mache ich damit jetzt nun?
    Soll ich das weg lasen, und nur clear benutzen, oder wie sol ich das verstehen?
    Verstehe schon was du mit sauberers Programmieren meinst, bloß geht das klar mit clear? Also funktionieren tut es, aber ob es später vil zum fehler kommen kann weiß ich nicht, weswegen du mich wahrscheinlich auchf amerksam gemacht hast.


  • Mod

    b4nan1 schrieb:

    Wenn du eine PDF kennst was bezüglich das abhandelt wäre ich dir sehr verbunden 🙂

    Heißt das, du lernst ganz ohne Lehrmaterial nur aus dem Internet? 😮 Nicht so gut. Hier hast du wenigstens ein brauchbares freies Ebook:
    http://www.mindview.net/Books/TICPP/ThinkingInCPP2e.html
    Du darfst aber erwarten, dass du damit nochmal völlig neulernen musst, wenn du bisher nur Internettutorials kennst. Aber das wäre dann auch gut so, denn Internettutorials sind meisten ziemlich schlecht.

    Das ding ist, was mache ich damit jetzt nun?

    Was soll dein Programm überhaupt machen?



  • Ne nicht ganz ohne 🙂
    Vieles habe ich natürlich nicht (Noch nicht).

    Der dynamische speicher soll den int den wert geben, und der int soll das dann zusammen rechnen bzw verarbeiten.

    Wenn der int eine fehleingabe bekommt, was zum cin fehler anscheind führ, dann soll er halt den int auf 0 zurück setzen, und den cin ja clearen, damit die eingabe wiederholbar ist, und das nicht zu einer schleigfe kommt.

    Deswegen habe ich ja hier geschrieben, warum de cin übersprungen wird, aber das weiß ich ja jetzt warum, bloß wie ich es jetzt gut löse ist jetzt die frage, mit clear geht das zwar, bloß meintest du das es nicht ausreicht.

    Und das nicht ausreicht ist jetzt mein Problem, da es bei mir nicht klapt 🙂


  • Mod

    b4nan1 schrieb:

    Der dynamische speicher soll den int den wert geben, und der int soll das dann zusammen rechnen bzw verarbeiten.

    Wenn der int eine fehleingabe bekommt, was zum cin fehler anscheind führ, dann soll er halt den int auf 0 zurück setzen, und den cin ja clearen, damit die eingabe wiederholbar ist, und das nicht zu einer schleigfe kommt.

    Ich versteh kein Wort.

    Beschreib mal auf Deutsch, ohne zu versuchen, Programmierfachjargon zu benutzen.



  • Ok,

    Es wird ja eine Eingabe erwartet die er ja auch bearbeitet sprich auch rechnet (deswegen int).

    Das ganze wird dann per fstream in einer datei gespeichrt und fertig.

    Wenn du aber jetzt bei der eingabe ein großen wert reinschreibst der größer ist als int aufnehmen kann, dann kommt es zur einer schleife, da die abfrage fehgeschlagen ist (die ich noch stelle), und die eingabe soll wiederholt werden.
    Bloß überspringt er den cin befehl, wenn ich nicht clear hätte, da es ja zum fehler führt.

    Die Werte brauche ich nur am anfagn des Programms, und wenn die richtig sind, holt er die sich ja aus der Datei die ich zuvor angelgt habe (per programm).

    Die schleife will ich ja beenden was ja mit clear klapt, aber du meinst es reicht ja nicht.

    PS:
    Er soll einfach damit rechnen und wieder vergessen, aber im laufe des programms kommen noch andere eingaben, vieleicht kommt es dann da zum fehler?

    mfg



  • Hier mal der Source-Code:

    int *key1 = new int;
    	int *key2 = new int;
    	int *key3 = new int;
    	int *key4 = new int;
    
    	*key1 = NULL;
    	*key2 = NULL;
    	*key3 = NULL;
    	*key4 = NULL;
    
    	// Clear CIN
    	if (!std::cin)
    	{
    		std::cin.clear ();
    		// std::cin.ignore (std::numeric_limits<std::streamsize>::max (), '\n');
    	}
    
    	// Eingabe
    	std::cin >> (int)*key1 >> (int)*key2 >> (int)*key3 >> (int)*key4;
    
    	keyblock1 = *key1;
    	keyblock2 = *key2;
    	keyblock3 = *key3;
    	keyblock4 = *key4;
    
    	if (eingabech (keyblock1, keyblock2, keyblock3, keyblock4) == true)
    	{
    		keytemp = 0;
    		keytemp = keyblock1 + keyblock2;
    		keytemp += keyblock3;
    		keytemp -= keyblock4;
    	}
    
    	savekey ();
    
    	// Speicher Löschen
    	delete key1;
    	delete key2;
    	delete key3;
    	delete key4;
    
    	key1 = 0;
    	key2 = 0;
    	key3 = 0;
    	key4 = 0;
    
    	// Lösche Keyblock
    	keyblock1 = NULL;
    	keyblock2 = NULL;
    	keyblock3 = NULL;
    	keyblock4 = NULL;
    
    	if (keytemp == OK)
    		return true;
    	else
    		return false;
    }
    
    bool eingabech (int keyblock1, int keyblock2, int keyblock3, int keyblock4)
    {
    	if (keyblock1 > 00000 && keyblock2 > 00000 && keyblock3 > 00000 && keyblock4 > 00000 || keyblock1 == 0 && keyblock2 == 0 && keyblock3 == 0 && keyblock4 == 1)
    		return true;
    	else
    		return false;
    }
    

    Der Checkt, und wenn das net passt schickt er dich hier rein. (mit for schleife)


Anmelden zum Antworten