Otsikko saattaa olla hämäävä, mutta eiköhän tämä teksti selvennä sitä.
SDL:ssä ikkuna alustetaan komennolla SDL_SetVideoMode(w, h, d, f), jossa w on leveys, h korkeus, d bittisyvyys ja f flagit (SDL_DOUBLEBUF, SDL_FULLSCREEN ...). Onko mahdollista toteuttaa alla oleva koodi helpommin?
int fullscreen = 1; if (fullscreen) naytto = SDL_SetVideoMode(w, h, d, SDL_SWSURFACE|SDL_FULLSCREEN); else naytto = SDL_SetVideoMode(w, h, d, SDL_SWSURFACE);
Kokoruututilan asettamista varten tuo saattaa olla oiva keino, mutta jos flageja pitäisi kasata enemmän ja niistä päättäisi suurempi määrä muuttujia, niin if-lausekkeet eivät todennäköisesti olisi mielekkäin vaihtoehto, vai?
Kerää flagit yhteen muuttujaan ja lopuksi anna tuo muuttuja SDL_SetVideoModelle.
int flags = SDL_SWSURFACE; if(fullscreen) flags |= SDL_FULLSCREEN; naytto = SDL_SetVideoMode(w, h, d, flags);
Yksi mahdollisuus on myös käyttää ?:-operaattoria, tai jos haluaa heittäytyä kryptiseksi, niin kyllä kertolaskukin toimii, kunhan fullscreen-muuttujassa todella on nolla tai ykkönen.
SDL_SWSURFACE | (fullscreen ? SDL_FULLSCREEN : 0); SDL_SWSURFACE | (fullscreen * SDL_FULLSCREEN);
Selkeyden vuoksi suosittelen ensisijaisesti tuota Blazen ratkaisua. Oikea tyyppi lipuille on kylläkin Uint32.
Kysymyksessä oli että mitä jos flageja pitäisi kasata enemmänkin. Tällöin ? ja * eivät ole kovinkaan hyviä vaihtoehtoja. Mielestäni paras tapa on juuri tuo Blazen esittämä lippumuuttuja, kunhan sen tyypin korjaa oikeaksi. Jos konffattavaa tulee paljonkin niin, voit tehdä flagien kasaamiseen oman funktionsa. Tällöin voit pitää asetukset yhdessä tietueessa, taulukossa tai missä tahansa parhaaksi näkemässäsi tietorakenteessa ja muodostaa liput sieltä. Tietysti pikkaisen enemmän työtä kuin if-elsessä, mutta on selkeämpää ja ylläpidettävämpää.
Jos konffattavaa ei ole enempää kuin tuo fullscreen, niin mikä tahansa jo mainituista keinoista kelpaa aivan yhtä hyvin.
Torgo kirjoitti:
Kysymyksessä oli että mitä jos flageja pitäisi kasata enemmänkin. Tällöin ? ja * eivät ole kovinkaan hyviä vaihtoehtoja.
Jos lippuja tarvitaan vain yhden kerran, koodin saa jäsenneltyä selkeästi näilläkin, joten en pidä vaihtoehtoa mitenkään kohtuuttoman huonona:
naytto = SDL_SetVideoMode(w, h, d, 0 | (fullscreen ? SDL_FULLSCREEN : 0) | (hw_surface ? SDL_HWSURFACE : 0) | (resizable ? SDL_RESIZABLE : 0) );
Aihe on jo aika vanha, joten et voi enää vastata siihen.