Eli c++:lla olen taas liikkeessä. Olen tässä yrittänyt kääntää Windowsille (Dev-Cpp, oletettavasti MingW, GCC 3.3.1) erästä ohjelmaa, joka nyt vielä lisäksi käyttää Pdcursesia. Koko komeus kääntyy hyvin Linuxissa (en muista kääntäjän versiota, taitaa olla GCC 3.3.4. Käytössä ncurses), ja muistaakseni kääntyi hyvin myös vähän uudemmilla/vanhemmilla versioilla.
Ongelmana on se, että kääntäjä iskee minulle ihan selittämättömiä virheilmoituksia. Esimerkiksi string-luokista heittää tällaisen virheen:
string messagebuffer; string feelings; // expected unqualified-id before '(' token messagebuffer.clear(); feelings.erase();
Jossain taas on määritelty erase makro (öhm?) ja saa kääntäjän vinkumaan kyyneliä kun yrittän käyttää string-luokan metodia erase.
string jono; // macro "erase" passed 2 arguments, but takes just 0 // statement cannot resolve address of overloaded function jono.erase(0,i);
Ei, en ole itse #definellä määritellyt mitään erase-makroja. En nyt tiedä mitä tähän lisäisi. Voisiko ongelman ydin sijaita Pdcursesissa, tämä kun näyttäisi sisältävän ainakin erase() funktion (tai kenties makron)?
Viimeiseen kysymykseesi löydät vastauksen tekemällä tyhjän projektin, johon lisäät PDCurses-kirjaston. Sitten vain teet pienen ohjelman, jossa käytät tuota string.erase()-funktiota.
Keksin näin suoralta kädeltä kaksi ratkaisumallia:
#undef erase
Kiitoksia vinkistä, sain homman toimimaan. #undef clear ja #undef erase auttoivat ongelmassa. Ja se jopa kääntyi ja toimii, tosin komentoriville "piirtäminen" on Windowsissa tuskallisen hidasta ;). Optimointia tarvitaan.
Noniin, heitänpä vielä perään toisen kysymyksen. Tämä koskee näppäimistön lukua getch() funktiolla. Ainakaan minun silmissäni tämä ei toimi kunnolla Windowsin alla.
Eli, esimerkiksi num_pad 1:n ASCII-arvo on 49. Mutta getch() ei palautakaan aina tätä arvoa num_pad 1:tä painettaessa. Paljon useammin täältä tulee arvo 58929. Vaiva on tuskastuttavan suuri. Kenelläkään kokemusta/ideoita miten tästä pääsisi eroon?
Lisäksi tuskastuttaa windowsin komentokehoite. Eikö tuota tosiaankaan saa isommaksi venytettyä siten, että fonttikin pysyisi "defaulttina". Linuxia käyttäneet tietävät, mitä tarkoitan.
getch() palauttaa erikoisnäppäimet kahteva tavuna. Ensimmäinen on 0xE6 tai 0x00 ja jälkimmäinen itse näppäinkoodi, tuossa tapauksessa 0x31 eli 49. Ongelmasi siis selviää näin (oletetaan, että Key on arvo, jonka sait getch()-funktiolta):
if (Key >> 8 == 0xE6 || Key >> 8 == 0x00) Key >>= 8;
Tuossa siis siirretään Keyn arvoa tavun verran jos kyseessä on erikoisnäppäin.
Tässä itse kysymykseen: http://support.microsoft.com/default.aspx?scid=kb;en-us;57888
Ja tässä toinen huomion arvoinen asia: http://support.microsoft.com/default.aspx?scid=kb;en-us;196900
Suurkiitokset, nyt sekin sitten skulaa. Olen kuitenkin sen verran nyhvömpi, ja päädyin tällaiseen ratkaisuun:
if(Key >> 8 == 0xE6 || Key >> 8 == 0x00) Key-=58880;
Riittää minulle, että homma toimii, ainakin toivoakseni ;).
Tuossa on se ongelma, että jos törmäät tilanteeseen, jossa se 1. tavu on 0x00, lopulliseksi näppäimeksi tulee -58839, joten tuolla tavalla koodin pitäisi olla:
if(Key >> 8 == 0xE6) Key -= 58880;
Itse asiassa keksin jo paremman vaihtoehdon. Otetaan suoraan vain ylimääräinen tavu pois.
Key &= 0xff;
Juups, näin on. Uskoin tuon toimivan siksi, että en käytännössä kertaakaan törmännyt tavuun 0x00, vain tuohon 0xE6. Koneen uudelleenkäynnistys muutti sitten taas jotain, ja sain pelkkää 0x00-tavua.
Aihe on jo aika vanha, joten et voi enää vastata siihen.