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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.