@document_title=Parámetros constantes en Allegro
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).
@!text
@heading
Contenido
@shortcontents
@text
@heading
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.
@heading
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.
@heading
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.
@heading
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.
@heading
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.
@heading
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 :-)