Palíndromos 02022020

Además de ser el Día de la Marmota, el día de hoy nos presenta una fecha especial, un palíndromo: 02022020. Un palíndromo es un texto que se lee de igual forma en un sentido que en otro: ANA, amor a Roma (salvando la mayúscula), oso, ojo…

Hoy dedicaremos un artículo básico sobre cómo comprobar si un texto es palíndromo o no. Es un buen ejercicio cuando se comienza a programar y he querido dedicar unas líneas al mismo con algunas soluciones. En términos generales, todas implican comparar el primer caracter con el último, el segundo con el penúltimo y así hasta llegar a la mitad o encontrar uno diferente.

Por simplicidad, diferenciaremos mayúsculas de minúsculas así como letras …

Sigue leyendo →

Devolviendo cadenas, los punteros colgantes de Babilonia

En mis clases de Sistemas Operativos suelo dedicar un apartado a problemas de gestión de memoria, especialmente en el lado del programador: pérdidas de memoria (memory leaks), accesos fuera de límites (out-of-bound access), punteros colgantes (dangling pointers), entre otros. De los dos primeros ya hablaremos en otra ocasión, esta entrada versará sobre el último, los dangling pointers.

Un puntero colgante es, básicamente, un puntero que contiene una dirección de memoria inválida (cuando digo puntero me refiero también, si aplica, a referencias a objetos). Una dirección inválida puede ser:
– una dirección basura, normalmente un puntero sin inicializar,
– un puntero a una zona de memoria que ya no nos pertenece, tal como puntero …

Sigue leyendo →

Automatizando acciones gracias al RAII (parte II)

En la entrada anterior estudiamos lo que es el RAII, cómo es una de las técnicas bases de C++11 y algunos ejemplos.

En esta segunda parte comentaremos otros usos del RAII y cómo podemos hacer pequeños apaños mediante wrappers cuando el RAII no está disponible por la razón que sea.

Inicializaciones complejas

Supongamos el siguiente código:

(Como nota al margen, recordad que es legal hacer un delete sobre un puntero nulo.)

Un problema de este código es que, como vimos anteriormente, tiene una gestión de fallos complicada, mucho código repetido por si ocurriese algo (hay que dejar el objeto en un estado coherente). Obviamente podríamos condensar los condicionales mediante un and pero a largo plazo eso no haría sino …

Sigue leyendo →

Automatizando acciones gracias al RAII (parte I)

Como mencioné en una entrada anterior, uno de los aspectos que más me gusta de C++ es el RAII (Resource Acquisition Is Initialization). Introducida por Bjarne Stroustrup (creador de C++), esta técnica hace uso de los constructores y destructores para la correcta gestión de recursos. Tiene como bases las siguientes premisas:

  • Un constructor siempre se ejecuta antes de que el objeto pueda ser usado, por lo que es un lugar seguro para reservar, inicializar, preparar los recursos a ser utilizados posteriormente.
  • Los destructores son llamados implícitamente cuando el objeto, bueno, se destruye, y es lo último que hace el objeto antes de liberar su propia memoria. Es el momento adecuado de liberar otros recursos usados.
  • Lo único que está garantizado

Sigue leyendo →

Una forma sencilla, rápida y cuasi-automática de medir tiempos de ejecución en funciones

Una tarea típica del programador es la de saber si una función es eficiente o no, tanto desde el punto de vista algorítmico como de tiempo de ejecución real. Creo necesario matizar que ambos valores son importantes, ya que el primero nos dirá el comportamiento del algoritmo a medida que el conjunto de datos crezca, y el segundo un valor más palpable, cercano a lo que el usuario final percibirá.

Por otro lado, no es necesario partirse el cerebro optimizando nuestro código a diestra y siniestra, ya que la mayoría de las veces el tiempo real de ejecución es bueno para el grueso de nuestro código, y el cuello de botella se encuentra en pequeñas porciones de código: búsquedas …

Sigue leyendo →

Pequeños trucos para los QDialogs

Es habitual que nuestras aplicaciones no se restrinjan a una única ventana, sino que se sucedan diversas ventanas de opciones, mensajes, informes, selección de datos, visualización de resultados, etc.

Una de las grandes decisiones que hay que tomar cuando se diseñan estas ventanas es su modalidad que, en lenguaje llano, dice si se puede seguir usando el resto de la aplicación (no modal) o no (modal) mientras esa ventana esté abierta.

Resulta obvio que una ventana no-modal es mucho más compleja de diseñar que una ventana modal, ya que mientras ésta (la ventana no modal) viva seguramente deba comunicarse continuamente con la aplicación (u otras ventanas no modales) para mantener actualizado el estado de ambas (por ejemplo, imaginemos una ventana …

Sigue leyendo →