Tässä on pallopelistäni tarvittavat pätkät koodia.Voisitteko vilkaista mikä muistinhallinnassa mättää?Kone ei kaadu XP:llä eikä läppärini win7:lla mutta kaverini win7:lla kaatuu.
class TOP12 { private: char ONAMES[8][12]; char MNAMES[8][12]; long OSCORE[12]; long MSCORE[12]; short OLEVEL[12]; short MLEVEL[12]; short OSIDE[12]; short MSIDE[12]; bool OCOMPLETE[12]; bool MCOMPLETE[12]; public: void MakeDefaults(void); char * GetOName(short sija) {return ONAMES[sija];} void SetOName(short sija,const char *a) {strcpy(ONAMES[sija],a);} char * GetMName(short sija) {return MNAMES[sija];} void SetMName(short sija,const char *a) {strcpy(MNAMES[sija],a);} void SetOScore(short sija,long a) {OSCORE[sija]=a;} void SetMScore(short sija,long a) {MSCORE[sija]=a;} void SetOLevel(short sija,short a) {OLEVEL[sija]=a;} void SetMLevel(short sija,short a) {MLEVEL[sija]=a;} void SetOSide(short sija,short a) {OSIDE[sija]=a;} void SetMSide(short sija,short a) {MSIDE[sija]=a;} void SetOComplete(short sija,bool a) {OCOMPLETE[sija]=a;} void SetMComplete(short sija,bool a) {MCOMPLETE[sija]=a;} long GetOScore(short sija) {return OSCORE[sija];} long GetMScore(short sija) {return MSCORE[sija];} short GetOLevel(short sija) {return OLEVEL[sija];} short GetMLevel(short sija) {return MLEVEL[sija];} short GetOSide(short sija) {return OSIDE[sija];} short GetMSide(short sija) {return MSIDE[sija];} bool GetOComplete(short sija) {return OCOMPLETE[sija];} bool GetMComplete(short sija) {return MCOMPLETE[sija];} }; void TOP12::MakeDefaults(void) { for (short t=0;t<12;t++) { strcpy(ONAMES[t],"NO ONE "); strcpy(MNAMES[t],"NO ONE "); OSCORE[t]=15000-t*1000; MSCORE[t]=15000-t*1000; OLEVEL[t]=3; MLEVEL[t]=3; OSIDE[t]=0; MSIDE[t]=0; OCOMPLETE[t]=false; MCOMPLETE[t]=false; } } TOP12 *top12=new TOP12; int main (int argc, char *argv[]) { AlustaSDL(); InitGraph(); Randomize(); InitGlobals(); Optimoi(); g_TimerID=SDL_AddTimer(1000,FOSDL_TimerCallback,NULL); if (Mix_OpenAudio(44100, AUDIO_S16SYS, 2, 4096) < 0) {Reset();exit(0);} if (Mix_AllocateChannels(64)==false) {Reset();exit(0);} click=Mix_LoadWAV("snd\\click.wav"); SetVolume(); top12->MakeDefaults(); SDL_initFramerate(&fpsm); SDL_setFramerate(&fpsm,50); Game=AlkuParkki; AlkuParkki(true); Reset(); return 0; } char HighScores(bool opt) { SDL_Rect rect; Uint32 color; Ohjaus(0); while(MOUL+MOUR==0) { Ohjaus(0); rect.x=0; rect.y=0; rect.h=600; rect.w=800; color = SDL_MapRGB (screen->format, 100, 100,100); SDL_FillRect (screen, &rect, color); DrawTable(OriginalMyGame); DrawMouse(MOUX,MOUY); SDL_Flip(screen); SDL_framerateDelay(&fpsm); } while(MOUL+MOUR>0) Ohjaus(0); Mix_PlayChannel(-1,click,0); Game=AlkuParkki; return 1; } void DrawTable(bool orormy) { short ay=60,ax; char minne; ax=CountTextPos("1st 1234567 SCORE 0000000 LEVEL 000 "); short overnine=0; for (short t=0;t<12;t++) { if (t>8) overnine=21; char *riimu=new char[50]; DrawText(ax-overnine,ay,MakeHighScoreString(t+1,top12->GetOName(t),top12->GetOScore(t),top12->GetOLevel(t),riimu),0); ay+=40; delete riimu; } } char * MakeHighScoreString(short pos,const char * who,long score,short lev,char *back) { char numero[10],nimi[12],apu[20]; switch(pos) { case 1:strcpy(back,"1ST ");break; case 2:strcpy(back,"2ND ");break; case 3:strcpy(back,"3RD ");break; case 4:strcpy(back,"4TH ");break; case 5:strcpy(back,"5TH ");break; case 6:strcpy(back,"6TH ");break; case 7:strcpy(back,"7TH ");break; case 8:strcpy(back,"8TH ");break; case 9:strcpy(back,"9TH ");break; case 10:strcpy(back,"10TH ");break; case 11:strcpy(back,"11TH ");break; case 12:strcpy(back,"12TH ");break; } strcat(back,who); strcat(back," SCORE "); sprintf(numero,"%0000006ld",score); strcpy(apu,numero); strcat(back,apu); strcat(back," LEVEL "); sprintf(numero,"%002hd",lev); strcat(back,numero); return back; } void ResetSounds(void) { Mix_FreeChunk(click); Mix_CloseAudio(); } void Reset(void) { SDL_FreeSurface(O_UpPalkki); SDL_FreeSurface(O_LeftPalkki); SDL_FreeSurface(O_RightPalkki); SDL_FreeSurface(O_Ball); SDL_RemoveTimer(g_TimerID); delete top12; ResetSounds(); SDL_Delay(5000); SDL_Quit(); }
Koodisi on niin käsittämättömän sotkuista, ettei sitä viitsi örkkikään lukea. Sisentäisit edes kunnolla, varmaan oppisit pian itsekin arvostamaan siisteyttä. Lisäksi kun olet laittanut vain osan koodista, on mahdotonta testata tai katsoa esim. kääntäjän varoituksia. Joudut siis tekemään senkin itse: laita kääntäjästä kaikki mahdolliset virheet ja varoitukset käyttöön (GCC:llä -Wall -Wextra -pedantic -O2) ja korjaa joka ainoa kohta.
Nopealla vilkaisulla huomasin kuitenkin, että ONAMES ja MNAMES ovat liian pieniä, vain 8 alkiota, vaikka silmukassa yrität käyttää 12:ta. Ehkä olet laittanut indeksit väärin päin.
Ja vuosikymmenien käytäntö on että vain makrot kirjoitetaan KOKONAAN_ISOLLA.
Tulee pää kipeäksi kun lukee class TOP12, char ONAMES, char MNAMES etc. ja miettii (vähintään alitajuisesti) että ei kai ne saatana ole makroja?
Kiitos taas avusta....ONAMES ja MNAMES jotka nyt eivät olleet saatanan makroja vaan ihan TOP12 luokan privaattijäseniä oli indeksoitu tosiaankin väärin päin...
Kysyisin kuitenkin vielä että kun varaan tuossa yhdessä kohtaa näin,
char *riimu=new char[50];
että onko oikea tapa vapauttaa
delete riimu;
vai
delete [] riimu;
?
https://www.ohjelmointiputka.net/oppaat/opas.
Ohoh! Aikamoinen löytö! Plussaa oma-aloitteisuudesta..
kiitti jimi-kimi.10 pistettä ja papukaijamerkki....:)
DumTom kirjoitti:
Kiitos taas avusta....ONAMES ja MNAMES jotka nyt eivät olleet saatanan makroja vaan ihan TOP12 luokan privaattijäseniä oli indeksoitu tosiaankin väärin päin...
On enemmän kuin konsensus että _vain_ makrot kirjoitetaan KAIKKI_ISOLLA. Äläkä muuten heiluttele privaattijäsentäsi julkisella paikalla.
DumTom kirjoitti:
että onko oikea tapa vapauttaa
Yritäpä ottaa selvää ihan itse.
(ja tämä ei ollut mitään vittuilua vaan pitää nyt tuollainen nykyisenä IntherWebsin aikana olla helposti selvitettävissä.)
Esimerkiksi Linuxin kernelissä käytetään isoilla kirjoitettuja nimiä luetelmatyypeissä, eli enum-sanan avulla määritellyissä vakioissa.
Pekka Karjalainen kirjoitti:
Esimerkiksi Linuxin kernelissä käytetään isoilla kirjoitettuja nimiä luetelmatyypeissä, eli enum-sanan avulla määritellyissä vakioissa.
Joo, totta - unohdin tuon. Vakioita määritellään usein myös makrona ja koska enum-määrittelyt ovat vakioita niin logiikka sentään säilyy.
Onneksi et kertonut että Linux-kernelissä käytetään myös globaaleja muuttujia, siinä vasta olisikin selittämistä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.