Parametros constantes en Allegro



Esto es un breve documento que le introducirá al uso de parámetros constantes con Allegro. Detalla los cambios que ha sufrido el código interno de la librería, los cambios de la API (principalmente transparentes) y lo que tendrá que hacer para adaptar su código para que compile sin warnings del compilador (de nuevo, casi nada).


Contenido


Cambios en la librería

Hay muy pocos cambios en el código de la propia librería; sólo algunas declaraciones y definiciones han sido alteradas para incluír ALCONST. Lea debajo una descripción del define de preprocesador AL_CONST. En algunos casos, alguna cadena era modificada cuando no debía serlo - en estos casos, la cadena simplemente es duplicada y ésta copia es eliminada al salir de la función.

Después de todo, ha habido pocos cambios al código de la librería.


El define de preprocesador AL_CONST

Para poder soportar compiladores que no conocen la palabra clave `const', o quizás usan una palabra clave diferente, el símbolo de preprocesador AL_CONST es usado en lugar de `const'. Note que en la documentación se usa `const' para que sea más legible.


Cambios en la API de Allegro

Estos son, generalmente, totalmente transparentes al usuario. No he cambiado el comportamiento de ninguna función; únicamente los tipos de los parámetros. Básicamente, si puede pasar a una función type* ptr, entonces puede pasar const type* ptr sin ningún problema adicional. Note que algunos cambios pueden haber eliminado warnings producidos por su programa debido a que las cadenas estáticas, etc, ahora son tratadas como `const' por las funciones Allegro.

Hay algunos lugares, descritos a continuación, donde habrá un efecto en el código existente.

La corrección del uso de `const' es realmente importante por dos razones. En primer lugar, puede incrementar la legibilidad y comprensión de las funciones de Allegro (por ejemplo, puede ver qué parámetros son alterados y cuales no). Segundo, le asegura que el código de Allegro no está cambiando datos que no debería tocar, y que las funciones del cliente no están corrompiendo Allegro modificando datos que no deberían tocar.


Funciones callback y punteros a punteros

Algunas funciones callback tienen ahora un tipo diferente - usan punteros `const' en lugar de punteros no constantes. Por lo que se, un compilador puede mostrar mensajes de aviso sobre tipos de punteros incompatibles. Debería actualizar sus funciones callback al nuevo formato (que será documentado en el manual de Allegro).

Además, cuando pase un puntero a un puntero de una función de Allegro que está declarada como recibiendo un AL_CONST type** ptr, deberá convertir su puntero a `const' si no lo es ya. Por ejemplo:

   int alguna_funcion_de_allegro(AL_CONST char** p);
   
   void mi_funcion(char** x)
   {
       alguna_funcion_de_allegro((AL_CONST char**) x);
   }
Me doy cuenta de que esto es un cambio a la API de Allegro, y que supuestamente hay que evitar éstos a toda costa, pero esencialmente corrige un fallo en Allegro y a la vez modifica el comportamiento. También asegura que la función callback proporcionada por el cliente está funcionando correctamente, y no altera datos que no debería tocar. Las funciones callback que no tratan los parámetros relevantes como constantes, son ligeramente erróneas (pero potencialmente significantes).

Por favor note que para la función Unicode ugetx(), he proporcionado una versión alternativa ugetxc(), que toma un parámetro `const char**' a diferencia del parámetro `char**'. Esto es porque es válido pasar tanto un `char**' como un `const char**', pero desafortunadamente no hay forma de decirle al compilador cuál queremos.


Objetos BITMAP

Allegro representa tanto la pantalla como un bitmap con un mismo objeto: un BITMAP. Desafortunadamente, estas dos cosas pueden ser muy diferentes. Por ejemplo, leer un pixel de un bitmap aparentemente no lo modifica, pero si estamos leyendo de una pantalla, entonces es posible que deba ser alterado algún parámetro de la tarjeta de vídeo para seleccionar la línea correcta, etc.

Por consiguiente, un parámetro const BITMAP no tiene sentido, y no se usa en ningún punto de la librería. Esto es desafortunado, pero no veo ningún modo de solucionarlo.


Finalmente...

Sólo he probado esto con DJGPP 2.95.2, por lo que si tiene experiencias en las que esto no funciona (he intentado que los ports Linux y BeOS funcionen correctamente, pero no puedo garantizarlo...) mándame por email el mensaje de error *exacto* y lo arreglaré. También puede contactar la lista de correo de desarrolladores de Allegro; lea la sección "Ayuda" del manual de Allegro.

Email: lwithers@lwithers.demon.co.uk.

Gracias por escuchar :-)