Question

Je passe un tableau d'indices de sommets dans un code de GL ... chaque élément est un GLushort

Je veux mettre fin à une sentinelle afin d'éviter d'avoir à passer laborieusement la longueur du tableau à chaque fois à côté du tableau lui-même.

#define SENTINEL ( (GLushort) -1 ) // edit thanks to answers below
:
GLushort verts = {0, 0, 2, 1, 0, 0, SENTINEL};

Je ne peux pas utiliser 0 mettre fin comme certains des éléments ont une valeur 0

Puis-je utiliser -1?

Pour ma compréhension de cette envelopperait au maximum entier GLushort peut représenter, ce qui serait idéal.

Mais est-ce comportement garanti en C?

(je ne peux pas trouver un MAX_INT constant équivalent pour ce type, sinon je serais en utilisant que)

Était-ce utile?

La solution

Si GLushort est en effet un type non signé, alors (GLushort)-1 est la valeur maximale pour GLushort. Les garanties standard C qui . Ainsi, vous pouvez utiliser en toute sécurité -1.

Par exemple, C89 n'a pas macro SIZE_MAX pour la valeur maximale pour size_t. Il pourrait être défini portably par l'utilisateur comme #define SIZE_MAX ((size_t)-1).

Que cela fonctionne comme une valeur sentinelle dans votre code dépend si (GLushort)-1 est valide, la valeur non-sentinelle dans votre code.

Autres conseils

GLushort est un type de UNSIGNED_SHORT qui est typedefed à unsigned short, et qui, bien que C ne garantit pas it, OpenGL assume en tant que valeur avec un intervalle de 2 ^ 16-1 (chapitre 4.3 de la spécification ). Sur pratiquement toutes les architectures grand public, cette hypothèse quelque peu dangereuse est vrai aussi (je ne suis pas au courant d'un où unsigned short a une taille différente).

En tant que tel, vous peut utilisez -1, mais il est maladroit parce que vous aurez beaucoup de moulages et si vous oubliez un casting par exemple dans une déclaration if(), vous pouvez être chanceux et un avertissement du compilateur de « comparaison ne peut jamais être vrai », ou vous pouvez être malchanceux et le compilateur silencieusement optimiser la ramifient, après quoi vous passez journées à chercher la raison pourquoi votre code apparemment parfaite exécute mal. Ou pire encore, tout cela fonctionne très bien dans les versions Debug et que des bombes dans la version construit.

Par conséquent, en utilisant 0xffff comme jv42 a conseillé est beaucoup preferrable, il évite cette alltogether écueil.

Je voudrais créer une constante globale de la valeur:

const GLushort GLushort_SENTINEL = (GLushort)(-1);

Je pense que cela est parfaitement élégant comme des entiers signés longtemps sont représentés par le complément 2.

Je ne me souviens pas si c'est garanti par la norme C, mais il est pratiquement garanti pour la plupart de (mon expérience dans) CPU. Modifier Appparently ce garantie par la norme C ....

Si vous voulez une constante nommée, vous ne devriez pas utiliser une variable const qualifiée telle que proposée dans une autre réponse. Ils ne sont vraiment pas les mêmes. Utiliser une macro (comme d'autres l'ont dit) ou une constante de type d'énumération:

enum { GLushort_SENTINEL = -1; };

Les garanties standard que ce qui est toujours un int (vraiment un autre nom de la -1 constante) et qu'il toujours se traduira par la valeur maximale de votre type non signé.

Edit: ou vous pourriez avoir

enum { GLushort_SENTINEL = (GLushort)-1; };

si vous craignez que sur certaines architectures GLushort pourrait être plus étroite que unsigned int.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top