Hallo Linuxianer,
ich bin ein Newbie in Sachen C++. In einem Grundlagenkurs haben wir mit
Borland C++Builder programmiert. Da ich eine Linuxkiste und keine
500 Euro für Borland übrig habe, wollte ich den GNU <c++>Compiler nutzen. Die ersten versuche verliefen zufriedenstellend.
Mittlerweile misse ich ein paar Headerfiles, wie z.B. die conio.h. Und hier liegt auch mein Prob.
Wie kann ich mit dem <c++> den aktuellen Bildschirm löschen? Bisher bin ich nur auf das Entwicklerpaket <ncurses> gestossen.
Ich würde mich über ein paar Antworten von Euch freuen. Vielleicht hat der Eine oder Andere noch etwas Hintergrundwissen mit dem Umgang des <c++> oder kann mir evt. einen anderen Compiler empfehlen.
Cu @mastertm
Bildschirm löschen
Re: Bildschirm löschen
Hi mastertm!
Die conio.h ist eine Erfindung, die in keinem Standard vorkommt und es nur unter DOS/Windows gibt. Unter Unix- und GNU-Systemen verwendet man tatsächlich die curses-Bibliothek bzw. im Linux-basierten GNU-System die NCurses-Implementierung davon.
Alternativ kannst du z.B. - was manch einer vielleicht nicht elegant finden wird, was aber durchaus eine recht zuverlässige und portable Lösung ist - system("clear") aufrufen. Die Funktion system() ist in stdlib.h deklariert. Eine weitere Möglichkeit wäre, direkt die entsprechende Terminal-Kontrollsequenz auszugeben, aber das ist noch so halbwegs portabel (auf manchen exotischen Terminal-Typen wird es nicht funktionieren) und sieht recht hässlich im Quellcode aus, nämlich so: printf("\033[H\033[J").
Was den Umgang mit dem GNU C++ Compiler angeht, sind natürlich erst einmal die Optionen relevant. Hier ein paar ausgewählte, die ich allgemein hilfreich finde:
-Wall (mehr Warnungen aktivieren)
-W (zusätzliche Warnungen aktivieren)
-Wno-unused (nicht wegen definierter, aber nicht benutzer Variablen warnen)
-c (nur Compilieren, nicht linken)
-O1 (ein wenig optimieren)
-O2 (viel optimieren)
-O3 (extrem optimieren, nicht immer sinnvoll)
-fomit-frame-pointer (eine ganz bestimmte Optimierung)
-g (Debugging-Symbole verwenden, damit man es z.B. mit gdb debuggen kann)
-lXXX (gegen Bibliothek XXX linken, z.B. -lncurses für die NCurses-Bibliothek, muss _nach_ den Dateinamen kommen, die der Compiler verarbeiten soll, also z.B. "g++ -Wall -O2 -g foo.cpp -lncurses")
-DXXX (Definiere Symbol XXX, wie mit #define XXX)
Es gibt natürlich weit mehr (siehe "info gcc" oder die veraltende Manpage "man gcc"), aber diese sollten für den Anfang reichen. "info gcc" gibt auch noch einige weiterführende Tipps, z.B. über Erweiterungen des GNU-Compilers wie geschachtelte Funktionen usw.
Außer dem GNU-Compiler gibt es nichts, was wirklich Nennenswert wäre, höchstens noch den Open C++ Compiler (http://www.csg.is.titech.ac.jp/~chiba/openc++.html), der es ermöglicht, C++ zu erweitern, was eher für Fortgeschrittene interessant ist und ich weiß auch nicht, wie brauchbar das Teil ist, d.h. ich habe ihn nur zufällig in der Debian-Paketliste gefunden. Es gibt natürlich auch kostenpflichtige proprietäre Compiler, aber die sind hier wohl nicht interessant.
Cheers,
GNU/Wolfgang
Die conio.h ist eine Erfindung, die in keinem Standard vorkommt und es nur unter DOS/Windows gibt. Unter Unix- und GNU-Systemen verwendet man tatsächlich die curses-Bibliothek bzw. im Linux-basierten GNU-System die NCurses-Implementierung davon.
Alternativ kannst du z.B. - was manch einer vielleicht nicht elegant finden wird, was aber durchaus eine recht zuverlässige und portable Lösung ist - system("clear") aufrufen. Die Funktion system() ist in stdlib.h deklariert. Eine weitere Möglichkeit wäre, direkt die entsprechende Terminal-Kontrollsequenz auszugeben, aber das ist noch so halbwegs portabel (auf manchen exotischen Terminal-Typen wird es nicht funktionieren) und sieht recht hässlich im Quellcode aus, nämlich so: printf("\033[H\033[J").
Was den Umgang mit dem GNU C++ Compiler angeht, sind natürlich erst einmal die Optionen relevant. Hier ein paar ausgewählte, die ich allgemein hilfreich finde:
-Wall (mehr Warnungen aktivieren)
-W (zusätzliche Warnungen aktivieren)
-Wno-unused (nicht wegen definierter, aber nicht benutzer Variablen warnen)
-c (nur Compilieren, nicht linken)
-O1 (ein wenig optimieren)
-O2 (viel optimieren)
-O3 (extrem optimieren, nicht immer sinnvoll)
-fomit-frame-pointer (eine ganz bestimmte Optimierung)
-g (Debugging-Symbole verwenden, damit man es z.B. mit gdb debuggen kann)
-lXXX (gegen Bibliothek XXX linken, z.B. -lncurses für die NCurses-Bibliothek, muss _nach_ den Dateinamen kommen, die der Compiler verarbeiten soll, also z.B. "g++ -Wall -O2 -g foo.cpp -lncurses")
-DXXX (Definiere Symbol XXX, wie mit #define XXX)
Es gibt natürlich weit mehr (siehe "info gcc" oder die veraltende Manpage "man gcc"), aber diese sollten für den Anfang reichen. "info gcc" gibt auch noch einige weiterführende Tipps, z.B. über Erweiterungen des GNU-Compilers wie geschachtelte Funktionen usw.
Außer dem GNU-Compiler gibt es nichts, was wirklich Nennenswert wäre, höchstens noch den Open C++ Compiler (http://www.csg.is.titech.ac.jp/~chiba/openc++.html), der es ermöglicht, C++ zu erweitern, was eher für Fortgeschrittene interessant ist und ich weiß auch nicht, wie brauchbar das Teil ist, d.h. ich habe ihn nur zufällig in der Debian-Paketliste gefunden. Es gibt natürlich auch kostenpflichtige proprietäre Compiler, aber die sind hier wohl nicht interessant.
Cheers,
GNU/Wolfgang
Re: Bildschirm löschen
Hallo Wolfgang,
vielen Dank für deine Info's. Die Funktion <system()> gefällt mir als portable Lösung am Besten.
Unter der ncurses-Implementierung gibt es auch einen clear-Befehl. Kann man mit ncurses auch irgendwie den Bildschirm löschen???
Thanks & Best Recards
mastertm <tommy müller>
vielen Dank für deine Info's. Die Funktion <system()> gefällt mir als portable Lösung am Besten.
Unter der ncurses-Implementierung gibt es auch einen clear-Befehl. Kann man mit ncurses auch irgendwie den Bildschirm löschen???
Thanks & Best Recards
mastertm <tommy müller>
Re: Bildschirm löschen
Hi !
Ich würde sagen das für den Systemaufruf eine absolute Pfadangabe vieleicht besser wäre.
Denn was ist wenn dein Programm z.B suid gesetzt ist und ein Bösewicht ändert die PATH - Umgebungsvariable ...
Er ändert seine PATH Variable und schreibt sich ein "übles" Programm das er 'clear' nennt und schon ists vorbei mit
der Systemsicherheit ...
Ich würde sagen das für den Systemaufruf eine absolute Pfadangabe vieleicht besser wäre.
Denn was ist wenn dein Programm z.B suid gesetzt ist und ein Bösewicht ändert die PATH - Umgebungsvariable ...
Er ändert seine PATH Variable und schreibt sich ein "übles" Programm das er 'clear' nennt und schon ists vorbei mit
der Systemsicherheit ...
Re: Bildschirm löschen
Hi "",
ich freue mich über jede Anregung...
Bei Deinem Threat konnte ich leider nicht genau herausfinden, ob du die ncurses- oder die sytem-Implementierung meinst. Ausserdem konnte das Ding mit der Pfadangabe nicht vollständig verarbeiten. Bei der <include> - Anweisung gibts ja die zwei Möglichkeiten - wie funzt das beim Funktionsaufruf ???
Cu mastertm
ich freue mich über jede Anregung...
Bei Deinem Threat konnte ich leider nicht genau herausfinden, ob du die ncurses- oder die sytem-Implementierung meinst. Ausserdem konnte das Ding mit der Pfadangabe nicht vollständig verarbeiten. Bei der <include> - Anweisung gibts ja die zwei Möglichkeiten - wie funzt das beim Funktionsaufruf ???
Cu mastertm
Re: Bildschirm löschen
Hi!
> Ich würde sagen das für den Systemaufruf eine absolute Pfadangabe vieleicht besser wäre.
Ja, das ist besser (also system("/usr/bin/clear")), aber wer schreibt denn suid-Programme? <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
Cheers,
GNU/Wolfgang
> Ich würde sagen das für den Systemaufruf eine absolute Pfadangabe vieleicht besser wäre.
Ja, das ist besser (also system("/usr/bin/clear")), aber wer schreibt denn suid-Programme? <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
Cheers,
GNU/Wolfgang
Re: Bildschirm löschen
Guten Morgen GNU/Wolfgang -- musst du nachher nicht aufstehen oder hast du noch Ferien ??
Gibts eigentlich sowas wie Lint auch für C++ Quellcode ?
Ich habe letztens so beim Surfen LCLint ( <a href="http://lclint.cs.virginia.edu/" target="_blank"><!--auto-->http://lclint.cs.virginia.edu/</a><!--auto--> )
entdeckt und dachte halt ...
Gibts eigentlich sowas wie Lint auch für C++ Quellcode ?
Ich habe letztens so beim Surfen LCLint ( <a href="http://lclint.cs.virginia.edu/" target="_blank"><!--auto-->http://lclint.cs.virginia.edu/</a><!--auto--> )
entdeckt und dachte halt ...
Re: Bildschirm löschen
Hi Descartes!
> Guten Morgen GNU/Wolfgang -- musst du nachher nicht aufstehen oder hast du noch Ferien ??
Wenn man nicht schlafengeht, muss man nicht aufstehen. <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle"> Ne, mal ernsthaft: Ich habe noch eine Woche, aber sollte mich langsam mal umgewöhnen. Aber ich will vor dem Schlafengehen noch herausfinden, warum Ruby unter GNU/Hurd falsche Errno-Konstanten liefert. Und dann vielleicht noch, warum das interaktive Ruby (irb) mein $HOME wie eine Datei einlesen will (was unter GNU/Hurd ja funktioniert, nur ist's kein gültiger Ruby-Quellcode)...
> Gibts eigentlich sowas wie Lint auch für C++ Quellcode ?
Ist mir nichts bekannt. Warum sollte jemand sowas auch schreiben? Genau dann, wenn man damit fertig wäre würde es sowiso wieder 'nen neuen C++ Standard geben, der inkompatibel zu allen vorherigen ist.
Cheers,
GNU/Wolfgang
> Guten Morgen GNU/Wolfgang -- musst du nachher nicht aufstehen oder hast du noch Ferien ??
Wenn man nicht schlafengeht, muss man nicht aufstehen. <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle"> Ne, mal ernsthaft: Ich habe noch eine Woche, aber sollte mich langsam mal umgewöhnen. Aber ich will vor dem Schlafengehen noch herausfinden, warum Ruby unter GNU/Hurd falsche Errno-Konstanten liefert. Und dann vielleicht noch, warum das interaktive Ruby (irb) mein $HOME wie eine Datei einlesen will (was unter GNU/Hurd ja funktioniert, nur ist's kein gültiger Ruby-Quellcode)...
> Gibts eigentlich sowas wie Lint auch für C++ Quellcode ?
Ist mir nichts bekannt. Warum sollte jemand sowas auch schreiben? Genau dann, wenn man damit fertig wäre würde es sowiso wieder 'nen neuen C++ Standard geben, der inkompatibel zu allen vorherigen ist.
Cheers,
GNU/Wolfgang
Re: Bildschirm löschen
Hi-Ho,
ich muss als Newbie nochmal kurz einhaken...
Wann ist denn Suid-Programm ???
Und das Problem mit der Sicherheit ist mir immer noch nicht so klar. Wenn der Source-Code compiliert ist, kann man doch keine weiteren Änderungen am compilierten Programm machen? Wo ist da denn das Problem mit der Sicherheit?
Vielen DAnk für Eure Ausdauer <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
Cu mastertm
ich muss als Newbie nochmal kurz einhaken...
Wann ist denn Suid-Programm ???
Und das Problem mit der Sicherheit ist mir immer noch nicht so klar. Wenn der Source-Code compiliert ist, kann man doch keine weiteren Änderungen am compilierten Programm machen? Wo ist da denn das Problem mit der Sicherheit?
Vielen DAnk für Eure Ausdauer <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
Cu mastertm