2012-12-02 79 views
1

我正在使用C++和SFML 2.0開發一個學校項目,它將於週二發佈,而我最近剛剛遇到了這個問題。 我已經把箭頭放在最新的調用堆棧的位置。 這些是我懷疑可能在其中存在錯誤的代碼部分。我對C++也很新,我知道我做了很多錯誤的事情。訪問衝突寫入位置0x00000000。 C++/SFML遊戲

這是在我的Background類中,它裝載我所有的瓷磚,設置它們的位置和瓷磚類型等等。

GetWayPointList返回到我EnemyManager

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; 
} 

調用棧本身說TileShooter v0.1.exe!Background::Load(QuadTree*quadTree) Line 68 + 0x2e bytes瓷磚的載體。 68行是箭頭所在的位置。

如果你需要更多的代碼/信息只是說。任何可能出錯的地方都會大受歡迎。 最好的問候,弗雷德裏克·W^


編輯

我編輯的一些代碼,包括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; 
} 

這並沒有真正解決,而是向下移動的錯誤,我已經將我的箭頭移到了Call Stack最新的呼叫位置。

+4

你在哪裏定義'瓷磚'?我想你的問題是'tile'或者太小或者還沒有被分配,或者'tile'中的元素沒有被分配。 –

+0

Tile在Background.h中定義爲Tile * tile [32] [32]; –

+0

永遠不要理解學校對巨大的多維陣列的癡迷 –

回答

5

所以你的tile成員定義爲Tile* tile[32][32]。這是一個大小爲32x32的二維數組,其中每個元素都是指向Tile的指針。然而,他們是只是指針,目前沒有指向任何地方 - 訪問它們是未定義的行爲(在你的情況下,訪問衝突)。您需要分配實際Tile對象:

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

不要忘記做循環同類中的Background的析構函數,而不是做delete tile[i][j];

更重要的是,不要動態地分配你的瓷磚,只是定義爲tile:(!)

Tile tile[32][32]; 

甚至更​​好,但使用std::array<std::array<Tile,32>,32>。 :)


要回答你的編輯,即使它無效,我上面的回答:你所訪問的tilej+1個元素。當j是31時,您正在訪問tile[32],它超出了數組的範圍。

+0

你是對的,skippy! –

+0

@Lightness在軌道上的比賽 - 我想知道如果我們可以使用世界上所有無聊的C++程序員的力量可以實現什麼。 – SChepurin

+0

@Schepurin:你有沒有看到瑪莎瓊斯擊敗師父的博士誰的情節?她是如何做到的?這是可以實現的。 –

相關問題