Kann mir jemand helfen? Bin Anfänger



  • Hallo zusammen.

    Hier hab ich mal einen ganz einfachen code geschrieben:

    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    int main (void)
    {
    int a=0,b=0,c=0,d=0;
    
    cout << "Geben Sie die Seitenlängen des Feldes ein: \n";
    cin >> a >> b;
    c=a*b;
    cout << "Die Flaeche des Feldes beträgt " << c << "m²";
    
    getchar();
    
    return 0;
    }
    

    Allerdings schließt sich bei mir das Ausgabefenster sofort wieder. Müsste es nicht durch das getchar() auf eine beliebige Tastertureingabe warten?
    Habe auch versucht das getchar() durch eine while-schleife zu ersetzen und so eine Zeitverzögerung zu basteln, funktioniert aber genauso wenig.
    Wenn ich das cin und die multiplikation weglasse funktioniert die Ausgabe und das Fenster bleibt offen.
    😕
    Im log finden sich noch folgende Einträge:

    "Versuch 2.exe": "C:\Users\Flo\Documents\Visual Studio 2010\Projects\Versuch 2\Debug\Versuch 2.exe" geladen, Symbole wurden geladen.
    "Versuch 2.exe": "C:\Windows\SysWOW64\ntdll.dll" geladen, Cannot find or open the PDB file
    "Versuch 2.exe": "C:\Windows\SysWOW64\kernel32.dll" geladen, Cannot find or open the PDB file
    "Versuch 2.exe": "C:\Windows\SysWOW64\KernelBase.dll" geladen, Cannot find or open the PDB file
    "Versuch 2.exe": "C:\Windows\SysWOW64\msvcr100d.dll" geladen, Symbole wurden geladen.
    "Versuch 2.exe": "C:\Windows\SysWOW64\msvcp100d.dll" geladen, Symbole wurden geladen.
    Das Programm "[3636] Versuch 2.exe: Systemeigen" wurde mit Code 0 (0x0) beendet.
    

    Kann mir bitte jemand helfen? Hab ich da unbewussterweise was aus C reingefummelt was nicht funktioniert?
    Danke schonmal



  • Lass mal das #include "stdafx.h" weg. Dann sollte es kompilieren.

    Du brauchst uebrigens das void nicht, genauso wie das return 0; Du kannst das so schreiben:

    int main() 
    { 
    	// Hier ohne return 0;
    }
    


  • ok, hab das jetz mal so gemacht wie du gesagt hast.
    Da bringt er mir aber eine Fehlermeldung und bricht sofort ab.
    Vorher konnt ich noch die werte eingeben.



  • FloWe schrieb:

    int main (void)
    {
    int a=0,b=0,c=0,d=0;
    
    cout << "Geben Sie die Seitenlängen des Feldes ein: \n";
    cin >> a >> b;
    c=a*b;
    cout << "Die Flaeche des Feldes beträgt " << c << "m²";
    
    getchar();
    }
    

    Allerdings schließt sich bei mir das Ausgabefenster sofort wieder. Müsste es nicht durch das getchar() auf eine beliebige Tastertureingabe warten?

    Also, lass uns das mal analysieren:

    1. getchar , will, wie es der Name schon sagt, ein Zeichen.
      2. Du gibst z.B. ein: 3-enter-5-enter.
      3. Im Puffer stehen nun 4 Zeichen. a bekommt die 3. Das erste enter wird ignoriert, da der operator>> standardgemäß führende Whitespaces ignoriert. b bekommt nun den Wert 5. Um das letzte enter kümmert sich aber niemand, es bleibt im Puffer stecken.
    2. getchar will ein Zeichen, und es bekommt das im Puffer steckende enter .

    Gut, nun wissen wir, wo das Problem liegt. Die Lösung ist, wie so oft: Was feststeckt muss entfernt werden. Heißt, wir reinigen den Puffer:

    cin.ignore(64,'\n'); // 64 habe ich nun beliebig gewählt. Du kannst auch jede andere Zahl wählen, natürlich min. 1.
    getchar();
    


  • Ahhhh, Danke 🙂
    find ich trotzdem etwas seltsam dass das zweite enter nicht auch dem zweiten wert zugeordnet wird. naja. wieder was gelernt 🙂

    Danke



  • FloWe schrieb:

    Ahhhh, Danke 🙂
    find ich trotzdem etwas seltsam dass das zweite enter nicht auch dem zweiten wert zugeordnet wird. naja. wieder was gelernt 🙂

    Hää, was hat Enter mit einer Ganzzahl am Hut?



  • ich muss ja mit Enter die eingabe des wertes bestätigen, oder nicht? Sonst bleibt ja das programm an der stelle stehen wo ich den wert für 'b' eingeben soll.



  • FloWe schrieb:

    ich muss ja mit Enter die eingabe des wertes bestätigen, oder nicht? Sonst bleibt ja das programm an der stelle stehen wo ich den wert für 'b' eingeben soll.

    Richtig.
    Aber wie mein Vorposter schon geschrieben hat, ignoriert operator>> das Whitespace \n. Da du aber beim Einlesen von b Enter drückst, bleibt dies im puffer hängen, da kein operator>> mehr folgt.

    gruß
    syntax



  • FloWe schrieb:

    ich muss ja mit Enter die eingabe des wertes bestätigen, oder nicht? Sonst bleibt ja das programm an der stelle stehen wo ich den wert für 'b' eingeben soll.

    Jain. Du musst dir das so vorstellen. Alles was du mit cin einließt, landet in einem Stream. Ein Stream ist eine Aneinanderreihung von Zeichen. Nun gibt es Funktionen, mit denen du Zeichen aus dem Stream rausziehen kannst.

    operator>>
    cin.get();
    getchar();
    

    Diese Funktionen sind immer dann zufrienden, wenn sie ein Zeichen aus dem Stream bekommen. Ob nun du ein Zeichen eingibst oder ob bereits eines vorhanden ist, interessiert nicht. Alle Zeichen die du eingibst, haben erstmal nichts miteinander zu tun und sind unabhängig voneinander. Was zusammen gehört entscheidet dann der Datentyp, den du haben willst. Du willst eine Ganzzahl, du bekommst eine Ganzzahl. Enter hat mit einer Gnazzahl nichts am Hut. Enter ist ein normales Zeichen.



  • ahhja, gut zu wissen

    eine frage hätte sich da gerade noch aufgetan.
    bei dem "cin.ignore(64,'\n');", was bewirkt der wert? gzw warum beötige ich zum ignorieren überhaupt einen wert?



  • FloWe schrieb:

    eine frage hätte sich da gerade noch aufgetan.
    bei dem "cin.ignore(64,'\n');", was bewirkt der wert? gzw warum beötige ich zum ignorieren überhaupt einen wert?

    http://www.c-plusplus.net/forum/p2218954?highlight=ignorieren#2218954




Anmelden zum Antworten