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

Microsoft Visual C++ Runtime Library - wysypywanie sie programu

Ostatnio zmodyfikowano 2009-05-05 22:37
Autor Wiadomość
Patzick
Temat założony przez niniejszego użytkownika
Microsoft Visual C++ Runtime Library - wysypywanie sie programu
» 2009-05-05 20:40:04
A miało być tak pięknie... :)
Stworzyłem sobie opcję wczytywania obiektów które są w pewnej odległości od mego ludka i sprawdzam na nich kolizje, jeśli będą dalej to idą do obiektów nieaktywnych i czekają sobie i liczenie kolizji ich nie obejmuje, lecz jest problem :/ wyskakuje mi powiadomienie z tytułem jak w temacie postu i treścią:
This application has requested to terminate it in an unusual way.
Please contact the application's support team for more information.
Po czym program się zamyka :(
Nie wiem czy kod jest potrzebny bo może wiecie co nie tak, ale dodam że jak włączę i przejdę kawałek to dopiero się wysypuje. Tak dziwnie bo jak dojdę do pierwszego obiektu to kolizja normalnie działa czyli funkcja napisana przeze mnie musi spełniać swoją rolę no ale właśnie co jest nie tak?
P-6546
DejaVu
» 2009-05-05 20:47:49
To nie jest kwestia visual'a tylko błędu w kodzie. Gdzieś piszesz po pamięci. Skoro używasz visual'a, wybierz rodzaj konfiguracji Debug, użyj magicznego klawisza F5 i wykonaj w aplikacji ten magiczny ruch, który wysypuje Ci aplikację. W Visualu pojawi sie taka żółta strzałeczka po lewej. Następnie z menu opcji uruchom sobie okienko callstack i zobacz sobie w którym miejscu Twojego kodu program Ci się wysypał.

W Visual'u namierzanie takich błędów jest banalne w porównaniu do innych środowisk :)
P-6547
Patzick
Temat założony przez niniejszego użytkownika
» 2009-05-05 21:59:06
A tu cały myk, że ja Devem kompilowałem :)
skoro coś nie tak z kodem to podaję to co trzeba:
C/C++
class CstaticObiekt
{
public:
    int x, y, szer, dl;
    CstaticObiekt( int xp, int yp, int szp, int dlp );
    int getX( void );
    int getY( void );
    int getS( void );
    int getW( void );
};
CstaticObiekt::CstaticObiekt( int xp, int yp, int szp, int dlp )
    : x( xp )
    , y( yp )
    , szer( szp )
    , dl( dlp )
{ }

int CstaticObiekt::getX() { return x; };
int CstaticObiekt::getY() { return y; };
int CstaticObiekt::getS() { return szer; };
int CstaticObiekt::getW() { return dl; };

vector < CstaticObiekt > Sobiekt;
vector < CstaticObiekt > Aobiekt; //wektory na aktywne i nieaktywne obiekty

// jeszcze zdefiniowane funkcje
void GetStaticObiects() {
    Sobiekt.push_back( CstaticObiekt( 8, 10, 1, 0 ) );
    Sobiekt.push_back( CstaticObiekt( 7, 16, 0, 0 ) );
    Sobiekt.push_back( CstaticObiekt( 10, 16, 0, 0 ) );
    Sobiekt.push_back( CstaticObiekt( 5, 18, 0, 0 ) );
};
void CopyFromStaticToActiv() {
    int tymx, tymy, tyms, tymw;
    for( int i = 0; i < Sobiekt.size(); i++ ) {
        tymx = Sobiekt[ i ].getX();
        tymy = Sobiekt[ i ].getY();
        if( tymx >= ludek.x - 5 && tymx <= ludek.x + 5 && tymy >= ludek.y - 5 && tymy <= ludek.y + 5 ) {
            tyms = Sobiekt[ i ].getS();
            tymw = Sobiekt[ i ].getW();
            Aobiekt.push_back( CstaticObiekt( tymx, tymy, tyms, tymw ) );
            Sobiekt.erase( Sobiekt.begin() + i - 1 );
        }; //if
    }; //for
};
void CopyFromActivToStatic() {
    int tymx, tymy, tyms, tymw;
    for( int i = 0; i < Aobiekt.size(); i++ ) {
        tymx = Aobiekt[ i ].getX();
        tymy = Aobiekt[ i ].getY();
        if( tymx < ludek.x - 5 && tymx > ludek.x + 5 && tymy < ludek.y - 5 && tymy > ludek.y + 5 ) {
            tyms = Aobiekt[ i ].getS();
            tymw = Aobiekt[ i ].getW();
            Sobiekt.push_back( CstaticObiekt( tymx, tymy, tyms, tymw ) );
            Aobiekt.erase( Aobiekt.begin() + i - 1 );
        }; //if
    }; //for
};

//w mainie przykładowo zrobione najpierw
GetStaticObiects();
//a w pętelce
CopyFromStaticToActiv();
CopyFromActivToStatic();

//a kolizja wygląda tak
if( key[ KEY_LEFT ] ) { ludek.kierunek = 2; ludek.x--;
    for( int i = 0; i < Aobiekt.size(); i++ ) {
        if( kolizja( ludek.x, ludek.y, ludek.s, ludek.w, Aobiekt[ i ].x, Aobiekt[ i ].y, Aobiekt[ i ].szer, Aobiekt[ i ].dl ) == true )
        { ludek.x++; }
    } //for
}
Dev nie za bardzo pali się do tego, żeby pokazać mi co jest nie tak...Pomysły? :)
P-6550
DejaVu
» 2009-05-05 22:07:11
Ta linijka groźnie wygląda :P
C/C++
Sobiekt.erase( Sobiekt.begin() + i - 1 );
Wykomnentuj wszystkie erase'y i sprawdź czy błąd się powtarza. Jeśli nie to wiesz gdzie leży problem i będzie można ewentualnie pisać dlaczego :)
P-6554
Patzick
Temat założony przez niniejszego użytkownika
» 2009-05-05 22:37:52
Rzeczywiście to z tym był problem, pomieszało mi się że jak begin wskaże początek i dodam aktualne przeliczanie to o 1 za dużo będzie pokazywać. Teraz idealnie działa :) Dziękuję bardzo i zamykam ;)
P-6558
« 1 »
  Strona 1 z 1