Publi

  • 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

  • Invocando métodos por su nombre (en string) con C++

    Vamos a implementar una pequeña aplicación en la que el usuario pueda elegir el método de la clase que va a ejecutarse, vamos a tener una clase en la que crearemos varios métodos «ejecutables» por el usuario.
    En el ejemplo que presento, aunque sea un poco repetitivo, estoy suponiendo que C++ no tiene reflexion, esto, dicho de una forma rápida es que una clase tenga la facultad de conocer sus miembros, podremos llamarlos, pero no podremos decirle que nos dé una lista.… 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

  • Guardar un log con las excepciones producidas en C++

    logSobre todo a la hora de crear un programa se pueden generar muchas excepciones, bueno y cuando estamos usándolo de forma normal también, y todos sabemos del típico cliente/amigo/usuario que nos llama de madrugada o a una hora normal diciendo:
    – «El programa me da error» –
    – «¿Qué error te da el programa?» – respondemos
    – «Nada error, solo eso» –
    – «Bueno, ¿seguro que no salía nada más?» – insistimos
    – «Sí, muchas letras y cosas que no tenían sentido» – nos responde para bajarnos la moral – «¿qué puede ser?»
    Nuestra respuesta ahora depende de la relación que tengamos con esa persona, ya sea cliente, amigo, usuario, desconocido… o destornillador, digo, desarrollador (que hay algunos que también…).… Leer artículo completo

  • Obtener la fecha y hora formateada en C

    Es un código muy simple, aunque tal vez si estáis empezando os resulte muy útil para que vuestros programas sean capaces de decir la hora o hacer alguna operación con la fecha

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

    int main()
    {
      time_t t;
      struct tm *tm;
      char fechayhora[100];

      t=time(NULL);
      tm=localtime(&t);
      strftime(fechayhora, 100, "%d/%m/%Y", tm);
      printf ("Hoy es: %s\n", fechayhora);
    }

    La forma de utilizar strftime() es pasando los siguientes parámetros:

    • Un array de char o char* donde almacenaremos la cadena de caracteres resultante
    • El tamaño máximo de caracteres que podemos ocupar, es decir, el tamaño reservado para la variable anterior
    • El formato en el que queremos presentar los datos, con algunas palabras clave que indicarán dónde va cada uno de los datos, los más importantes son:
      • %s : Número de segundos desde la época: 1 de Enero del 1970 a las 00:00
      • %d : Día del mes (del 01 al 31)
      • %m : Mes (del 01 al 12)
      • %Y : Año (con 4 cifras.
    Leer artículo completo
  • Creando un servidor que acepte múltiples clientes simultáneos en C

    5989707041_64de393f6b_oPara hacer una prueba de esto, crearemos un servidor al que nos podremos conectar por telnet y pedir cierta información a través de comandos. El ejemplo soporta los siguientes comandos (en mayúsculas):

    • DATE: Pide la fecha al servidor
    • TIME: Pide la hora al servidor
    • HOLA: Saluda y me dice mi IP
    • EXIT: Cierra el cliente actual
    • CERRAR: Cierra el servidor.
    • Cualquier otra cosa se manda repetida (ECHO)
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    /**
    *************************************************************
    * @file servtcp.c
    * @brief Breve descripción
    * Ejemplo de un cliente TCP usando threads
    *
    *
    * @author Gaspar Fernández <blakeyed@totaki.com>
    * @version 0.1Beta
    * @date 13 ene 2011
    * Historial de cambios:
    *   20110113 - Versión inicial
    *
    *
    *************************************************************/


    #include <fcntl.h>
    #include <string.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <stdio.h>
    #include <netinet/in.h>
    #include <resolv.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <pthread.h>
    #include <string.h>

    /** Puerto  */
    #define PORT       7000

    /** Número máximo de hijos */
    #define MAX_CHILDS 3

    /** Longitud del buffer  */
    #define BUFFERSIZE 512

    int AtiendeCliente(int socket, struct sockaddr_in addr);
    int DemasiadosClientes(int socket, struct sockaddr_in addr);
    void error(int code, char *err);
    void reloj(int loop);

    int main(int argv, char** argc){

        int socket_host;
        struct sockaddr_in client_addr;
        struct sockaddr_in my_addr;
        struct timeval tv;      /* Para el timeout del accept */
        socklen_t size_addr = 0;
        int socket_client;
        fd_set rfds;        /* Conjunto de descriptores a vigilar */
        int childcount=0;
        int exitcode;

        int childpid;
        int pidstatus;

        int activated=1;
        int loop=0;
        socket_host = socket(AF_INET, SOCK_STREAM, 0);
        if(socket_host == -1)
          error(1, "No puedo inicializar el socket");
       
        my_addr.
    Leer artículo completo
  • Preincremento y postincremento (x++ != ++x)

    Hace unos días un alumno de clases particulares me preguntó la diferencia entre estos dos; me pareció una pregunta interesante ya que los únicos usos que había visto eran como única sentencia:

    a++;
    ++a;

    En este uso no hay diferencia, puesto que hagamos las cosas en el orden que las hagamos el resultado será igual; aunque en este ejemplo tampoco se tiene clara la idea del orden de las operaciones. Pero veamos otro ejemplo:

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

    int main(int argc, char *argv[])
    {
      int a=10;
      int b;

      b=a++;
      printf("a=%d\nb=%d\n", a, b);
    }

    Vemos que estamos realizando un postincremento de a, o lo que es lo mismo, incrementamos la variable a después de las demás operaciones (asignar a b el valor de a).… Leer artículo completo

  • Número variable de argumentos en una función de C

    photo-1416339212457-ef9ffadc2903_rSi habéis programado en C, seguramente la primera función que aprendisteis a utilizar era printf() ; y en todo el tiempo que pasasteis estudiando C no encontrasteis una función similar. Y es que esta función puede tener un número indeterminado de parámetros y es capaz de analizarlos todos.

    Y es que quitando printf(), scanf() y derivadas de estas, la necesidad de una función con múltiples parámetros casi no se nos presenta.… Leer artículo completo

  • Programar en C++ puede llegar a ser frustrante

    cuchilloSiempre se dice que una de las reglas de la programación es «escribir poco», tenemos que aunque en ciertos lenguajes, tenemos que escribir dos veces las cosas. Por ejemplo, para un sencillo hola mundo con clases en C++ (se puede hacer todo en el mismo archivo, pero queremos el código bien organizado):
    [ hwclass.h ]

    1
    2
    3
    4
    5
    6
    7
    8
    class HolaMundo
    {
     public:
      HolaMundo();
      ~HolaMundo();

      void coutVersion();
    };

    [ hwclass.cpp ]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <iostream>
    #include "hwclass.h"

    using namespace std;

    HolaMundo::HolaMundo()
    {
      cout<<"Hola Mundo!!"<<endl;
    }

    HolaMundo::~HolaMundo()
    {
      cout<<"Adiós Mundo!!"<<endl;
    }

    void HolaMundo::coutVersion()
    {
      cout<<"HolaMundo Versión 1.0"<<endl;
    }

    [ main.cpp ]

    1
    2
    3
    4
    5
    6
    7
    #include "hwclass.h"

    int main()
    {
      HolaMundo hm;
      hm.
    Leer artículo completo