webForumDet fria alternativet

new_item (menu) tar inte åäö

C/C++

24 svar · 663 visningar · startad av Gein

Medlem sedan sep. 20005 700 inlägg
Frågan#1

Håller på att skriva en meny med menu- och curses-biblioteket och har stött på ett problem.
*name i new_item tar inte åäö, antar att andra fultecken inte heller funkar. Kan jag komma runt detta och få åäö i min meny iaf?

ITEM *new_item(const char *name, const char *description);

Mer info

Medlem sedan mars 20007 896 inlägg
#2

Kan du inte använda dig av klassen string istället?

Medlem sedan sep. 20005 700 inlägg
#3

Hur skulle det se ut då?
Jag är inte så värst erfaren c-programmerare.

Medlem sedan mars 20007 896 inlägg
#4
#include <string>
...
ITEM *new_item( string *name, string *description ) {
...
}

Sög på string här i C++-forumet så hittar du säkert en hel del vad gäller strängar.

Medlem sedan sep. 20005 700 inlägg
#5

Men new_item är ingen funktion som jag har gjort. Den finns ju i menu.h. Jag kan väl inte ändra vad den ska ta in?

Medlem sedan mars 20007 896 inlägg
#6

Ah, sorry. Då blir det ju lite svårare. :)

Du kan ju, men risken är att det blir väldigt mycket jobb. :e

Jag kan knappt nån C++ alls, så jag har inga förslag att ge. :r

Medlem sedan juni 200010 432 inlägg
#7

SPiN -> Det är ett C-lib han har.

Gein->
Enda sättet som jag kan se det är att man kollar upp hur funktionen ser ut internt och gör en egen men med unsigned char istället för bara char (som är signed (-128) till 127). Förutsatt att man har tillgång till deklarationen av (structen) Item.

Medlem sedan sep. 20005 700 inlägg
#8

Det enda jag hittar om new_item i menu.h är

extern NCURSES_EXPORT(ITEM *) new_item (const char *,const char *);

Inte mycket till en funktion i mina ögon.

Här är item-structen som finns i menu.h

typedef struct
{
  const char* str;
  unsigned short length;
} TEXT;

typedef struct tagITEM 
{
  TEXT           name;        /* name of menu item                         */
  TEXT           description; /* description of item, optional in display  */ 
  struct tagMENU *imenu;      /* Pointer to parent menu                    */
  void           *userptr;    /* Pointer to user defined per item data     */ 
  Item_Options   opt;         /* Item options                              */ 
  short          index;       /* Item number if connected to a menu        */
  short          y;           /* y and x location of item in menu          */
  short          x;
  bool           value;       /* Selection value                           */
                             
  struct tagITEM *left;       /* neighbour items                           */
  struct tagITEM *right;
  struct tagITEM *up;
  struct tagITEM *down;

} ITEM;
Medlem sedan juni 200010 432 inlägg
#9

Inte mycket till en funktion i mina ögon.

Nej, den är förkompilerad och ligger i ett lib så den kommer du inte åt. Deklarationen i menu.h är bara en garant för kompilatorn att det existerar en funktion som ser ut så.

Problemet är flera. Dels i structen TEXT och dels i prototypen för new_item.

Vad är det som händer när du använder åäö? Ballar det ur eller blir det bara utskriftsfel? Är det bara utskriftfel kan det fungera att typa om till unsigned när du ska använda texten. Detta eftersom värdet ändå är detsamma men ö är detsamma som 246 i unsigned och (-10) i signed.

Medlem sedan sep. 20005 700 inlägg
#10

Det som händer är att menyn slutar vid det objektet. Alla tidigare objekt skrivs ut i menyn fram tills dess att ett felaktigt objekt förekommer. Programmet krashar alltså aldrig.
Jag använder aldrig texten själv, utan kör post_menu(min_meny) för att skriva ut menyn.

Medlem sedan juni 200010 432 inlägg
#11

