Hallo,
ich möchte ein Konsolen-Programm erstellen. Dazu möchte ich auch die
Funktion benutzen, dass die Konsole gelöscht wird und neu bescrieben
wird. Aber das funktioniert bei mir nicht wirklich (Windows10; Cygwin
GCC)
Momentan bin ich nur dabei, diese Funktion zu testen. Daher ist mein
Programm noch ziemlich leer.
Aber die Konsole wird nicht gelöscht und immer neu unter der alten
ausgabe geschrieben.
Aber alles was ich immer gefunden habe, war system("cls"). Gibt es noch
andere möglichkeiten? Oder woran könnte es liegen, dass es bei mir nicht
funktioniert?
Jens schrieb:> Windows10; Cygwin> GCC)
Ach so, falls es dich interessierts, wie es unter Linux aussieht:
ein leeres, schwarzes Konsolenfenster ;-)
Dein printf("....") ist da nicht zu sehen.
(lösche die while-Schleife - es geht zu schnell)
zitter_ned_aso schrieb:> ich würde zuerst ohne dieser while-Schleife probieren.
warum?
aber auch ohne der schleife wird der Text nicht gelöscht.
leo schrieb:> Ich schaetze mal, das macht ein neues Fenster auf, das du dann loescht.
Ein neues fenster wurde nicht geöffnet. auch wurde der Text ja immer im
selben Fenster geschrieben
zitter_ned_aso schrieb:> Welcher Text wird nicht gelöscht?
r: run; t: train; q: quit\r\n\r\n
zitter_ned_aso schrieb:> Unter Linux wird alles gelöscht.
Bein mir unter Windows aber nicht
zitter_ned_aso schrieb:> while(1){> clearScreen();> printf("r: run; t: train; q: quit\r\n\r\n");> fflush(stdout);> getchar();> }
Auch das bringt nichts.
foobar schrieb:> void clearScreen(void)> {> printf("\e[H\e2J");> fflush(stdout);> }
Das springt zwar wieder zur ersten Zeile und überschreibt das
vorhandene, löscht aber nicht den bisherigen Inhalt der Konsole
Jens schrieb:> zitter_ned_aso schrieb:>> Welcher Text wird nicht gelöscht?>> r: run; t: train; q: quit\r\n\r\n
Moment mal, du schreibst doch selbst diesen Text.
Zuerst löscht du das Ausgabefenster und dann schreibst du diesen Text.
>> void clearScreen(void)>> {>> printf("\e[H\e2J");>> fflush(stdout);>> }>> Das springt zwar wieder zur ersten Zeile und überschreibt das> vorhandene, löscht aber nicht den bisherigen Inhalt der Konsole
Upps, sorry. Da fehlt ein [ vor dem 2J: "\e[H\e[2J"
"\e[H" ist Cursor-Home, "\e[2J" ist Clear-Screen.
Btw, mit printf("\e[%d;%dH", zeile, spalte) kannst du den Cursor
positionieren. Siehe: https://en.wikipedia.org/wiki/ANSI_escape_code
zitter_ned_aso schrieb:> Moment mal, du schreibst doch selbst diesen Text.>> Zuerst löscht du das Ausgabefenster und dann schreibst du diesen Text.
Ja, durch die schleife, soll der geschriebene Text aber wieder gelöscht
werden und neu gescrieben werden. Der Text soll dann immer an der selben
stelle geschrieben werden. Daher möchte ich das Fenster löschen und neu
beschreiben. Wenn das funktioniert, werden später noch weitere daten
dargestellt, die sich dann auch ändern.
foobar schrieb:> "\e[H" ist Cursor-Home, "\e[2J" ist Clear-Screen.
Das sieht besser aus.
Aber gelöscht wird der Inhalt ja auch nicht,sondern nur nach oben
verschoben. Wenn ich es öfters ausführe, kann ich scrollbalken nach oben
schieben und sehe den alten text
so sieht clrscr im Source aus in Pascal, es werden offenbar wie bei dem
Microsoft Beispiel für C lediglich Leerzeichen geschrieben, allerdings
ist mir dabei nie aufgefallen das ich das ältere noch sehen konnte.
Thomas M. schrieb:> ist so ein typisches C Problem..> "However, there is no Win32 Application Programming Interface (API) or> C-Runtime function that will perform this function."
Nur weil der Compilerhersteller nix bequemes für diesen Teil der API
mitliefert? Es wird immer irgendwas fehlen.
Kann man dann einfach selbst machen, die Windows API ist gut
dokumentiert und Funktionen aus DLL aufrufen geht auch unter C.
> Ich glaube das ght dann aber wiede nur unter Windows, ins Linux klappt das dann
auch wieder nicht..
Klar, Linux hat ne andere API als Windows. Aber auch unter Linux wird
das System entsprechende Funktionen bereitstellen.
Wobei es unter Linux garantiert ne fertigte lib dafür gibt (ncurses ?).
Jens schrieb:> Wenn das funktioniert, werden später noch weitere daten> dargestellt, die sich dann auch ändern.
Dann schau dir mal ncurses an. Gibt es auch für Windows.
ich denke aber clrscr...ist so etwa grundlegendes wie delay..das es mal
als Standard dazugepackt werden sollte..das Problem haben ja alle
Neueinsteiger
Naja, Neueinsteiger programmieren heutzutage eher selten GUI in Konsole
;-)
Wenn dann nutzt man eher Konsolenprogramme die kontinuierlich etwas auf
der Konsole ausgeben.
Früher war GUI bei DOS Programmen üblich, aber das war ja nicht per
Konsole.
Also, ein Hallo world in dder Konsole finde ich nicht so selten..
Die ersten Schritte erfolgen denke ich sehr oft in der Console..
mit welchem Befehl kann man in C alles hinter der aktuellen Ausgabe
löschen ohne das aktuelle neu geschriebene zu löschen?
Vermutlich muss man dazu dann die eben genannten Beispiele umschreiben..
BTW: Sollte eigentlich möglich sein direkt in den Konsolenbuffer zu
schreiben, oder? Dann ist löschen überflüssig und man kann seinen Kram
genauso machen wie früher bei den DOS Programmen.
Thomas M. schrieb:> ich denke aber clrscr...ist so etwa grundlegendes wie delay..das es mal> als Standard dazugepackt werden sollte..das Problem haben ja alle> Neueinsteiger
clrscr ist nicht nötig.
Das sollten Neueinsteiger schnell lernen.
Genauso wie Umlaute in der Konsole.
Ist zwar hübsch, aber überflüssig zum lernen.
Ein TUI werden sie erstmal nicht nutzen.
test schrieb:> BTW: Sollte eigentlich möglich sein direkt in den Konsolenbuffer zu> schreiben, oder? Dann ist löschen überflüssig und man kann seinen Kram> genauso machen wie früher bei den DOS Programmen.
Dann bist du an ein System gebunden.
Wozu dann C?
Wieso ist clrscr überflüssig?
Auch umlaute sind nicht unwichtig..
Schon mal gehört, das man am besten lernt wenn etwas Spaß macht?
Umlaute und das Benutzen der Cursortasten sind wohl die beliebtesten
Dinge als Anfänger um Anständige Sätze bilden zu können und nicht nie
Wie löscht Du denn dann den Bildschirm..sorry aber sowas höre ich das
erste mal..
Einfache eingaben Wie
Wie lautete Dein Vorname
Wie lautet Dein Nachname
ClrScr;
Hallo Mr.X oder darf ich y sagen?
Udn auch Delays können sinnvoll eingesetzt werden..oder willst Du
ernsthaft bei einem 5 Zeile Programm einen Counter einsetzten?
Abgesehen davon finde ich sollte der Programmierer selber entshcheiden,
was man tut und was nicht..wenn man es mit einem neuen Bildschirm
schreiben möchte..möchte ich mir nicht sagen lassen, das macht man
nicht.
Daher haben wir heutzutage diese unsäglichen Webseiten im OnePAge
Design*kotz*
Damals...wurde den Anfänger die sowas gemacht haben, gesagt..sowas macht
man nicht...heute wären es voll die Trendsetter....oder die Profil
Webdesigner von heute sind eigentlich eher die totalen Anfänger geworden
Dirk B. schrieb:> test schrieb:> BTW: Sollte eigentlich möglich sein direkt in den Konsolenbuffer zu> schreiben, oder? Dann ist löschen überflüssig und man kann seinen Kram> genauso machen wie früher bei den DOS Programmen.>> Dann bist du an ein System gebunden.> Wozu dann C?
Man ist immer an ein System gebunden. Es sei den das Programm ist sehr
einfach (im Bezug auf die Systemintegration) oder Müll.
Mit C hat das aber nix zu tun, man kann in jeder Sprache
plattformübergreifend oder plattformspezifisch schreiben.
Aber gerade wenn es um GUI geht kommt man mit irgendwelchen C Standards
oder POSIX nicht weiter. Die Systeme unterscheiden sich hier so extrem
das für jedes System individuell entwickelt werden muss. Oder man
bekommt Müll.
ernstgemeinte Frage..und soll jettz nicht dem Pascal vs. C Streit
dienen.
Wenn jemand nach clrscr fragt, kommt IMMER zuerst die Escape sequenz von
jemandem..was damals zu Dos Zeiten evtl ok gewesen wäre...oder eben auch
nicht..denn..
Wenn ich heute im Dos Fenster ein Pascal Programm laufen lasse, läuft
das ja ohne Probleme, außer es wird der Runtime Error 200 nicht
geptacht.
Wenn nun aber jemand, was ja offensichtlich seeehr viele gemacht
haben..in ihren C Programmen einfach die Escape Sequenz genutzt haben
für clrscr..
Laufen dann all diese Programme heute nicht mehr?
Gibt es für sowas auch einen Patch?
Oder war die verwendung der Escape Sequenz schon damals ungeschickt bzw
falsch?!
Ich habe jetzt leider kein einfache C Programm hier, mit dem ich das
selber testen könnte
ICh lade mir gleich mal Turbo C runter um das mal zu versuchen:-)
Man muss erstmal generell zwischen einem DOS Programm und einem Windows
Konsolenprogramm unterscheiden.
Sieht beides erstmal gleich aus, unterscheidet sich aber grundsätzlich.
Ein Windows Konsolenprogramm hat kein Fenster, aber es öffnet eine
Konsole (diese Konsole ist aber kein DOS was dort aufgeht, und auch
keine Windows Kommandozeile). Diese Konsole ist erstmal nix anderes als
ne Textbox.
Klingt vielleicht doof, aber erfahrungsgemäß
- sollte man für nichttriviale interaktive Konsolenprogramme sowas wie
ncurses nehmen
- wird das dann oft komplizierter als wenn man einfach eine normale GUI
mit z.B. Qt gebaut hätte.
geht ncurses denn auch unter Dos? nein...dazu nutzt man conio.h
https://de.wikipedia.org/wiki/Ncurses
"Betriebssystem Unix-Derivate, GNU/Linux"
https://en.wikipedia.org/wiki/Conio.h
conio.h is a C header file used mostly by MS-DOS compilers to provide
console input/output.[1] It is not part of the C standard library or ISO
C, nor is it defined by POSIX.
in der Conio.h. gibt es dann auch
clrscr!
Thomas M. schrieb:> Sehe gerade..Borland C läuft nicht mal im DOS Fenster..schade...
Weil das seit Winows NT kein DOS Fenster mehr ist.
Die ANSI-Escapesequencen sind seit XP passe.
Seit Windows 10 kann man sie wohl wieder aktivieren.
Ein TUI hat meist auch direkt in den Bildschirmspeicher geschrieben.
Und diese Emulation gibt es auch nicht mehr.
ja eben es ist die Windows Konsole....nur da weiter oben der Einwand
kam..Konsole Dos Fenster etc...
Jedenfalls mit PAscal geht alles noch ob nun im Dos Fenster oder in
eienr Windows Konsole, egal ob Windows 3.0 oder Windows 10...
Offenbar ist es also geschickter es mit dem oben genannten C code zu
lösen, der wie clrscr in Pascal/Freepascal einfach mit Blank Zeichen den
Bildschirm füllt..als mit irgendwechen Esc Sequenzen oder sowas
rumzuspielen, das das 2 Jahre funktioniert und bei nächsten
Betriebsssytem nur noch fehlerhaft arbeitet
Thomas M. schrieb:> ich denke aber clrscr...ist so etwa grundlegendes wie delay..das es mal> als Standard dazugepackt werden sollte..das Problem haben ja alle> Neueinsteiger
Wenn alles, was irgendjemand als etwas Grundlegendes ansieht, in die
Standardbibliothek gepackt würde, würde diese sehr schnell riesengroß
werden. Das ist an sich kein Problem, denn in Free Pascal, Python und
einigen anderen Sprachen wird es ja mit Erfolg so gemacht.
Es ist aber die Philosophie von C, sowohl den Sprachumfang also auch die
Standardbibliothek möglichst schlank zu halten. Zudem versucht C, von
möglichst wenigen Annahmen zur Zielplattform auszugehen. ClrScr und
GotoXY bspw. setzen einen Bildschirm als stdout-Medium voraus. stdout
kann aber genauso gut ein Drucker, eine Datei, eine Pipe oder eine
Netzwerkverbindung sein, wo diese Funktionen wenig Sinn haben. Also
beschloss man, dass stdout einfach ein abstrakter Datenstrom ist, über
den sequentiell Zeichen oder Datenbytes übertragen werden, mehr nicht.
Diese Philosophie ist zum einen traditionell begründet, zum anderen aber
auch darin, dass C im Gegensatz zu Free Pascal und Python von der ISO
genormt ist. Je umfangreicher eine Sprache und ihre Standardbibliothek
ist, umso aufwendiger und schwieriger ist auch die Pflege der Norm (bei
C++ scheint man diesbezüglich derzeit die Grenzen ausloten zu wollen
;-)).
Auch in Free Pascal sind ClrScr und GotoXY – anders als die reinen
Stream-Funktionen Read und Write – nicht in der Default-Bibliothek
enthalten, sondern wurden in die Crt-Bibliothek ausgelagert. Der
Unterschied zu C liegt darin, dass bei Free Pascal die Crt-Bibliothek
gleich mitgeliefert wird, bei C muss man sie (bspw. in Form von ncurses)
nachinstallieren. Das ist zum einen lästig, zum anderen bestehen für
eine externe, auf eine bestimmte Anwendung (hier: Bildschirmausgaben)
spezialisierte Bibliothek kaum Beschränkunge bzgl. ihres Umfangs, so
dass ncurses eine Vielzahl von High-Level-TUI-Funktionen (Wie bspw.
Fenster) implementiert, die Crt nicht hat.
Thomas M. schrieb:> in ihren C Programmen einfach die Escape Sequenz genutzt haben für> clrscr..> Laufen dann all diese Programme heute nicht mehr?
Unter DOS funktionierte diese Esc-Sequenz auch nur, wenn der
Speicherfresser ANSI.SYS geladen war.
In Windows 10, "Anniversary Edition", wurde diese Funktionalität
erstmalig für alle Konsolanwendungen eingebaut.
Um sie nutzen zu können, muss die Win32-API Funktion SetConsoleMode mit
dem Flag ENABLE_VIRTUAL_TERMINAL_PROCESSING aufgerufen werden.
Eine detaillierte Beschreibung der verschiedenen nutzbaren Esc-Sequenzen
findet sich hier:
https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences
(Vermutlich war irgendein Entwickler bei MS es leid, die arg grindige
Win32-Console-API zu nutzen ...)
Na fast richtig.
In CRT Unit gibt es ja auch Windows und mehr
http://wiki.freepascal.org/Crt/de#Window
Somit könnte C einfach mehr der standard libs zugepackt werden, die es
gerade für Anfänger nervig machen, da bereits einfache Dinge kompliziert
werden.
Später mag das dann weniger dramtaisch sein
Thomas M. schrieb:> Somit könnte C einfach mehr der standard libs zugepackt werden, die es> gerade für Anfänger nervig machen, da bereits einfache Dinge kompliziert> werden.
Was macht ein clrscr() dann auf Systemen ohne Bildschirm (embedded)?
?!
Was sollte es denn Deiner Meinung nach tun?!
Die Unit crt in Pascal/Freepascal nutze ich auch eher selten im
embedded...aber sie ist halt dabei und könnte für z.B. delay genutzt
werden
Wenn es in einer extra Lib ist, die aber mitgeliefert wird, wie eben bei
Pascal..dann nutzt Du sie einfach nicht. verstehe Deine Frage jetzt
nicht
Was macht man wenn man per ssh auf der Console ist? yalu hatt das
Problem schon schön zusammengefasst.
Plattformübergreifend verzichtet man besser auf solche Spielereien.
Sonst wirds sehr sehr mühselig (man kann sicher auf allen Systemen
irgendwie rausfinden ob eine Konsole lokal ist und welche Fähigkeiten
sie hat).
Thomas M. schrieb:> Somit könnte C einfach mehr der standard libs zugepackt werden, die es> gerade für Anfänger nervig machen
Da C nicht dafür gedacht ist, die Probleme von Anfängern zu lösen, und
das Problem irgendwelcher Bildschirmmanipulationen die wenigsten
Entwickler von Konsolapplikationen überhaupt interessiert, dürfte sich
hier ein Zielkonflikt auftun.
Thomas M. schrieb:> Wenn jemand nach clrscr fragt, kommt IMMER zuerst die Escape sequenz von> jemandem..was damals zu Dos Zeiten evtl ok gewesen wäre...oder eben auch> nicht..denn..
Unter unixoiden Betriebssystemen waren und sind die ANSI-Sequenzen
einfach Standard, weil sie nicht nur lokal, sondern auch auf externen
Bildschirmterminals und über zeichenbasierte Remoteverbindungen wie
Telnet und SSH funktionieren.
Auch in DOS und früheren Windows-Versionen wurden die ANSI-Sequenzen
unterstützt, dann wurden sie abgeschafft, um sie mit Windows 10 wieder
auferstehen zu lassen.
Übrigens verwendet Free Pascal unter Linux – der Unix-Tradition folgend
– für ClrScr, GotoXY usw. ebenfalls die ANSI-Sequenzen. Das Löschen der
Konsole übernimmt dabei der jeweilige Terminalemulator, was effizienter
und bei Remoteverbindungen Traffic sparender als die Ausgabe von
tausenden von Leerzeichen ist.
Thomas M. schrieb:> Na fast richtig.> In CRT Unit gibt es ja auch Windows und mehr> http://wiki.freepascal.org/Crt/de#Window
Die Crt-Fenster sind keine echten Fenster im Sinne eines UI, sondern
lediglich eine Begrenzung der Textausgabe auf eine Teil des Bildschirms.
Die ncurses-Fenster hingegen erlauben Öffnen, Schließen, Stapeln, Ändern
der Größe, Verschieben dekorieren mit Rahmen u.ä., Menüs u.v.m., ganz
wie in einem GUI-Framework, nur dass das Ganze eben textbasiert ist.
Und weil die Darstellung der Fenster komplett auf ANSI-Sequenzen
aufbaut, funktioniert das alles auch über SSH.
"Da C nicht dafür gedacht ist, die Probleme von Anfängern zu lösen"
?!
Aha..C ist wieder was für Vollprofis wie sie hier in diesem Forum sind
oder was willst Du damit sagen?!#
Fidnest Du nciht das die Diskussion bislang ausgesprochen friedlich
war...;-)#
Es geht nicht darum ob einen Konsolenoperationen interessieren!! Die
interessieren auch in Pascal keinen!
Es geht um Programme im Textmodus!!
Heutzutage werden die aber üblich im Windows getestet..und da gibt es
nun in C plötzlich >Probleme wenn man mit der ESC Sequenz arbeitet..
Wieso werden hier immer die Fakten völlig verdreht?
Ah ok, ncurses scheint jedenfalls sehr umfangreich zu sein..wie in
Pascal die Window Unit oder wie die genau heißt.
aber wie dem auch sei..offenbar liegt das einzige Problem dabei, das
eigentlich nur eine delay.h bei C zugelegt werden könnte.
Somit können wir uns den Hahnenkampf um C vs. Pascal ja auch sparen.
Wenn man durch die Foren surft, fällt halt eben nur gerade dieses clrscr
und delay Problem auf..ist also halt absolut nicht selten.
In anderen Sprachen wie D ist es die disp.h ..aber der Definition von
Rufus ist die Programmiersprache dann ja eine Anfängersprache, da sie
offenbar zumindest Rücksicht auf "Anfängerprobleme" nimmt;-)
Wobei ich mich damit gerade weit aus dem Fenster lehne, da ich keine
Ahnung habe, ob die zur Standardlieferung von D gehört;-) Ich
unterstelle das jetzt einfach mal um eine Spitze an Rufus ...
Thomas M. schrieb:> ?!> Was sollte es denn Deiner Meinung nach tun?!
Das frage ich ja dich, du willst ja, dass clrscr() Teil des Standards
wird! Teil des Standards wird aber nur, wofür es auf möglichst alles
Plattformen eine sinnvolle Umsetzung gibt.
Thomas M. schrieb:> Wenn es in einer extra Lib ist, die aber mitgeliefert wird, wie eben bei> Pascal..dann nutzt Du sie einfach nicht.
Dann ist es aber eben nicht Teil des Standards. Unter Windows gibt's
eben die conio.h mit diversen Konsolen-Funktionen. Unter Linux findest
du erase() in curses.h. Dein "Problem" ist also keines.
Thomas M. schrieb:> Heutzutage werden die aber üblich im Windows getestet..und da gibt es> nun in C plötzlich >Probleme wenn man mit der ESC Sequenz arbeitet..> Wieso werden hier immer die Fakten völlig verdreht?
Was kann nun C dafür, dass Windows sein Verhalten ändert.
Thomas M. schrieb:> Somit können wir uns den Hahnenkampf um C vs. Pascal ja auch sparen.
Warum fängst du ihn dann an?
Thomas M. schrieb:> In anderen Sprachen wie D ist es die disp.h
In D gibt es weder Dateien mit der Endung .h noch ein Äquivalent zur
ClrScr-Funktion. Das geht dort wie in C über externe Bibliotheken.
vn n. (wefwef_s)
na in Pascal geht es aber unter allen Windowsversionen...
: Yalu X.
aber in D wird diese mitgeliefert..
ob nun .h oder nicht .h ;-)
Ich sehe gerade das bezieht sich aud C++ im D Forum..also ziehe ich
meinen Einwand vorerst..zurück;-)
https://forum.dlang.org/thread/9ma8nu$oc7$1@digitaldaemon.com