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

[C++]0xC0000005: Access violation writing location 0xCCCCCCCC

Ostatnio zmodyfikowano 2013-10-20 16:21
Autor Wiadomość
LimaSxD
Temat założony przez niniejszego użytkownika
[C++]0xC0000005: Access violation writing location 0xCCCCCCCC
» 2013-10-20 00:18:43
Cześć, mam problem z kompilacją kodu:
C/C++
ParticleSystem::ParticleSystem( sf::Vector2f & _emitter, sf::Time & _lifetime, unsigned int count, unsigned int extraarraysize )
    : emitter( _emitter )
    , vertices( sf::LinesStrip )
    , lifetime( _lifetime )
    , arraysize( 1 )
{
    maxarraysize = 60 * _lifetime.asSeconds() * extraarraysize; //Obliczam rozmiar tablicy
    Particle * particlesarray = new Particle[ maxarraysize ]; //Moja dynamiczna tablica struktury Particle
}

void ParticleSystem::addParticle( float _angle, float _speed, sf::Color & _color )
{
    Particle newParticle;
    float angle = _angle * 3.14f / 180.f;
    newParticle.velocity = sf::Vector2f( std::cos( angle ) * _speed, std::sin( angle ) * _speed );
    newParticle.lifetime = lifetime - sf::milliseconds(( std::rand() % 200 ) );
    newParticle.vertex.color = _color;
    newParticle.vertex.position = emitter;
    particlesarray[ arraysize ] = newParticle; // Tutaj kompilator wywala błąd
    arraysize++;
    /*
    Particle newParticle;
    float angle = _angle * 3.14f / 180.f;
    newParticle.velocity = sf::Vector2f(std::cos(angle) * _speed, std::sin(angle) * _speed);
    newParticle.lifetime = lifetime - sf::milliseconds((std::rand() % 200));
    newParticle.vertex.color = _color;
    newParticle.vertex.position = emitter;
    particles.push_back(newParticle);*/
}
Ponieważ na Debugu wywala mi błąd:

First-chance exception at 0x0123701A in Game1.exe: 0xC0000005: Access violation writing location 0xCCCCCCCC.
Unhandled exception at 0x0123701A in Game1.exe: 0xC0000005: Access violation writing location 0xCCCCCCCC.

Przeszukałem kilka godzin na google i nic nie znalazłem co rozwiązało by mój problem więc jeżeli ktoś wie jak rozwiązać ten problem, proszę o odpowiedź.
P-94082
Mrovqa
» 2013-10-20 00:45:36
C/C++
particlesarray[ arraysize ] = newParticle; // Tutaj kompilator wywala błąd
Raz, to debugger, a nie kompilator, a dwa - jesteś na 100% pewien, że nie przekraczasz rozmiaru tablicy? Nigdzie nie sprawdzasz, czy w tablicy zmieści się jeszcze jedna cząsteczka.
P-94086
killjoy
» 2013-10-20 00:51:44
Tak na moje oko to tworzysz lokalny wskaźnik na tablice w konstruktorze
Particle * particlesarray = new Particle[ maxarraysize ];
, a potem chcesz się odwołać do pola klasy
particlesarray[ arraysize ];
, gdzie są śmieci (tudzież jest puste), bo na zaalokowaną pamięć wskazywał wskaźnik lokalny w konstruktorze.
P-94088
LimaSxD
Temat założony przez niniejszego użytkownika
» 2013-10-20 00:52:36
Tak jestem pewien ponieważ w construktorze ustawiam arraysize na 0, a na Debugu widzę że jest 0.
P-94089
Mrovqa
» 2013-10-20 16:21:06
Pierwsza sprawa, to posłuchaj @killjoypl - ty nie modyfikujesz składnika klasy, tylko adres przechowujesz w zmiennej lokalnej, która przestaje istnieć od razu po wyjściu z konstruktora.
Tak jestem pewien ponieważ w construktorze ustawiam arraysize na 0, a na Debugu widzę że jest 0.
Druga sprawa jest taka, że w zamieszczonym kodzie podajesz tam jedynkę - wkleiłeś zły kod? Trzecia sprawa - co z tego, że zmienną inicjalizujesz? Nie widzisz tego, że arraysize zwiększa się za każdym wywołaniem metody? Dla dobrej praktyki powinieneś sprawdzać czy możesz dodać nową cząsteczkę - kiedyś będziesz chciał wykorzystać kod i będziesz się dziwił, dlaczego gra "sama z siebie przestała dobrze działać".
P-94125
« 1 »
  Strona 1 z 1