Oki... den slutar antagligen därför att den läser åäö som strängterminering. Problemet är att du inte kommer åt att konvertera enskilt. Det skulle kunna fungera om man på något sätt kunde byta ut TEXT mot en egen struct (geinTEXT) och byggde en egen post_menu.

Medlem sedan sep. 20005 700 inlägg
#12

Men då antar jag att jag måste byta ut MENU-structen oxå, som använder sej av ITEM, och därmed funktioner som använder MENU. Det blir ju ohållbart :(
Jag som tänkte förlita mej en hel del på menu-biblioteket. :x

Medlem sedan juni 200010 432 inlägg
#13

Lugn och fin nu :)

Själva ITEM (och MENU) behövs inte bytas ut då de inte vet ett smack om unsigned eller signed. Den huserar TEXT och så vitt de vet. Enda tillfället som det kan fela är när post_menu ska skriva ut. Så med lite mer efterforskningar (problemet kan ju faktiskt ha uppstått för andra personer) så kanske det redan finns en lösning på det här.

Börja med att söka på google om ncurses och svenska tecken ;)

Medlem sedan sep. 20005 700 inlägg
#14

Patrik lugnar ner sej och blir finare.
Google -> "ncurses svenska tecken"
Jag återkommer!

Medlem sedan juni 20022 599 inlägg
#15

Nu är inte *nix min starka sida men det här:
http://www.geocrawler.com/archives/3/344/2001/3/0/5459977/
kanske kunde vara nåt? Det handlar om ncurses iaf.

Medlem sedan juni 200010 432 inlägg
#16

Förmodligen kom lösningen här ovan eftersom det hela handlar om tolkningen av värdet på char :)

Medlem sedan sep. 20005 700 inlägg
#17

PeW skrev:

Förmodligen kom lösningen här ovan eftersom det hela handlar om tolkningen av värdet på char :)

Ja, det Niko postade va precis det problemet jag har, men jag löser det ändå inte. Nu inkluderar jag locale.h anropar setlocale (LC_ALL, "sv_SE"); både i main-funktionen samt mainmenu-funktionen (som är den funktion som skapar menyn). Men det funkar ändå inte. Går igenom kompilatorn, men samma fel.

Medlem sedan sep. 20005 700 inlägg
#18

Kollade efter lite noggrannare, setlocale returnerar NULL vilket betyder att något går snett när jag försöker sätta setlocale.
Om jag lämnar det andra argumentet tomt "sv_SE" -> "" så funkar det. Hittar den inte sv_SE kanske?

Medlem sedan juni 200010 432 inlägg
#19

Det borde räcka att ha den i endast main.

Problemet är som sagt att endast char normalt sett är signed och du behöver att den är unsigned. Det ska gå att typa om direkt men å andra sidan kanske funktionen new_item gör nåt skumt med det som inte är signed och då blir det ju fel. Du kan ju testa att göra lite spårutskrifter på '_din_item->name->str' för att se lite mer exakt vart det felar. Dvs om det är direkt eller i post_menu.
(Eftersom TEXT även lagrar längden på strängen antar jag att den internt i new_item gör en strlen. I den kan det ju hända att värden under 0 antas som 0 och då blir det ju fel)

edit
Jag skriver alltid mina program i engelska så jag har inte testat setlocale. Men setlocale bör ju vara beroende av vad operativet har för inställningar så om det inte fungerar som det var tänkt kan det ju vara nån konfiguration där.

Medlem sedan juni 20022 599 inlägg
#20

Gein skrev:

Hittar den inte sv_SE kanske?

Vet inte. Men det du gjorde var nog rätt ändå:

setlocale(LC_ALL, ""); // char encoding is that of shell, i.e. UTF-8

Källa: http://groups.yahoo.com/group/unicode/message/9406

281 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
134 ms — deklarationer (db)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)
153 ms — ändringar (db)