2013-08-22 45 views
2

使用下面的代碼時,它將Tile對象的x值設置爲i,將y值設置爲j。但是,如果我打印值只y值是正確的,x值始終是4095C++奇怪值重置

代碼:

主要代碼:

Tile * tiles = new Tile[4096,4096]; 
    for(int i = 0; i< 4096;i++) 
    { 
     for(int j = 0;j< 4096;j++) 
     { 
      tiles[i,j].x = i; 
      tiles[i,j].y = j; 
     } 
    } 

    for(int i = 0; i< 4096;i++) 
    { 
     for(int j = 0;j< 4096;j++) 
     { 
       cout << "X (Should be " <<i<<"): "<< tiles[i,j].x << " " << "Y (Should be " <<j<<"): "<< tiles[i,j].y << "\n"; 
     } 
    } 

Tile.h:

#pragma once 

class Tile 
{ 
    public: 
     int x, y; 
}; 
+0

我不知道你正在嘗試用'分片[4096,4096]做;'和所有類似的訪問,但我相信它不會做你的意思。你正在陷入[逗號運算符](http://en.wikipedia.org/wiki/Comma_o​​perator),並且基本上正在執行'Tile [4096];'。如果你想要一個二維數組,你需要使用兩組方括號,而使用'new'有點費勁:http://stackoverflow.com/questions/936687/how-do-i-declare-a-2d -array-in-c-using-new – BoBTFish

+0

你有任何迫切的理由使用原始(C++風格)數組嗎?如果不是,那麼我強烈建議使用'std :: vector'來代替。 – Grizzly

回答

10

您沒有正確使用陣列:

i,j將始終返回j,因爲這是逗號運算符的結果。

Tile** tiles = new Tile*[4096]; 
for(int i = 0; i < 4096; i++) 
    tiles[i] = new Tile[4096]; 

    for(int i = 0; i< 4096;i++) 
    { 
     for(int j = 0;j< 4096;j++) 
     { 
      tiles[i][j].x = i; 
      tiles[i][j].y = j; 
     } 
    } 

    for(int i = 0; i< 4096;i++) 
    { 
     for(int j = 0;j< 4096;j++) 
     { 
       cout << "X (Should be " <<i<<"): "<< tiles[i][j].x << " " << "Y (Should be " <<j<<"): "<< tiles[i][j].y << "\n"; 
     } 
    } 


    // Destruction! DON'T FORGET! 
    for(int i = 0; i < 4096; i++) 
     delete[] tiles[i]; 
    delete[] tiles; 

如果計算從逗號操作值,原來的代碼是:

Tile * tiles = new Tile[4096]; // returned last 4096 
    for(int i = 0; i< 4096;i++) 
    { 
     for(int j = 0;j< 4096;j++) 
     { 
      tiles[i,j].x = i; // the same as tiles[j].x = i; 
      tiles[i,j].y = j; // the same as tiles[j].y = j; 
     } 
    } 

///... 
+0

當試圖編譯「Tile * tiles = new Tile [4096] [4096];」時,出現此錯誤: IntelliSense:類型爲「Tile(*)[4096]」的值不能用於初始化一個類型爲「Tile *」的實體 – user1990950

+0

那麼,你需要做不同的初始化。我將編輯。 –

+0

@ user1990950請參閱我對該問題的評論鏈接。 – BoBTFish