Forum: PC-Programmierung curses.h --> Problem


von J.K. (Gast)


Lesenswert?

Hallo Leute!

Ich werde bald bekloppt mit dieser curses.h. Die Frage richtet sich an 
alle Linuxer unter euch, die schon mal mit dieser Bibliothek was zutun 
hatten.

Und zwar habe ich folgendes vor:

die Schriftfarbe der Strings "Farbe1", "Farbe2" und "Farbe3" sollen 
jeweils unterschiedlich im gleichen Fenster sein.

Das heißt die Farbe des Strings "Farbe1" soll in diesem Beispiel rot 
sein. usw.

Was mache ich falsch? Es erscheint immer nur die letze Farbe....

PS: Zum Übersetzen des Codes muss der Schalter -lncurses beim gcc 
eingeschaltet werden. Auch die Reihenfolge der Schalter ist entscheidend 
(bescheurt).
1
gcc -lncurses -o ./test.app ./test.c

Hier mein Beispielcode:
1
#include <curses.h>
2
3
int main (void)
4
{
5
   initscr();
6
   start_color();
7
   clear();
8
9
   init_pair(1,COLOR_RED,COLOR_BLACK);
10
   init_pair(2,COLOR_BLUE,COLOR_BLACK);
11
   init_pair(3,COLOR_WHITE,COLOR_BLACK);
12
13
   attrset(COLOR_PAIR(1));
14
   mvaddstr(5,5,"Farbe1");
15
   attrset(COLOR_PAIR(2));
16
   mvaddstr(6,6,"Farbe2");
17
   attrset(COLOR_PAIR(3));
18
   mvaddstr(8,8,"Farbe3");
19
20
  refresh();
21
  getch();
22
23
  return 0;
24
25
}


Vielen dank!

von jfdj (Gast)


Lesenswert?

zwischendurch refresh()?

von j.k. (Gast)


Lesenswert?

Leider nicht ;-) Habe unter jedes "mvaddstr();" ein refresh();   hat 
leider auch nicht den gewünschten Effekt hervorgerufen.

von sdgbxycb (Gast)


Lesenswert?

Also bei mir klappt das Beispiel so wie oben:

Rot
 Blau

  Weiss


Gast

von sdgbxycb (Gast)


Lesenswert?

>PS: Zum Übersetzen des Codes muss der Schalter -lncurses beim gcc
>eingeschaltet werden. Auch die Reihenfolge der Schalter ist entscheidend
>(bescheurt).

>gcc -lncurses -o ./test.app ./test.c

Was ist daran unlogisch?

Gast

von j.k. (Gast)


Lesenswert?

dass es mein Compiler nicht übersetzt, wenn ich zuerst den Schalter "-o" 
und DANACH den Schalter "-lncurses" schalte.

Finde es nich besonders logisch, hier eine Reihenfolge beachten zu 
müssen...

Zum eigentlichen Problem: Werde es mal in einer Systemkonsole 
(Strg-Alt-1) versuchen und nicht in einer Konsole unter KDE.


Gruß

von Rolf M. (rmagnus)


Lesenswert?

j.k. schrieb:
> dass es mein Compiler nicht übersetzt, wenn ich zuerst den Schalter "-o"
> und DANACH den Schalter "-lncurses" schalte.

Dann muß irgendwas mit deiner Installation kaputt sein. Bei mir 
funktioniert das wie erwartet.

> Zum eigentlichen Problem: Werde es mal in einer Systemkonsole
> (Strg-Alt-1) versuchen und nicht in einer Konsole unter KDE.

Ich habe es gerade in der Konsole von KDE versucht, und da funktioniert 
es.

von sdgbxycb (Gast)


Lesenswert?

Du weisst aber, was -o bedeutet?

gcc [-c|-S|-E] [-std=standard] [-g] [-pg] [-Olevel] [-Wwarn...] 
[-pedantic] [-Idir...] [-Ldir...] [-Dmacro[=defn]...] [-Umacro] 
[-foption...] [-mmachine-option...] [-o outfile] infile...

Da -o das Outfile aendert ist es nur logisch, dass direkt nach dem 
Schalter der Dateiname kommen muss.

Auch in einer kde-Konsole funktioniert es bei mir.

Gast

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

An dem Curses-Programm fehlt ja so ziemlich alles.

Regel Nr 1 bei Curses: Mindestens einen SIGINT Signal-Handler 
installieren, der bei Programmabbruch noch schnell den alten 
Terminal-Status wiederherstellt.

Dann fehlt schon in normalen Ablauf ein endwin(). Ein has_colors()-Test 
fehlt. Die üblichen cbreak()-, noechon()- und nonl()-Aufrufe fehlen. Es 
fehlen jeweils attroff()-Aufrufe.

Und mal richtig zusammenlinken ist auch eine gute Idee. Bibiotheken 
(-l...) kommen nach den Objekt-Dateien (.o) und C-Dateien (*.c).

von j.k. (Gast)


Lesenswert?

Also bei mir funktionierts leider auch nicht unter einer anderen Konsole 
:(

Könntet mir vielleicht jemand das Programm so umändern, dass es 
funktioniert?!

Vielen dank

von Sven P. (Gast)


Lesenswert?

Könnte vielleicht mal jemand, bei dem es nicht funktioniert, sich 
äußern, welches Terminal überhaupt benutzt wird? Es gibt sicherlich auch 
Terminals, die nur ganze Zeilen in einer Farbe einfärben können.

von roman65536 (Gast)


Lesenswert?

jk, kannst du ein "infocmp" von deinem terminal schicken ??
und den set output von der shell, auf der du es probierst ??

fallst installiert auch den strace output.

lg roman

von Johannes Knoeller (Gast)


Lesenswert?

welche "Zeile" des infocmp willst du denn genau wissen?
Eine für mich interessante Zeile lautet wie folgt:
1
colors#8, cols#80, it#8, lines#24, pairs#64

von Johannes Knoeller (Gast)


Lesenswert?

Ok habe es selber herausgefunden :)

Es klappt!

das "refreh()" hat bei mir im Code gefehlt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.