2011-06-12 3 views
1

Ok, je comprends ce qui est probablement laid que diable, mais je ne peux pas comprendre pourquoi je ne peux pas utiliser TILES_X, TILES_Y ou TILES_TOTAL comme longueurs de tableau global, GCC pleurer à ce sujet étant « modifié Inégalement à la portée du fichier ».Variablement modifié, mais err, comment?

/* 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)) 

Qui devrait évaluer à une constante, non? Je veux dire, il n'y a rien, rien de variable là-dedans. Si j'essaie de définir une variable avec un initialiseur, cela m'indique à quel point il est modifié de façon variable. Je ne vois pas comment. Il y a d'autres articles sur la même erreur, mais il a toujours été résolu en utilisant un enum ou define au lieu d'un const int.

+2

vous pouvez afficher le code que le compilateur se plaint en fait de? – Mat

Répondre

4

Per 6.6, paragraphe 6:

Entier expression constante doit avoir le type entier et ne doivent avoir opérandes qui sont des constantes entières, des constantes d'énumération, des constantes de caractères, sizeof expressions dont les résultats sont des constantes entières, et les constantes flottantes qui sont les opérandes immédiats de moulages. Les opérateurs Cast dans une expression de constante entière ne doivent convertir que des types arithmétiques en types entiers, sauf en tant que partie d'un opérande à l'opérateur size1212 de l'opérateur .

(Souligné par l'auteur)

Pour la plupart, vous ne pouvez pas utiliser à virgule flottante dans un entier expression constante (ce qui est nécessaire pour les dimensions du tableau).

Dans tous les cas, votre utilisation du flottant à cet effet est presque certainement faux. Passez à l'utilisation des mathématiques entières et tout ira bien.

Edit: Par exemple, au lieu de multiplier par 0.866f, vous devez multiplier par 866, puis diviser par 1000.

+0

Ok, mais dans un contexte qui ne fonctionne pas parce que la division entière évalue à un entier, 27, plutôt que 27.712 qui est la hauteur réelle d'une tuile. C'est pourquoi j'utilise le point flottant. Parce que c'est une exigence. – nexekho

+0

Ce n'est pas une exigence. Il n'y a rien que vous puissiez faire avec des virgules flottantes que vous ne pouvez pas faire avec des nombres entiers, en supposant que vous connaissiez les mathématiques. Vous avez besoin de faire des changements plus importants que ce que j'ai décrit. –

+0

Je travaille avec des carreaux de cercles 1x1px hexagonaux, et sans utiliser un espacement inégal ou déformant les cercles, les carreaux doivent être .866 aussi grands que larges. – nexekho

Questions connexes