Improved Console für Linux

Direkte Linux-Programmierung, POSIX
Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Improved Console für Linux

Beitrag von naums » Sa Jan 02, 2010 10:59 pm

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

Code: Alles auswählen

#ifdef Win32
gotoxy(2,3);
#ifdef Linux
BEFEHLxy(2,3);
damit meine ich ifdef ...
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Improved Console für Linux

Beitrag von Xin » Sa Jan 02, 2010 11:15 pm

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

Code: Alles auswählen

printf("\0x1B[%d;%dH", zeile, spalte );
zu bewerkstelligen.

Ansonsten gibt es ncurses.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: Improved Console für Linux

Beitrag von naums » So Jan 03, 2010 7:27 pm

gehen die unter Windows, und wie unterscheide ich im CODE das OS? durch ifdef???
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Improved Console für Linux

Beitrag von Xin » So Jan 03, 2010 7:51 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: Improved Console für Linux

Beitrag von naums » So Jan 03, 2010 8:18 pm

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?
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Improved Console für Linux

Beitrag von Dirty Oerti » So Jan 03, 2010 8:53 pm

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 :)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: Improved Console für Linux

Beitrag von naums » So Jan 03, 2010 9:09 pm

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?
.globl truth
truth:
mov r0, #42
mov pc, lr

hofian
Beiträge: 62
Registriert: Do Sep 24, 2009 6:59 pm

Re: Improved Console für Linux

Beitrag von hofian » So Jan 03, 2010 9:52 pm

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:

Code: Alles auswählen

printf("\033[%dG", x);
printf("\033[%dH", y);
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
}

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Improved Console für Linux

Beitrag von Kerli » Mo Jan 04, 2010 1:06 pm

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);
}
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: Improved Console für Linux

Beitrag von naums » Mo Jan 04, 2010 3:49 pm

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???
.globl truth
truth:
mov r0, #42
mov pc, lr

Antworten