2011-06-12 55 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

相关问题