Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Pdcurses ja virheet (C++)

Sivun loppuun

Aruviel [07.10.2004 10:19:43]

#

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)?

Metabolix [07.10.2004 13:49:50]

#

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:

  1. Lisää lähdekoodin alkuun jonnekin includen jälkeen rivi:
    #undef erase
  2. Luovu string-luokan käytöstä. Usein ilmankin sitä tulee aivan hyvin toimeen.

Aruviel [07.10.2004 14:41:34]

#

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.

Aruviel [07.10.2004 18:45:44]

#

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.

Metabolix [07.10.2004 18:55:57]

#

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

Aruviel [07.10.2004 20:09:11]

#

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 ;).

Metabolix [07.10.2004 21:15:02]

#

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;

Aruviel [08.10.2004 15:04:56]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta