Pitäisi numero saada stringiksi ja kun ohjelma sitä yrittää, tulee virheilmoitus:
____
Microsoft Visual C++ Runtime Library
Runtime Error!
Program:blahblah
abnormal program termination
____
Ja tässä koodi, jolla yritän saada numeron stringiksi koska itoa ei hyväksy stringiä:
SDL_Surface* autonumber (SDL_Surface* scr,int x,int y,int number,int system,int color,int size) { string temp; if (system>16){system=16;} while (number!=0) { switch(number%system) { case 1: temp+="1"; case 2: temp+="2"; case 3: temp+="3"; case 4: temp+="4"; case 5: temp+="5"; case 6: temp+="6"; case 7: temp+="7"; case 8: temp+="8"; case 9: temp+="9"; case 10: temp+="a"; case 11: temp+="b"; case 12: temp+="c"; case 13: temp+="d"; case 14: temp+="e"; case 15: temp+="f"; } number=int(number/system); } int tempp; tempp=temp.length(); int xxx; string temp2; for(xxx=tempp; xxx>0; xxx++) { temp2+=temp.at(xxx); } scr=autotext(scr,x,y,color,temp2,size); return scr; }
Kaikki muuttujat on alustettu ja funktiot (paitsi k.o.) toimivat. Nopeasti kun ajattelin, tuon pitäisi toimia, ainakin matemaattisesti. Number on luku,joka pitäisi lähettää eteenpäin ja system on lukujärjestelmä (en ole varma sanasta, mutta esim. desimaali ja heksadesimaali ovat niitä). Niiden pohjalta ohjelman pitäisi laskea viimeinen desimaali, pienentää lukua, laskea seuraava jne. Sen tuloksena luku on väärinpäin, joten se pitää kääntää temp2-stringiin.
Mikä on pielessä?
tempp = temp.length(); for (xxx = tempp; xxx > 0; xxx++)
Tekstissä temp on kohdat 0 – temp.length()-1. Silmukkasi alkaa kohdasta näiden jälkeen ja silmukan muuttuja suurenee. Auttaisiko aloittaa yhden alempaa ja pienentää muuttujaa?
Ihan hyvä idea. Kiitos!
Vähän vielä piti koodia viilailla mutta nyt toimii.
Huomasit varmaan myös, että koodisi ei tuollaisenaan tulosta nollia lainkaan, eli esimerkiksi luku 102 muuttuukin luvuksi 12. Sitten voit vielä hyödyntää faktaa, että numerot 0-9 ja vastaavasti kirjaimet a-f ovat peräkkäin, jolloin uuden merkin lisääminen käy paljon lyhyemmin:
if (numero < 10) { // 0 - 9 teksti += '0' + numero; // Huom. merkki '0' eikä teksti "0". } else { teksti += 'a' + (numero - 10); // (10 => 'a'), (11 => 'a' + 1 = 'b'), ... }
Nollan ehdin jo lisätä :)
Alunperin ajatukseni olivat sen verran sekaisin, etä jätin nollan pois, koska lopussahan on aina jäljellä nolla...ajattelin että se tulostaisi ruudun täyteen nollia varsinaisen luvun loputtua. Nyt se toimii mielestäni täydellisesti vaikka en ymmärräkään enää miten se toimii :)
Korjaanpa vielä sitä koodia ehdotuksesi mukaisesti.
Nyt kun luin alkuperäisen viestin ihan alusta asti, niin ongelmasihan oli se, ettei itoa hyväksy string-tyyppiä... Mikset käyttäisi välissä puskurimuuttujaa?
char puskuri[17]; itoa(luku, puskuri, kantaluku); teksti = puskuri;
Vaikka ovathan ne omatkin funktiot aina kivoja, varsinkin tuossa, kun itoa
ei varsinaisesti kuulu C:n standardiin. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.