Seite 1 von 2
Improved Console für Linux
Verfasst: Sa Jan 02, 2010 10:59 pm
von naums
Zur Erklärung die Improved Console ist eine Headerdatei, die es erlaubt auf die WinAPI zuzugreifen und die Konsole so zu verschönern durch gezieltes einrücken oder Löschen von Text. (zu finden auf
www.c-plusplus.de/forum , bemüht die Suche)
Gibt es sowas auch für Linux, und wie kann ich dann OS entsprechend die Befehle ausführen lassen? geht das mit
damit meine ich ifdef ...
Re: Improved Console für Linux
Verfasst: Sa Jan 02, 2010 11:15 pm
von Xin
Ja, Du kannst ANSI-Steuersequenzen verwenden.
Das steht bisher leider nur auf meiner geistigen Todo-Liste für's Wiki, das haben wir leider noch nicht im Wiki.
Aber ich habe
hier das passende gefunden.
gotoxy unter Linux ist also mit
zu bewerkstelligen.
Ansonsten gibt es ncurses.
Re: Improved Console für Linux
Verfasst: So Jan 03, 2010 7:27 pm
von naums
gehen die unter Windows, und wie unterscheide ich im CODE das OS? durch ifdef???
Re: Improved Console für Linux
Verfasst: So Jan 03, 2010 7:51 pm
von Xin
naums hat geschrieben:gehen die unter Windows, und wie unterscheide ich im CODE das OS? durch ifdef???
Ich würde dazu raten, denn es lohnt sich nicht, diese Entscheidung zur Laufzeit zu treffen. Das OS wechselt üblicherweise ja nicht, während das Programm läuft.^^
Die ANSI-Sequenzen gehen unter Windows wohl nicht grundsätzlich, da muss eine ANSI.SYS miteingebunden werden - keine Ahnung, wie das funktioniert, ich habe Windows vom Wechsel von Amiga auf PC mehr oder weniger übersprungen. Beides müsste über CygWin per BaSh gehen, das wäre quasi eine Linux-Shell unter Windows.
Re: Improved Console für Linux
Verfasst: So Jan 03, 2010 8:18 pm
von naums
also wohl ne. Aber was meinstz du hiermit:
Ich würde dazu raten, denn es lohnt sich nicht, diese Entscheidung zur Laufzeit zu treffen. Das OS wechselt üblicherweise ja nicht, während das Programm läuft.^^
Welche möglichkeiten gibts denn noch? Und wie verwende ich schlauerweise den #ifdef Befehl?
Re: Improved Console für Linux
Verfasst: So Jan 03, 2010 8:53 pm
von Dirty Oerti
Du könntest theoretisch auch während das Programm läuft "nachsehen", auf welchem Betriebssystem es läuft. Das ist aber sinnlos, da du das Programm eh für jedes Betriebssystem einzeln kompilieren musst, und also gleich beim Kompilieren angeben kannst, für welches Betriebssystem das Programm gerade kompiliert wird.
Mit einem ifdef würde das halt so in etwa aussehen:
Code: Alles auswählen
// irgendwo im Code
#ifdef _WIN
tueDasunterWindows();
#endif
#ifdef _LINUX
tueDasunterLinux();
#endif
// wie die genauen Defines lauten weiß ich im Moment leider nicht, du kannst dir aber nat. auch eigene definieren
// wenn du wie oben unterschiedliche Funktionen verwendest musst du auch daran denken, dass die jeweiligen Funktionen NUR bei "ihrem" OS eingebunden werden dürfen. Es wäre also klüger allgemeingültige Funktionen zu schreiben ("tueDas()") und IN den Funktionen dann die Unterscheidung WIndows/Linux zu treffen
EIne andere Möglichkeit wäre noch mehre Dateien zu verwenden.
Sprich du hast z.B. eine Datei main.c , die enthält systemunabhängige Funktionen und ruft z.B. die Funktion ichBinSystemabhaengig()auf. Diese Funktion implementierst du nun einmal in der windows.c für die Windowsversion und in der linux.c für die Linuxversion.
Dann musst du beim kompilieren/linken nur darauf achten, die richtige von beiden Dateien zu verwenden

