Publi

  • Callbacks en C++11, ejemplos con argumentos por referencia y templates (III)

    7544361624_5fb63e7250_k

    Volvemos a dar guerra con el tema que empezamos hace unas semanas, si no has seguido esta serie de posts te recomiendo echar un ojo a Callbacks en C++11 nuevas posibilidades para un software más potente y Callbacks en C++11, llamando a métodos con un objeto asociado. En ellos pongo muchos ejemplos de cómo asociar funciones o métodos a variables.

    Argumentos por referencia

    Es un tema que hemos dejado un poco de lado, pero sólo quiero hacer una pequeña puntualización.… Leer artículo completo

  • Callbacks en C++ con boost

    Hemos visto las retrollamadas o callbacks tanto en C como en C++, aunque en este último, era un poco difícil. También, utilizando Glib, con Gtkmm se expresaban los callbacks que se realizan cuando se lleva a cabo una acción.

    Ahora le toca el turno a la biblioteca boost para C++, y así ver el método más sencillo. Para probarlo, primero tenemos que tener instalada la biblioteca. En el ejemplo vemos cómo le pasamos una función (A) como argumento a otra función (B), y ésta última ejecutará A.… Leer artículo completo

  • 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

  • Algoritmos: Probar la existencia de un fichero con open() en C

    Estos días a varios de mis alumnos les ha surgido la necesidad de probar la existencia de un archivo haciendo la llamada al sistema open(). Es bastante sencillo, sólo hay que probar si éste se ha podido abrir (como lectura, por ejemplo, para no tocar el fichero en la medida de lo posible).
    Una vez se abre el fichero pueden ocurrir varias cosas:

    • que la llamada a open() no devuelva error.
    Leer artículo completo
  • Escribiendo en muros desde nuestra aplicación de Facebook

    fb_website3 Uno de los usos más extendidos de las aplicaciones de Facebook es el de escribir en el propio muro o en el muro de nuestros amigos. Vamos a hacer un ejemplo de esto utilizando la Graph API de Facebook, a través de la biblioteca oficial que ellos nos dejan en GitHub. Para empezar a crear la aplicación os recomiendo leer este post anterior donde se dice paso a paso cómo se debe crear y cómo empezar a escribir código.… Leer artículo completo

  • Listas enlazadas en Arduino (primera versión)

    Es parte de un proyecto personal que quiero compartir. Se trata de una clase para utilizar listas enlazadas desde Arduino, aunque la memoria RAM de estos bichillos no sea gran cosa (1K para la versión Diecimila), puede dar para mucho, y es que hay ocasiones en las que podemos necesitar esta flexibilidad a la hora de almacenar y acceder a la información (aunque no pueda ser mucha).

    La clase ha sido desarrollada utilizando templates, por lo que podréis particularizar esta clase para cualquier tipo de dato que estéis manejando.… Leer artículo completo

  • Callbacks, retrollamadas o delegados o cómo crear código más flexible en C

    Uno de los grandes objetivos de la programación es la de evitar repetirse. Ok, depende del contexto en el que estemos trabajando. Pero en general, querremos escribir poco cuando trabajamos en un proyecto (y así terminamos antes) y de paso que lo que escribamos para un programa nos sirva para otro (reaprovechamiento del código).

    Un callback nos permite llamar a una función u otra dependiendo de la ocasión. Imaginemos dos funciones y la función principal (la sintaxis utilizada nos es correcta, pero mi objetivo es que en este punto se vea claramente)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void funcion_a()
    {
      printf("Has llamado a la función A");
    }  

    void funcion_x(funcion ayudante)
    {
      printf("Aquí procesamos información");
      ayudante();
      printf("Aquí seguimos procesando información");
    }

    int main()
    {
      funcion_x(funcion_a);
    }

    Lo que hcemos es llamar a función_x() y, como parámetro, le decimos que llame a funcion_a(), lo que conseguimos es que cuando funcion_x() esté ejecutándose, necesitará ayuda en algún momento de otra función, y desde main() decimos que esa función sea funcion_a().… Leer artículo completo