Miten otsikkoriville (siis sille jossa näkyy ohjelman nimi ja ruksi josta ohjelma suljetaan) saisi esimerkiksi pelin pisteet jotka päivittyvät. Käytän C(++)aa ja SDLää.
SDL_WM_SetCaption("Moi", NULL);
Kääntäjä rupeaa valittamaan jos laittaa esimerkiksi:
SDL_WM_SetCaption("Pisteet: \d", pisteet, NULL);
Andu kirjoitti:
Kääntäjä rupeaa valittamaan jos laittaa esimerkiksi:
SDL_WM_SetCaption("Pisteet: \d", pisteet, NULL);
Tietenkin, koska funktio ottaa parametreiksi vain tekstin ja kuvakkeen.
EDIT: Muuttujan yhdistäminen char-tauluun on käsiteltynä putkan C-oppaassa. Lukaise sieltä standardikirjastoista kertova osa.
Käytä sprintf-funktiota, kuvaus löytyy vaikka täältä: http://www.cplusplus.com/ref/cstdio/sprintf.html
Sprintf on kuin printf, mutta sen ensimmäinen parametri on osoitin merkkitaulukkoon. (Ja se ei tulosta mitään näytölle)
Laitetaan nyt vaikka esimerkkiä:
char bufferi[50]; int muuttuja = 5; char merkki = 'a'; sprintf(bufferi, "numero on %i ja merkki on %c", muuttuja, merkki);
Stringstreamilla säästyy ylivuotovaaralta.
SDL_WM_SetCaption(((ostringstream&)(ostringstream("Sinulla on jo ", ios::app) << pisteet << " pojoa.")).str().c_str(), NULL);
Vastaava kauniimmin:
ostringstream ost; ost << "Sinulla on jo " << pisteet << " pojoa."; SDL_WM_SetCaption(ost.str().c_str(), NULL);
Megant kirjoitti:
Käytä sprintf-funktiota
Älä käytä.
man 3 printf kirjoitti:
BUGS
Because sprintf() and vsprintf() assume an arbitrarily long string,
callers must be careful not to overflow the actual space; this is often
impossible to assure. Note that the length of the strings produced is
locale-dependent and difficult to predict. Use snprintf() and
vsnprintf() instead (or asprintf() and vasprintf).
Pitääkö tuossa:
ostringstream ost;
ost << "Sinulla on jo " << pisteet << " pojoa.";
SDL_WM_SetCaption(ost.str().c_str(), NULL);
tai tuossa:
SDL_WM_SetCaption(((ostringstream&)
laittaa niihin includeihin joku? En tiedä paljoa C++an includeista, koska olen ohjelmoinut enimmäkseen Cllä.
#include <sstream>
sieltä tulee.
Tuon käyttöön pitää myös includeta iostream ja ottaa käyttöön tuo ostringstream.
eli kokonaisuudessaan koodin alkuun:
#include <iostream> #include <sstream> using::ostringstream;
zorm, mitä kummaa? Eihän tuo "using::ostringstream;" edes mene kääntäjästä läpi, ja mihin iostreamia muka tarvitaan?
#include <sstream> using std::ostringstream;
Kiitoksia avusta.
Oho... meni aivot vähän sekaisin kun tuota viestiä kirjoittelin mutta tuota sinun antamaa korjausta kuitenkin tarkoitin. :)
Edit: siis eikö std -nimiavaruuden osien käyttämiseen tarvitsekkaan includea iostreamia? Minä ainakin olen elänyt siinä harhaluulossa mutta hyvä kun sekin tuli korjattua. :)
zorm: nimiavaruudet ovat avoimia, joten niitä voi esitellä useassa headerissa. Muuten tuo std-nimiavaruus olisi mahdoton toteuttaa nykyisessä muodossaan (jaettuna useaan moduuliin).
Ok! Kiitos tuosta tiedosta, Grusifix. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.