Re: Improved Console für Linux
Verfasst: So Jan 03, 2010 9:09 pm
von naums
also eigene Funktionen definieren, gut. danke. Da hilft mir der ANSI Code aber wenig. warte...
Code: Alles auswählen
void movecur(int x, int <)
{
#ifdef _WIN
gotoxy(x,y);
#endif
#ifdef _LINUX
printf(\033[SpalteX);
printf(\033[ZeileY);
#endif
}
is das richtig, wenn ich mit Ansi den Cursor zu X,Y positionieren will??? Und dann nachher, nachdem die Funktion ausgeführt wurde mit "std::cout <<" was ausgeben will?
Re: Improved Console für Linux
Verfasst: So Jan 03, 2010 9:52 pm
von hofian
Code: Alles auswählen
void movecur(int x, int <)
{
#ifdef _WIN
gotoxy(x,y);
#endif
#ifdef _LINUX
printf(\033[SpalteX);
printf(\033[ZeileY);
#endif
}
Ich glaube nicht, dass das funktioniert.
Zuerst solltest du die Defines noch einmal nachschlagen, und zwar auf
dieser Seite.
Dann im Linux-Teil:
printf sorgt für die Ausgabe der Escape-Sequenz, aber etwas anders:
Und im Funktionskopf natürlich noch das "<" durch ein "y" ersetzen.
Zusammengefasst müsste es dann so aussehen:
Code: Alles auswählen
void movecur(int x, int y)
{
#ifdef _win32
gotoxy(x,y);
#endif
#ifdef _linux
printf("\033[%dG", x);
printf("\033[%dH", y);
#endif
}
Re: Improved Console für Linux
Verfasst: Mo Jan 04, 2010 1:06 pm
von Kerli
hofian hat geschrieben:Zusammengefasst müsste es dann so aussehen:
Man könnte das dann auch noch etwas schöner schreiben (Außerdem fällt mir gerade auf das die Preprozessoranweisungen eingerückt sind, was nicht erlaubt ist. Die Raute muss immer am Anfang der Zeile stehten. Alles andere darf eingerückt sein):
Code: Alles auswählen
void movecur(int x, int y)
{
#if defined(_WIN32)
gotoxy(x,y);
#elif defined(linux) || defined(__linux)
printf("\033[%d;%dH", y, x);
#else
# error "Platform not supported"
#endif
}
Wenn das ganze jedoch nicht nur aus Headerdateien bestehen sollte, dann würde ich eine Headerdatei mit allen Funktionsdeklarationen schreiben und die jeweiligen Sourcefiles abhängig von der Plattform kompilieren. Also zb:
console.h:
Code: Alles auswählen
//------------------------------------------------------------------------------
/// Move the cursor
///
/// @note The top left corner has the coords (1,1)
///
/// @param x x-coord of new position
/// @param y y-coord of new position
void movecur(int x, int y);
Für Windows:
windows/console.cpp
Code: Alles auswählen
//------------------------------------------------------------------------------
void movecur(int x, int y)
{
gotoxy(x,y);
}
Für Linux:
linux/console.cpp
Code: Alles auswählen
//------------------------------------------------------------------------------
void movecur(int x, int y)
{
printf("\033[%d;%dH", y, x);
}
Re: Improved Console für Linux
Verfasst: Mo Jan 04, 2010 3:49 pm
von naums
okay danke. Aber das letzte versteh ich ne ganz. Wenn ich, die ic.hpp einbinde, für Windows um unter Windows die Farben/... angeben zu können, Muss ich die dann in der WindowsDef.h mit einbinden UND in der main.cpp??? Müssen die Dateien WindowsDef und LinuxDef für die Functions unter Linux/Windows eigentlich Header sein, oder müssen die cpp sein???