Warum kein system("cls") verwenden?



  • @Shiba schau in den Link von mir.
    Die ersten VS-Versionen in den 90ern haben da noch die DOS-Variante. DOS in VS funktionierte nur bis VS 1.5 oder so?

    Wenn ihr das real unter DOS lösen wollt, wie war noch mal der Interrupt? int 10h?
    Da könnt ihr euch auch durch wühlen. Neuere Betriebssysteme erschweren einem ja diese hardwarenahen Lösungen 😉

    Bei aktuellen VS geht das über Windows.h.

    MfG f.-th.



  • Da erwischt man sich wieder 😃

    Moderne OS natürlich nur, wenn Windows -> windows.h 🤡
    In Linux natürlich anders.

    MfG f.-th.



  • Danke f.-th. für den Hinweis 🙂
    Mir ging es allein um system() und da lag ich, wie Volkhard schon bemerkte, leicht nebendem Threadthema.



  • Die Visual Studio Compiler haben kein clrscr.

    Wenn der Code dazu nun bei einem anderen Compiler vorliegt, kann man nicht einfach die Datei kopieren und dann #includen?



  • Kannst ja wegen dem Code bei Microsoft nachfragen 👍
    Wenn du den bekommst, startest du die gleiche Frage bei den Borland/Embarcadero. Dann schaust du dir den Quelltext der Bibliotheken an und konstruierst da eine eigene daraus, lässt die von beiden Firmen lizenzieren u.s.w. 🤡
    Oder hast du etwas anderes geplant 😕
    Da geht noch was 😉

    Ich habe ja was von Werkzeugen oder Tools (muss wohl so 🤡 ) geschrieben.
    Da gibt es dann mehrere verschiedene Varianten wie du deinen Lieblingscompiler mit entsprechenden Funktionen nachrüsten kannst.

    MfG f.-th.



  • Thuruk schrieb:

    Die Visual Studio Compiler haben kein clrscr.

    Wenn der Code dazu nun bei einem anderen Compiler vorliegt, kann man nicht einfach die Datei kopieren und dann #includen?

    Ähh ... wenn Du Visual Studio benutzen willst, programmierst Du wohl für Windows. Dann kannst Du einfach die oben gepostete Funktion verwenden.



  • ich habe für meine win-konsolen-anwendung meine sysmte("CLS") befehle durch die funktion auf der ersten seite ersetzt. funktioniert alles auch wunderbar - genau wie es soll.
    aber es gibt immernoch ein problem:
    wenn ich recht schnell hintereinander die konsole leere - wieder beschreibe und wieder leere blinkt die erste bzw ersten zeilen. ich dachte das wäre durch deine funktion behoben.
    gibt es noch eine andere möglichkeit?



  • Was meinst Du mit 'recht schnell'?
    Wenn ich morgens aus dem Haus gehe, mache ich das Licht aus. Wenn es abends dunkel wird, mache ich es wieder an.
    Wenn ich das aber nun im Rhythmus einer halben Sekunde oft hintereinander mache ... dann blinkt es halt ...



  • okay, hier etwas genauer:
    ich habe ein menü mit einer pfeil auswahl geschrieben. funktion: ich setze einen ascii pfeil auf auswahl 1, dann drücke ich die pfeiltaste nach unten.
    dann lösche ich alle ausgaben auf der konsole mit system("cls") und schreibe nun das selbe menü wieder hin, nur das der pfeil nun bei option 2 davor steht, nicht mehr bei der ersten option.
    wenn ich nun schnell die pfeiltasten hoch & runter drücke blinkt die erste zeile in meiner konsole kurz (ms). ich dachte das würde an meinem befehl system("cls") liegen, wegen os-befehl etc. aber mit der funktion auf seite 1 blinkt es immernoch für wenige ms in meiner konsole.

    edit: es blinkt nur die erste zeile. die anderen zeilen, die auch immer gelöscht und wieder ausgegebn werden bleiben konstant stehen.



  • Dafür würde ich nicht den ganzen Bildschirm löschen, sondern nur die Stelle, wo Dein zu löschender Text steht (Dein Ascii-Pfeil). Dann brauchst Du dafür auch nicht den ganzen Bildschirm neu zu beschreiben.

    Wenn ich das richtig verstehe, würde es doch ausreichen:

    Einmal Bildschirm löschen.
    Einmal Menü ausgeben.

    In einer Schleife:
    Ascii-Pfeil an der gewünschten Stelle ausgeben.
    Taste abwarten.
    Ascii-Pfeil an der alten Stelle mit Blanks überschreiben.
    Schleife wieder von vorne.



  • Beispiel:

    #include <windows.h>
    
    void DruckSimpleText(int x, int y, char const *text)
    {
        COORD target = {x, y};
        DWORD written;
    
        WriteConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), text,
                                                strlen(text),
                                                target, &written);
    }
    
    int main()
    {
    	for(int i = 0; i < 10; ++i)
    	{
    		DruckSimpleText(5, i, "===>");
    		Sleep(2000);
    		DruckSimpleText(5, i, "    ");
    	}
    }
    


  • wow, vielen dank, das ist natürlich weitaus angenehmer und erspart mir auch ein paar Zeilen Code. Danke für den Hinweis! 👍


Anmelden zum Antworten