2011-06-12 56 views
1

好吧,我知道這可能是醜陋的,但我不明白爲什麼我不能使用TILES_X,TILES_YTILES_TOTAL作爲全局數組長度,GCC哭着說它是「在文件範圍可變修改」。可變地修改,但是錯誤,怎麼樣?

/* How many points should be in each tile? */ 
    /* NOTE: MUST BE POWER OF TWO */ 
    #define TILE_WIDTH 32 
    #define TILE_HEIGHT TILE_WIDTH 
    #define TILE_AREA (TILE_WIDTH * TILE_HEIGHT) 

    /* How far should the origin of each tile be spaced? */ 
    #define TILE_OFFSET_X TILE_WIDTH 
    #define TILE_OFFSET_Y (TILE_HEIGHT * 0.866f) 

    /* Relative to the origin, where does the tile really end? */ 
    #define TILE_MIN_X 0.0f 
    #define TILE_MIN_Y 0.0f 
    #define TILE_MAX_X (TILE_OFFSET_X + 0.5f) 
    #define TILE_MAX_Y (TILE_OFFSET_Y + 0.5f) 

    /* How many tiles should be cached offscreen? */ 
    #define TILE_BLEED 2 

    #define CAMERA_WIDTH 256.0f 
    #define CAMERA_HEIGHT 192.0f 

    #define TILES_X ((size_t) ((float) ((CAMERA_WIDTH * 2.0f) + (TILE_BLEED * (TILE_WIDTH + TILE_WIDTH)))/(float) TILE_OFFSET_X)) 
    #define TILES_Y ((size_t) ((float) ((CAMERA_HEIGHT * 2.0f) + (TILE_BLEED * (TILE_HEIGHT + TILE_HEIGHT)))/(float) TILE_OFFSET_Y)) 
    #define TILES_TOTAL (TILES_X * TILES_Y) 

TILES_X expands to: 
    ((size_t) ((float) ((256.0f * 2.0f) + (2 * (32 + 32)))/(float) 32)) 

這應該評估一個常數,對不對?我的意思是,沒有什麼,沒有什麼變數。如果我嘗試使用這個初始化器來定義一個變量,它會再次聲明它是如何可變地修改的。我不知道如何。還有一些關於相同錯誤的帖子,但它總是使用枚舉或者定義來代替const int來解決。

+2

你可以張貼的編譯器實際上抱怨的代碼劃分的? – Mat 2011-06-12 12:46:34

回答

4

每6.6,第6段:

一個整數常量表達式應具有整數型和應僅具有操作數 是整數常數,枚舉常數,字符常數,的sizeof 表達式,其結果是積分常數,以及浮動常量,它們是,4610,立即操作數。使用整型常量表達式轉換運算符只應將 將算術類型轉換爲整型,除了作爲運算符sizeof的操作數的一部分。

(重點煤礦)

對於不能使用漂浮在一個整數常量表達式點(這是需要的陣列的尺寸)的大部分。

在任何情況下,您爲此目的使用浮點幾乎肯定是錯誤的。切換到使用整數數學,一切都會正常工作。

編輯:例如,而不是由0.866f相乘,你應該乘以866,然後1000

+0

好的,但在上下文中,因爲整數除法計算爲整數27,而不是27.712,這是瓦片的實際高度,因此無法工作。這就是我使用浮點的原因。因爲這是一項要求。 – nexekho 2011-06-12 13:53:37

+0

這不是要求。假設你知道數學,你無法用整數對浮點數做任何事情。您確實需要做出比我所描述的更廣泛的更改。 – 2011-06-12 14:23:08

+0

我正在使用六角形包裝的1x1px圓形瓷磚,並且不使用不等間距或扭曲圓形,瓷磚的寬度必須爲.866。 – nexekho 2011-06-12 14:54:10

相關問題