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 :-)