Propiedades dinámicas de Qt y algunos usos en interfaces de usuario

Qt ha implementado, como parte de la la estructura de meta-objetos, un sistema de propiedades bastante completo y potente. Como resumen rápido, y dejando muchas cosas en el tintero, se trata de una forma de guardar datos a nivel de objeto sin tener que modificar su implementación, es decir, de forma dinámica:

  • Podemos darle un valor mediante objeto->setProperty("nombre", valor), donde valor es un QVariant.
  • Podemos leer el valor almacenado usando objeto->property("nombre") (devuelve, de nuevo, un QVariant).
  • Por último, podemos borrar la propiedad pasando un QVariant nulo: objeto->setProperty("nombre", {}).

En esta entrada comentaremos algunos usos de las propiedades durante la implementación de interfaces gráficas de usuario: como ayudante de máquinas de estado, indicar el estado de un …

Sigue leyendo →

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 →