Publi

  • C++ Punteros a función miembro (pointer-to-member function) o callbacks con clase


    Otra de las características que dan a C++ mucha más flexibilidad son los punteros a miembro. Éstos nos permiten trabajar con elementos que podemos encontrar dentro de una clase, un struct o una union. Y el mejor ejemplo lo encontramos a la hora de hacer callbacks, si repasamos los callbacks en C inmediatamente veremos que en un lenguaje orientado a objetos necesitamos poder acceder a métodos dentro de una clase. Si hacemos un ejemplo parecido al de aquel post, podemos demostrar que la misma manera podemos acceder a métodos estáticos dentro de la clase:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #include <iostream>
    #include <cstring>

    using namespace std;

    /* TYPEDEF */
    typedef int (*funcion_callback)(char*);

    class MyClass
    {
    public:
      static int eco(char *cadena)
      {
        cout << "Eco: "<<cadena<<endl;
        return (strlen(cadena));
      }
    };

    /* DECLARACIÓN DE LLAMADORA */
    void generaecos(funcion_callback func)
    {
      int num;
      cout << "Voy a llamar al eco con el texto HOLA" << endl;
      num=func((char*)"HOLA");
      cout << "La he llamado y me ha devuelto: "<< num << endl;
    }

    int main()
    {
      generaecos(MyClass::eco);
    }

    Pero cuando queremos llamar a un método no estático de la clase fallará sin miramientos, ya que necesitaríamos la información del objeto en el que se encuentra el método, y de esta forma estaríamos pasando directamente una dirección de memoria (al ejecutar la función no encontraría el puntero this, entre otras cosas).… Leer artículo completo

  • Conectar frei0r con imageMagick para crear efectos de vídeo

    Hace unas semanas hablábamos de cómo podemos utilizar imageMagick y su API MagickCore para aplicar efectos de imagen en nuestros proyectos de forma sencilla. Ahora vamos a darle más vida a esto y vamos a permitir la utilización de los efectos de imageMagick desde la API frei0r. De esta forma, pondremos estos efectos a disposición del framework MLT y por extensión a todas las aplicaciones que lo utilizan, como por ejemplo Kdenlive.… Leer artículo completo

  • Generando fotogramas de vídeo en C con frei0r (y MLT) [Parte II – Generando filtros]

    Ahora le toca el turno a la creación de filtros, y de paso presento algunas utilidades más para frei0r de mi cosecha (con alguna que otra función copiada de algún lado).

    Esta vez, entre otras cosas, aunque habrá mucho código sin documentar por aquí, vamos a ver cómo podemos dar para cada canal de la imagen, la porción de rojo, verde y azul que queramos, sólo para practicar la creación de un filtro sencillo.… Leer artículo completo

  • Leer y procesar imágenes en C gracias a ImageMagick y su API MagickCore


    El mundo de la imagen por ordenador me encanta, y llega el momento de aplicar ciertos efectos desde código, y evitarnos tener que ejecutar un programa externo, gastando así más memoria y tiempo. Pero por otro lado, en ocasiones algunos algoritmos sobre las imágenes son demasiado complejos y no tenemos tiempo para investigar cómo hacer el algoritmo, buscar especificaciones de efectos que suelen traer todos los programas de edición de imágenes, pero que nos pueden hacer perder varios días de trabajo de investigación.… Leer artículo completo

  • Enlazado dinámico en C++ (dynamic linking) IV: Permitir plug-ins en nuestra aplicación

    Un ejemplo práctico de uso del enlazado dinámico es la posibilidad de crear plug-ins para nuestros programas. Estos plug-ins nos permitirán aumentar las funcionalidades de nuestro programa sin necesidad de recompilarlo, utilizando el código de añadidos binarios. Para poder «hablar» con los demás binarios, es necesario haber establecido antes unas normas para ese diálogo.

    Intentaré poner un ejemplo más o menos completo, pero sencillo, y se podrá descargar el código fuente al final del artículo (serán bastantes archivos).… Leer artículo completo

  • Enlazado dinámico en C++ (dynamic linking) III: Carga dinámica de objetos

    Hasta ahora, en varios artículos referentes a este tema: Introducción a dynamic linking, Carga dinámica de bibliotecas, hemos visto como, en lenguaje C, podemos escribir bibliotecas de funciones y, sin necesidad de conocer su código fuente, ejecutar funciones encerradas dentro de esas bibliotecas en nuestros proyectos, así como cargar dicho código al vuelo.

    Pero todo se complica un poco cuando queremos hacer lo mismo con C++, y en concreto, cuando estamos exportando clases completas, ya que de primeras necesitamos una forma de traernos algo parecido a un tipo, el nombre de la clase, y con dlopen() y dlsym(), nos podemos traer sólo una referencia de memoria, por lo que junto con la clase que programemos en C++ tendremos que incluir una función que llame al constructor.… Leer artículo completo

  • Enlazado dinámico en C (dynamic linking) II: Carga dinámica de shared objects

    La semana pasada vimos una introducción y cómo podíamos hacer una carga estática de bibliotecas dinámicas o shared objects.

    Hoy dedicaré el post a la carga dinámica, esto es, no hace falta que el objeto exista para poder compilar el programa principal, y el programa principal, no tiene por qué saber que lo va a utilizar hasta el último momento en que lo esté utilizando. Pueden utilizarse para extender la funcionalidad de nuestra aplicación una vez esté construida, puede que por nosotros, o por otra persona.… Leer artículo completo

  • Enlazado dinámico en C (dynamic linking) I: Introducción

    Algo que nos abre un mundo de posibilidades a la hora de realizar nuestros programas es la forma de enlazar los archivos objeto en nuestro binario definitivo. Ésta puede ser dinámica o estática.

    La forma estática es la que se utiliza desde el primer momento que se empieza a programar: hemos creado varios archivos .c y queremos utilizar funciones de otro archivo dentro del archivo principal, con el objetivo de dividir el código en partes y no trabajar desde el mismo archivo.… Leer artículo completo

  • Generando fotogramas de vídeo en C con frei0r (y MLT) [Parte I – Introducción]

    frei0r es una API Sencilla para crear efectos de vídeo capaz de generar vídeo, filtrarlo y generar transiciones entre dos o tres fuentes de vídeo. Lo realmente interesante de esta API es que la utilizan otras APIS más grandes para generar parte de sus efectos (como FFMPEG (hay que compilarlo con soporte frei0r), MLT, GStreamer, etc) y es usado además por aplicaciones de vídeo com Lives, Open Movie Editor y por supuesto, está presente en aplicaciones que utilizan MLT como KDEnlive, OpenShot o ShotCut.… Leer artículo completo

  • Traducciones para nuestras aplicaciones C/C++ con gettext

    4929705941_5cc3aca475_oHace un tiempo publiqué cómo traducir nuestras aplicaciones PHP con gettext, ahora le toca el turno a nuestras aplicaciones en C.

    El procedimiento es muy parecido, por lo que no voy a especificar la creación de ficheros po y mo en este artículo, os remito al anterior.

    El código fuente no es que varíe demasiado de PHP pero es interesante echarle un ojo. Si queremos traducir este programa:

    1
    2
    3
    4
    5
    6
    7
    8
    #include <stdio.h>

    int main(int argc, char *argv[])
    {
      printf("Hello world\n");
     
      return 0;
    }

    Haremos algo parecido a lo siguiente:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <stdio.h>
    #include <libintl.h>
    #include <locale.h>

    int main(int argc, char *argv[])
    {
      char *locale="fr_FR.UTF-8";
      setlocale(LC_MESSAGES, locale);
      bindtextdomain("miProyecto", "locale/" );
      textdomain("miProyecto");

      printf(gettext("Hello world"));
     
      return 0;
    }

    Ahora, si tenemos el archivo locale/fr_FR/LC_MESSAGES/miProyecto.mo dentro, veremos el mensaje en francés.… Leer artículo completo