Problem z kompilacją do release
Ostatnio zmodyfikowano 2014-03-01 12:44
kokon Temat założony przez niniejszego użytkownika |
Problem z kompilacją do release » 2014-02-27 21:39:38 Witam, ostatnio napisałem sobie na szybko krótką grę, z klasą o nazwie baloon. No i wykorzystałem tablicę wskaźników: baloon ** baloniki = new baloon *[ 9999 ];
Oraz napisałem funkcje odpowiadające "spawnowaniu", renderowaniu i usuwaniu baloników: void startlevel( short ile ) { for( int i = 0; i < ile; i++ ) { baloniki[ i ] = new baloon; baloniki[ i ]->spawn(); }; sprintf( tekst, "Poziom: %u", lvl ); lvltext.setString( tekst ); };
void renderlevel( short ile, sf::RenderWindow * oknoAplikacji ) { for( int i = 0; i < ile; i++ ) { baloniki[ i ]->render( oknoAplikacji ); }; }
void konieclevel( short ile ) { for( int i = 0; i < ile; i++ ) { delete baloniki[ i ]; }; };
bool sprawdzlevel( short ile ) { for( int i = 0; i < ile; i++ ) { if( baloniki[ i ]->destroed == false ) return false; }; return true; };
I wszystko działa, jednak tylko w trybie debug. Kiedy kompiluję do release, to zawsze dodaje się tylko jeden balon (co poziom ilość zwiększa się o 1), i myślę że tu gdzieś tkwi problem. Jeśli będzie potrzeba więcej kodu to mogę udostępnić (nawet cały) ponieważ to była taka wieczorna dłubaninka :P A, dodam jeszcze że używam code::blocks. |
|
michal11 |
odp » 2014-02-27 22:06:45 Nie ma (chyba) możliwości aby ten sam kod działał inaczej w wersji debug i relese. Sprawdź czy masz takie same ustawienia dla obydwu metod kompilacji. Sprawdź na innym kompilatorze czy będzie to samo. |
|
domin568 |
» 2014-02-28 15:01:17 Oczywiście że mogą się różnić, tryb release najprościej mówiąc jest bardziej rygorystyczny, w trybie debug są dodatkowe "narzędzia" które optymalizują kod ( bez twojej ingerencji). |
|
DejaVu |
» 2014-02-28 15:41:49 @up: optymalizacje są stosowane w trybie release, a nie w trybie debug (choć też da się je włączyć), ale np. wskaźniki mogą być (i zazwyczaj są) zainicjalizowane inną początkową wartością domyślną niż w trybie Release. |
|
kokon Temat założony przez niniejszego użytkownika |
» 2014-03-01 10:23:30 Ale ten sposób utworzenia tablicy wskaźników i takie usuwanie: baloon ** baloniki = new baloon *[ 9999 ]; baloniki[ 0 ] = new baloon; delete baloniki[ 0 ]; jest poprawny? |
|
DejaVu |
» 2014-03-01 12:05:03 Tak, ale na Twoim miejscu użyłbym std::list<baloon>. Nie musisz wtedy się przejmować dynamiczną alokacją pamięci, listę i tak zawsze od pierwszego do ostatniego elementu przeglądasz i nie wykonują się żadne zbędne konstruktory kopiujące. Czytaj: kod prostszy, trudniej popełnić błąd i łatwiej ewentualny błąd wykryć. |
|
kokon Temat założony przez niniejszego użytkownika |
» 2014-03-01 12:44:51 To mam jeszcze pytanie o std::list, ponieważ nie wiem jak się odwołać do funkcji klasy w takim przypadku: void renderlevel( short ile, sf::RenderWindow * oknoAplikacji ) { for( int i = 0; i < ile; i++ ) { for( std::list < baloon >::iterator iter = lista.begin(); iter != lista.end(); ++iter ) { * iter->render( oknoAplikacji ); }; }; };
To mi wywala błąd In function 'void renderlevel(short int, sf::RenderWindow*)': |139|error: void value not ignored as it ought to be
EDIT Ok, już wiem co było źle, powinno być tak: iter->render( oknoAplikacji );
EDIT v.2 I kompilacja do release wreszcie jest dobra :D Program działa idealnie. Dziękuję za pomoc ;) |
|
« 1 » |