2012-12-02 10 views
1

저는 C++과 SFML 2.0을 사용하는 학교 프로젝트에 참여하고 있습니다. 화요일 예정이며 최근에이 문제에 착수했습니다. 최근 호출 스택 위치에 화살표를 추가했습니다. 다음은 내가 잘못 생각한 코드 부분입니다. 나는 또한 C++에 대해 아주 새로운데, 나는 잘못한 것들을 많이 알고 있습니다.액세스 위반 작성 위치 0x00000000. C++/SFML 게임

이것은 내 Background 클래스에 있으며, 모든 타일을로드하고, 위치와 타일 타입을 설정합니다.

GetWayPointListEnemyManager 클래스 콜 스택 자체가 TileShooter v0.1.exe!Background::Load(QuadTree*quadTree) Line 68 + 0x2e bytes 말한다

void Background::Load(QuadTree * quadTree) { 

     int tempTiles[32][32] = {... Lots of 1's and 0's in here }; 

     for(int i = 0; i < 32; i++) 
     { 
      for(int j = 0; j < 32; j++) 
      { 
--->     tile[j][i]->tileType = tempTiles[j][i]; 
        tile[j][i]->setPosition(sf::Vector2f((float)(i*32),(float)(j*32))); 
        if(tile[j][i]->tileType == 1) 
        { 
         quadTree->AddObject(tile[j][i]);    
        } 

       else if(tile[j][i]->tileType == 0) 
       { 
        tile[j][i]->distanceFromStart = INT_MAX; 
        tile[j][i]->parent = NULL; 

        vector<Tile*> tempTiles; 
        if(tile[j+1][i]->tileType == 0) 
         tempTiles.push_back(tile[j+1][i]); 
        if(tile[j-1][i]->tileType == 0) 
         tempTiles.push_back(tile[j-1][i]); 
        if(tile[j][i+1]->tileType == 0) 
         tempTiles.push_back(tile[j][i+1]); 
        if(tile[j][i-1]->tileType == 0) 
         tempTiles.push_back(tile[j][i-1]); 
        tile[j][i]->setSuccessors(tempTiles); 
        tilesList->push_back(tile[j][i]); 
       } 
      } 
     } 
    } 

vector<Tile*>* Background::GetWayPointList() 
{ 
    return tilesList; 
} 

에 타일의 벡터를 반환합니다. 줄 68은 화살표가있는 곳입니다.

더 많은 코드/정보가 필요한 경우에만 말하십시오. 잘못되었을 가능성이있는 부분에 큰 점수가 부과됩니다. 좀 tile[j][i] = new Tile();

void Background::Load(QuadTree * quadTree) { 

     int tempTiles[32][32] = {... Lots of 1's and 0's in here }; 

     for(int i = 0; i < 32; i++) 
     { 
      for(int j = 0; j < 32; j++) 
      { 
        tile[j][i] = new Tile(); 
        tile[j][i]->tileType = tempTiles[j][i]; 
        tile[j][i]->setPosition(sf::Vector2f((float)(i*32),(float)(j*32))); 
        if(tile[j][i]->tileType == 1) 
        { 
         quadTree->AddObject(tile[j][i]);    
        } 

       else if(tile[j][i]->tileType == 0) 
       { 
        tile[j][i]->distanceFromStart = INT_MAX; 
        tile[j][i]->parent = NULL; 

        vector<Tile*> tempTiles; 
---->     if(tile[j+1][i]->tileType == 0) 
         tempTiles.push_back(tile[j+1][i]); 
        if(tile[j-1][i]->tileType == 0) 
         tempTiles.push_back(tile[j-1][i]); 
        if(tile[j][i+1]->tileType == 0) 
         tempTiles.push_back(tile[j][i+1]); 
        if(tile[j][i-1]->tileType == 0) 
         tempTiles.push_back(tile[j][i-1]); 
        tile[j][i]->setSuccessors(tempTiles); 
        tilesList->push_back(tile[j][i]); 
       } 
      } 
     } 
    } 

vector<Tile*>* Background::GetWayPointList() 
{ 
    return tilesList; 
} 
정말 해결이 아니라 아래로 오류를 이동하지 않았다

를 포함하여 코드를 편집 한

최고 감사합니다, 프레드릭 W


편집, 나는 통화 스택에 최신 통화가있는 곳에서 내 화살표를 움직였습니다.

+4

여기서 '타일'을 정의합니까? 귀하의 문제는 '타일'이 너무 작거나 아직 할당되지 않았거나 '타일'의 요소가 할당되지 않았다는 것입니다. –

+0

타일은 Background.h에서 Tile * tile [32] [32]로 정의됩니다. –

+0

거대한 다차원 배열을 통해 학교에서 강박 관념을 이해하지 못했습니다 –

답변

5

귀하의 tile 회원은 Tile* tile[32][32]으로 정의됩니다. 이것은 크기가 32x32 인 2D 배열입니다. 각 요소는 Tile에 대한 포인터입니다. 그러나 그들은 입니다. 단지 포인터이며 현재는 특히 아무 곳이나 가리 키지 않습니다. 액세스하는 것은 정의되지 않은 동작입니다 (귀하의 경우 액세스 위반). 당신은 실제 Tile 객체를 할당해야합니다

for (int i = 0; i < 32; i++) { 
    for (int j = 0; j < 32; j++) { 
    tile[i][j] = new Tile(); 
    } 
} 

대신 delete tile[i][j];을 수행 Background의 소멸자에서 루프의 같은 종류의 일을하는 것을 잊지 마십시오.

더 나은 아직, 동적으로 타일을 할당하고 그냥 tile 정의하지 않습니다 : (!)

Tile tile[32][32]; 

더 나은 아직, std::array<std::array<Tile,32>,32>를 사용합니다. :)

이 내 위의 대답을 무효화 비록, 당신의 편집에 대답 : 당신은 tilej+1 번째 요소에 접근하고 있습니다. j이 31 일 경우 tile[32]에 액세스하며 배열의 범위를 벗어납니다.

+0

당신이 맞아요, skippy! –

+0

@ Lightness Races in Orbit - 전 세계에서 지루함을 느낀 C++ 프로그래머들의 힘을 사용할 수 있다면 무엇을 얻을 수 있을지 궁금합니다. – SChepurin

+0

@SChepurin : Martha Jones가 Master를 패배시킨 Dr. Doctor의 에피소드를 보았습니까? 그리고 그녀는 어떻게 했습니까? _ 달성 할 수있는 것. –

관련 문제