Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: sscanf() ei toimi luettaessa kokonaislukua

sqwiik [25.09.2005 10:15:09]

#

Törmäsin tässä RB:tä koodatessani mystisen oloiseen virheeseen sscanf:ia käyttäessäni. Koodinpätkä, joka lukee tekstilaatikon parametrit, lakkasi toimimasta uudelleenkirjoitettuani enginen (joka taas ei vaikuta tähän koodinpätkään millään tavalla). Koodi on tämän näköinen:

/* Sint16 = signed short int */
Sint16 mr = -1, ml = -1;
/* Tiedoksi: tämä lukee tiedostosta yhden sanan tai parametrilausekkeen. */
ReadWord(f, msg);
sscanf(msg, "%i, %i", &mr, &ml);
if(mr < 1 || ml < 1)return RB_ERROR;

Eli tuo koodinpätkä on toiminut tähän asti kuten sen kuuluukin. Mutta nyt sscanf ei enää lue lukuja normaalisti. Olen tulostellut koodista väliarvoja, ja huomasin että suorittaessa tapahtui jotain outoa; Esim. kun msg oli "20, 50", mr sai arvon 0 ja ml 50 (kuten sen kuuluikin...). Eli tietääkö kukaan miten voisin oikaista tämän ongelman?
Toistan vielä, että ko. koodinpätkä toimi täysin vielä viikko sitten.

Muoks: debuggasin lisää, ja huomasin että myös seuraava koodi antaa arvot mr=0, ml=50:

sscanf("20, 50", "%i, %i", &mr, &mr);

Eli toisin sanoen jossain on häikkää...

Metabolix [25.09.2005 13:52:43]

#

No tuossa jälkimmäisessäsi ainakin taitaa olla typo, mutta varmaankin testasit sen kuitenkin oikein kirjoitettuna :)

32-bittinen kääntäjä olettaa, että luku on 32-bittinen, mutta annat osoittimia 16-bittisiin. Siksi jälkimmäiseen kirjoittaessa ensimmäiseen tulee nolla. (Kieroutunut muistijärjestys muuten...) Short int on %hi, ja long int %li. Pelkkä %i on pelkkä int, mitä se sitten milloinkin tarkoittaa.

sqwiik [25.09.2005 14:12:07]

#

Kiitän ja kumarran. Se oli sittenkin noin helppoa... no, tiedän sitten tämänkin tästä lähtien.

Vastaus

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

Tietoa sivustosta