Archivo de la etiqueta: C

Desafío: controlar acceso a través de huellas

Hace pocos días, me contacto un amigo con el que trabajé hace unos años. Aquel fue “mi primer trabajo”, aun cuando fue más freelance que cualquier otra cosa.

Esta vez no fue un “sistema web”, sino algo un poco especial. Teniendo 2 situaciones distintas, es necesario controlar el acceso de ciertas personas a ciertos lugares. En este caso, el problema en realidad es más cultural que informático, pero bueh…

La idea es implementar un lector de huellas digitales (tambien conocido como lector biométrico, fingerprint, etc…), que este logre identificar contra una base de datos con los socios (usuarios) y finalmente conceda o deniegue el acceso dependiendo de las condiciones en que se encuentra el socio (quien pondrá el dedo).

sadg
Lector de huellas casero

Es un desafío interesante por varias razones. Si pudiera elegir libremente, habría pensado en implementar PC’s terminales con Linux, ya que existe un api libre para programar estos aparatitos. Incluso, un compañero de la universidad logró habilitar el lector de huellas de su notebook con eso.

Pero estoy sujeto a algunas restricciones:

Problemas

Era que no

Corrector OrtoTRÁGICO

Esta fue de esas oportunidades en que el plan A en la prácticamente se vuelve totalmente opuesto.

Mi idea era realizar la tarea de Estructuras de Datos en no más de una semana, y así tener el resto del tiempo (3-4 semanas) libre para dedicarme a estudiar para las pruebas. Pero debido a complicaciones del más allá, el plan cambió radicalmente a “hacer la tarea como sea, y estudia la última semana, cuando llegan todas las pruebas”.

El enunciado del problema pedía hacer un script de corrección ortográfico, en C y que funcionara en Linux, que tomara un archivo de texto con las palabras (diccionario 1), con palabras erróneas y su corrección (diciconario 2) y un archivo de prueba, que se debe corregir en base a los diccionarios. La idea es usar TDA de Listas Enlazadas para las palabras.

Hasta ahí, me asuste un poco, porque pensé que al “anudar” los Nodos, recorrerlos, o agregar/eliminar se me iban a perder los punteros. Pero nada… todo eso era simple (finalmente ese era el objetivo de la tarea), sin embargo, fue un parto el manejo de cadenas. Pensé que mi experiencia en C++ podría ayudar, leí cuanto manual hablaba de punteros, arrays, cadenas de char, etc… pero me ocurrían fallos muy curiosos:

  • Las funciones estándar de ANSI C para cadenas se comportaban en forma errática con el caracter final de cadena (o caracter nulo ”)
  • Al pedir memoria para una cadena, se caía DENTRO de un malloc
  • Las funciones que s hacían llamada al malloc que se caía, funcionanban bien en forma asilada, pero cuando las ponía dentro de un ciclo comenzaban a aparecer comportamientos erráticos, siendo que ninguna variable era estática, ni habían funciones recursivas, como para que el efecto fuera acumulativo.
  • Al llamar a las funciones problemáticas, a veces se caía luego de llamadas posteriores a otras funciones que no tenían nada que ver.

Acá esta mi primera versión.

En fin, fue un infierno tratar con cadenas de texto en C. Finalmente, gracias a un usuario del irc Powers, pude completar la maldita tarea, el domingo pasado, día antes de la entrega. Este es el producto final.

En C++ no he estado libre de problemas.

En C++ me ocurre algo más rebuscado aún. Trabajando la clase Cadena de GDT, decidí implementar el algoritmo que ocupé en la tarea para calcular la ruta al directorio de ejecución (útil para cargar archivos externos respecto a esta ruta), pero increíblemente, el mismo código, al pasarlo del main() a un método propio de la clase Cadena funciona, pero al retornar la cadena, se corrompen los primeros caracteres (¡¡¡El return me estaba fallando!!!)

Increíble, pensé que dominaba más o menos C/C++, pero veo que hay secretos + profundos que no son muy simples de resolver.

Primera vez que tuve que ocupar un depurador

Como hacer una DLL en Visual C++ y que el mismo código funcione en otros compiadores.

Bueno, este problema es clásico, MS versus resto del mundo. Ya antes me ha ocurrido haciendo páginas web, tener que preocuparse de Internet Explorer y el resto de navegadores.

Mientras intentaba compilar GDT en Visual C++ 2005 Express, me encontré con un problema muy extraño.

Finalmente logre arreglar partes del código para que no me arrojara warnings en tiempo de compilación.

Pero en tiempo de enlazado (en el linker o vínculador) me daba mensajes raros cuando intentaba enlazar un programa de ejemplo con la librería.

El mensaje exactamente símbolo externo “símbolo” sin resolver. Ese símbolo podía ser una variable, una función, una clase, una una propiedad un método, etc…

El problema se produce porque en VC++ se deben exportar los métodos que se tomarán como “visibles” fuera de la librería dinámica (los métodos a los que el programa que se enlaza con ella tendrá acceso).

Según este tutorial de MSDN, la solución pasa por añadir __declspec(dllexport) antes de cada símbolo que se desea exportar a la DLL. El problema es que yo quiero que mi código sea multiplataforma, y esa sentencia claramente no me la va a tomar un compilador como GCC.

Esta es mi solución:

Seguir leyendo Como hacer una DLL en Visual C++ y que el mismo código funcione en otros compiadores.