Pregunta

Estoy pasando una variedad de índices de vértice en algún código GL ... cada elemento es un brillo

Quiero terminar con un centinela para evitar tener que pasar laboriosamente la longitud de la matriz cada vez junto con la matriz misma.

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

No puedo usar 0 para terminar ya que algunos de los elementos tienen valor 0

¿Puedo usar -1?

A mi opinión, esto se envolvería al máximo que Glushort puede representar, lo que sería ideal.

¿Pero este comportamiento está garantizado en C?

(No puedo encontrar una constante equivalente max_int para este tipo, de lo contrario estaría usando eso)

¿Fue útil?

Solución

Si GLushort de hecho es un tipo sin firmar, entonces (GLushort)-1 es el valor máximo para GLushort. El estándar C garantiza que. Entonces, puedes usar de forma segura -1.

Por ejemplo, C89 no tenía SIZE_MAX macro para el valor máximo para size_t. Podría ser portátil definido por el usuario como #define SIZE_MAX ((size_t)-1).

Si esto funciona como un valor centinela en su código depende de si (GLushort)-1 es un valor válido no sentel en su código.

Otros consejos

GLushort es un UNSIGNED_SHORT tipo que se escribe para unsigned short, y que, aunque c no garantiza It, OpenGL asume como un valor con un rango de 2^16-1 (capítulo 4.3 de la especificación). En prácticamente todas las arquitecturas convencionales, esta suposición algo peligrosa también es cierta (no soy consciente de uno donde unsigned short tiene un tamaño diferente).

Como tal, tu pueden use -1, pero es incómodo porque tendrá muchos elenco y si olvidas un elenco, por ejemplo, en un if() declaración, puedes ser afortunado Y obtenga una advertencia del compilador sobre "La comparación nunca puede ser verdad", o puede ser desafortunado Y el compilador optimizará silenciosamente la ramificación, después de lo cual pasa días buscando la razón por la cual su código aparentemente perfecto se ejecuta mal. O peor aún, todo funciona bien en las construcciones de depuración y solo bombas en las compilaciones de lanzamiento.

Por lo tanto, usando 0xffff Como JV42 ha aconsejado que es muy preferible, evita esta trampa.

Crearía una constante global de valor:

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

Creo que esto es perfectamente elegante siempre que los enteros firmados se representen usando el complemento de 2.

No recuerdo si está garantizado por el estándar C, pero está prácticamente garantizado para la mayoría de las CPU (en mi experiencia).Editar: APPARENTE ESTO es Garantizado por el estándar C ...

Si quieres una constante con nombre, no deberías usar un const variable calificada como se propuso en otra respuesta. Realmente no son lo mismo. Use una macro (como otros han dicho) o una constante de tipo de enumeración:

enum { GLushort_SENTINEL = -1; };

El estándar garantiza que esto siempre es un int (realmente otro nombre de la constante -1) y que siempre se traducirá en el valor máximo de su tipo sin firmar.

Editar: o podrías tenerlo

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

Si temes que en algunas arquitecturas GLushort podría ser más estrecho que unsigned int.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top