blutiger Anfänger: conio.h geht nicht mehr



  • hallo forum

    ich habe vor einer woche mit Bloodshed Dev-Cpp angefangen Cpp zu lernen.
    Bis jetzt habe ich immer gemäss meinem tutorial mit #include <conio.h> gearbeitet und hatte keine probleme damit.
    Von einem Tag auf den anderen bekomme ich aber beim compilieren folgende meldung:
    `getch' was not declared in this scope

    Vormals compilierte programme funktionieren aber noch mit "getch"
    Nur neue sachen halt nicht.

    In der Dev-Cpp-Hilfe steht folgendes:
    Include conio.h to your source, and add the following file to your project : C:\Dev-C++\include\conio.c (where C:\Dev-C++ is where you installed Dev-C++).

    Somit habe ich aus MinGW die Datei "conio" kopiert und in einen unter Dev-Cpp neu angelegten ordner "include" gepasted. (so habe ich die Hilfe interpretiert)

    --> es will aber immer noch nicht

    Die FAQ's für anfänger haben mich hierbei auch nicht weitergebracht.

    Kann mir da jemand behilflich sein?
    Wäre Euch sehr dankbar 🙂



  • Irgendwas musst du doch gemacht haben. Hast du evtl. angefangen namespaces zu verwenden und "includest" den Header ungewollt in einen namespace?



  • So zum einen solltest du dir überlegen den Compiler/IDE zu wechseln.Weil Dev C++ schon seit 10 jahren nicht mehr weiterentwickelt wurde. Nimm sowas wie Code::Blocks oder Visual Studio Express(oder Professionell wenn du eine Lizens hast)
    Zum anderen ist es bei manchem Compilern so, das es nicht

    getch()
    

    heißt sonder irgendwie

    _getch()
    

    .Was aber eh irrelevant ist, da du bei Code::Blocks oder Visual Studio die conio.h gelassen includieren kannst und dort mit getch() arbeiten solltest.(zumindest ging es bei mir so)



  • Es gibt C++-Alternativen zu getch(), die man im Sinne der Plattform-Unabhängigkeit nutzt:

    #include <iostream>
    
    void wait()
    {
     std::cin.clear();
     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
     std::cin.get();
    }
    
    int main()
    {
        //... Programm Code 
        wait();
    }
    

    Das funktioniert gut, solange man kein windows.h includiert. Dann muss man einen work-around verwenden wegen max, der wie folgt lautet:

    #include <iostream>
    
    void wait()
    {
        std::cin.clear();
    
     // std::cin.ignore( std::cin.rdbuf()->in_avail() ); 
        std::streambuf * pbuf = std::cin.rdbuf();
        std::streamsize size  = pbuf->in_avail(); 
        std::cin.ignore(size);
    
        std::cin.get();
    }
    
    int main()
    {
        //... Programm Code 
        wait();
    }
    

    Damit kann man getch() ablösen.



  • Decimad schrieb:

    Irgendwas musst du doch gemacht haben. Hast du evtl. angefangen namespaces zu verwenden und "includest" den Header ungewollt in einen namespace?

    namespace? nein, eigentlich nicht.
    ich habe mit iomanip-somderzeichen angefangen.

    Firefighter schrieb:

    So zum einen solltest du dir überlegen den Compiler/IDE zu wechseln.Weil Dev C++ schon seit 10 jahren nicht mehr weiterentwickelt wurde. Nimm sowas wie Code::Blocks oder Visual Studio Express

    wäre auch ein versuch wert. habe jetzt mit Dev Cpp gearbeitet, weil das mein tutorial empfiehlt (2007). und als rookie halte ich mich vorerst an die empfehlungen. aber ich versuchs mit Code::Blocks. Das hab ich auch.

    Erhard Henkes schrieb:

    Es gibt C++-Alternativen zu getch(), die man im Sinne der Plattform-Unabhängigkeit nutzt:

    ja, cin.get habe ich auch schon mitgekriegt.
    aber eben.. das tutorial sagt...
    und wenn ich dann anfange überall ein bisschen davon abzuweichen hab ich nacher ein riesen chaos. ich versuchs also mal mit nem anderen compiler. hab mich auch schon irgendwie ans getch gewöhnt 😉

    Wenns nicht klappt, versuch ichs weiter und melde mich ggf nochmals.

    Vielen herzlichen Dank euch allen! 😃



  • hab mich auch schon irgendwie ans getch gewöhnt

    Ist ja auch nicht schlecht gewesen, früher! Du ersetzt einfach des getch() durch wait(). Oben fügst Du jeweils die Funktion für wait() ein, und schon klappt alles wie von selbst. Das ist keine wesentliche Änderung für Dich. 😉

    Als Compiler empfehle ich Code::Blocks für den Anfang, später VC C++ Express.



  • Erhard Henkes schrieb:

    Das funktioniert gut, solange man kein windows.h includiert. Dann muss man einen work-around verwenden wegen max, der wie folgt lautet:

    Soweit ich weiss, gab es noch zwei andere Workarounds. Der eine mit Klammern um den Ausdruck, der andere mit einem Makro, das auf nichts definiert ist und vor max() eingefügt wird.



  • Nexus schrieb:

    Erhard Henkes schrieb:

    Das funktioniert gut, solange man kein windows.h includiert. Dann muss man einen work-around verwenden wegen max, der wie folgt lautet:

    Soweit ich weiss, gab es noch zwei andere Workarounds. Der eine mit Klammern um den Ausdruck, der andere mit einem Makro, das auf nichts definiert ist und vor max() eingefügt wird.

    Es gäbe sonst auch noch NOMINMAX.

    Finde das ganze aber auch übelst eklig. Wenn ich es brauche nehme ich die Variante mit den Klammer,auch wenn es mir eigentlich wiederstrebt meinen Code an eine "schlechte" Lib anzupassen..



  • Solange das keine Nachteile auf anderen Code haben könnte, hätte ich auch keine Gewissensbisse, ein #undef zu verwenden. Wobei NOMINMAX die sanftere Methode darstellt. 😉


Anmelden zum Antworten