Kan du inte använda dig av klassen string istället?
new_item (menu) tar inte åäö
24 svar · 663 visningar · startad av Gein
Hur skulle det se ut då?
Jag är inte så värst erfaren c-programmerare.
#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.
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?
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
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.
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;
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.
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.
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.
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
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 ;)
Patrik lugnar ner sej och blir finare.
Google -> "ncurses svenska tecken"
Jag återkommer!
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.
Förmodligen kom lösningen här ovan eftersom det hela handlar om tolkningen av värdet på char :)
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.
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?
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.
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
