Pystyykö muistia jotenkin varaamaan ajonaikana ilman new/deleteä? On vaikka tällainen luokka:
class luokka { public: funktio(); toinen_funktio(); private: ITexture *textuuri; //<- irrlichtin luokka }
Tuota ITexturea kutsutaan näin: driver->getTexture("tiedostonimi.bmp");
Nyt ongelmana on miten varata tuo muisti luokan sisällä ilman että ohjelma kaatuu.
E: koitan muuttaa pong kloonini käyttämään luokkia.
Ensimmäiseen kysymykseesi vastauksena, että onnistuu esim. tiedostossa <cstdlib> esitellyllä malloc-funktiolla (jonka jälkeen muisti on vapautettava free-funktiolla).
Tämä tuskin kuitenkaan korjaa ongelmiasia, koska normaalisti new:n tai deleten käytönkään ei pitäisi kaataa ohjelmaa (sillä, sijaitseeko koodi luokan sisällä vai jossain muualla ei pitäisi olla mitään vaikutusta).
Mitä tarkalleen ottaen yrität tehdä, kun ohjelma kaatuu? Virheen löytämistä helpottaisi, jos pystyt tuottamaan mahdollisimman yksinkertaisen käännettävän koodin, joka ei toimi kuten olettaisit.
Mikä niiss new ja delete systeemeiss on vikana?
Luulisin ett menee näin toi varaaminen.
class luokka { public: funktio(); toinen_funktio(); luokka(){textuuri = new ITexture;}; ~luokka(){delete textuuri;}; private: ITexture *textuuri; //<- irrlichtin luokka }
tosi en välttämättä ymmärätänyt, ett mikä toss oli ongelmana...
Edit: tai sitten voi tehdä tiedostossa näin(luulisin ett toimii en oo koittanut!!)
class luokka { public: funktio(); toinen_funktio(); void varaa_muisti(){this->textuuri = new ITexture;}; void vapauta_muisti(){this->delete textuuri;}; private: ITexture *textuuri; //<- irrlichtin luokka }
koodi poistettu. Ok koitan laittaa muodostajaan.
Irrlicht varaa ja vapauttaa muistin itse. IVideoDriver::getTexture("kuva.png") palauttaa osoittimen valmiiksi varattuun, kyseisestä kuvasta ladattuun tekstuuriin, ja kun tiedät, ettei kyseistä tekstuuria enää tarvita, voit vapauttaa sen metodilla IVideoDriver::removeTexture(texture). Kaikki tarvittavat new
- ja delete
-rivit ovat Irrlichtin koodissa.
Irrlicht on kaikeksi onneksi koodattu näppärästi abstrakteilla rajapinnoilla, joten new
ei toimi etkä siis voi varata muistia tällä tavalla väärin. (Suurempi hyöty abstrakteista rajapinnoista on tietenkin siinä, että OpenGL-, Direct3D- ja muut versiot moottorista voivat toimia näennäisesti samojen luokkien avulla, vaikka todellisuudessa näillä on omat luokkansa, esimerkiksi ITexture-luokasta periytetty COpenGLTexture OpenGL-versiota varten.)
Vai oliko ongelmasi getTexture-rivin sijoittaminen ohjelmassa? Luokan muodostin on sille oikea paikka, kuten vehkis91 ehdotti.
Edit: No laitoit sitten sitä koodia. Yksi selkeä virhe on tässä:
BojoingEventReceiver rv(context); device->setEventReceiver(&rv);
Luot väliaikaisen objektin rv, joka tuhotaan heti funktion lopussa. Siispä ohjelma kaatuu heti, kun viestejä yritetään syöttää tälle oliolle, jota ei enää ole.
Jos tämäkään ei ratkaise ongelmaa, laita vielä se, miten tuo Game luodaan ja missä kaatuvaa funktiota kutsutaan.
En tullut tuota huomanneeksi, koitan nyt vähän korjailla koodia jos ois jo illemmalla toimivaa ^^
EDIT: nyt toimii kiitos metabolixille ja muille!
Aihe on jo aika vanha, joten et voi enää vastata siihen.