Hjälp med program som använder <curses.h>

Permalänk

Hjälp med program som använder <curses.h>

Hej!
Jag har skrivit ett program, MaxDice, som simulerar en tärning med n antal sidor, främst tänkt för användning i rollspel.
Programmet är inte särskilt komplicerat, och det är skrivet i C. Jag använder som tidigare nämnt <curses.h>, och det
kompilerar och körs felfritt i Windows (med MinGW och PDCurses). När jag kompilerar programmet i ett GNU/Linux-system
(med gcc och ncurses) inträffar inget fel, och det går att köra. Problemet är att ibland får jag en siffra för mycket i resultatet
(OBS! händer bara i GNU/Linux). Jag har testat både i Fedora 17 och Ubuntu 12.04.

Till exempel så här ska det se ut:

Tärningskast: 5 av 6 Tärningskast: 1 av 6 Tärningskast: 1 av 6 Tärningskast: 2 av 6

men ibland blir det till exempel så här:

Tärningskast: 5 av 6 Tärningskast: 44av 6 Tärningskast: 42av 6 Tärningskast: 41av 6

När man har gjort så många tärningskast att man befinner sig på den understa raden flyttas alla rader två steg upp för att
göra plats åt nya tärningskast. Den översta titelraden är däremot statisk. Jag misstänker att min funktion för detta kan vara
problemet:

void mv_down(void) { int i, j, ch; for (i = 1; i < 21; i++) for (j = 0; j < 80; j++) { ch = mvinch(i + 2, j); mvaddch(i, j, ch); } for (i = 0; i < 80; i++) { mvaddch(22, i, ' '); mvaddch(23, i, ' '); } move(22, 0); return; }

Detta säger nog inte så mycket i sig själv utan resten av programmet, men eftersom det är på 130 rader skriver jag inte det
här utan länkar till det i min dropbox:
https://dl.dropbox.com/u/44436922/MaxDice.c

Jag har inte kommenterat koden, så ifall ni tycker att det är obegripligt kan jag göra detta på efterfrågan.
Jag har försökt googla på problemet, men detta är lite väl specifikt för att jag ska kunna hitta en lösning verkar det som.

Permalänk
Medlem

Det beror på att din kod använder UTF-8 teckenkodning, vilket gör att det blir problem när ncurses ska skriva ut ä. Förmodligen så använder du en UTF-8 locale i Linux, du kan kolla med kommandot locale. Om så är fallet så måste du anropa setlocale(LC_CTYPE, "") innan du initialiserar ncurses, dvs. innan initscr(), för att tala om för ncurses vilken locale som ska användas. Den tomma strängen i setlocale anger att du vill använda den locale som din användare redan har satt.

Permalänk
Skrivet av perost:

Det beror på att din kod använder UTF-8 teckenkodning, vilket gör att det blir problem när ncurses ska skriva ut ä. Förmodligen så använder du en UTF-8 locale i Linux, du kan kolla med kommandot locale. Om så är fallet så måste du anropa setlocale(LC_CTYPE, "") innan du initialiserar ncurses, dvs. innan initscr(), för att tala om för ncurses vilken locale som ska användas. Den tomma strängen i setlocale anger att du vill använda den locale som din användare redan har satt.

Tack så mycket!
Jag hade verkligen ingen aning, men nu funkar det felfritt!
En annan sak som jag gjorde innan var att kompilera med
-lncurses, vilket resulterade i att 'ä' blev andra tecken. Med
-lncursesw och setlocale blev allt bra. Tack åter igen!