Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z kompilacją do release

Ostatnio zmodyfikowano 2014-03-01 12:44
Autor Wiadomość
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:

C/C++
baloon ** baloniki = new baloon *[ 9999 ];

Oraz napisałem funkcje odpowiadające "spawnowaniu", renderowaniu i usuwaniu baloników:

C/C++
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.
P-105368
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.
P-105370
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).
P-105400
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.
P-105407
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:
C/C++
baloon ** baloniki = new baloon *[ 9999 ];
baloniki[ 0 ] = new baloon;
delete baloniki[ 0 ];

jest poprawny?
P-105437
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ć.
P-105439
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:

C/C++
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:
C/C++
iter->render( oknoAplikacji );

EDIT v.2
I kompilacja do release wreszcie jest dobra :D Program działa idealnie. Dziękuję za pomoc ;)
P-105440
« 1 »
  Strona 1 z 1