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ää...
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.
Kiitän ja kumarran. Se oli sittenkin noin helppoa... no, tiedän sitten tämänkin tästä lähtien.
Aihe on jo aika vanha, joten et voi enää vastata siihen.