Publi

  • Jugando con threads y mutex en C++11

    Hace poco tuve un problema en el que la concurrencia era fundamental para realizar la tarea en el mínimo tiempo posible, y decidí darle una oportunidad a C++11 y a algunas de sus nuevas características (todo esto ya lo podíamos hacer con las bibliotecas Boost por ejemplo, pero da alegría poder hacer muchas cosas desde std 🙂

    Aprovechando mi experiencia he decidido poner un pequeño ejemplo de cómo realizar una aplicación concurrente en esta revisión de C++, cosa que veo la tarea más fácil del mundo y, por supuesto nos beneficiará a todos a la hora de buscar el paralelismo.… Leer artículo completo

  • Utilizando expresiones regulares en C++ con Glib::Regex

    En nuestra vida como programadores, se marca un hito cuando aprendemos a utilizar las expresiones regulares… es más, son como Twitter, cuando lo conoces, entras un par de veces y lo abandonas durante un tiempo, pero cuando llega tu momento, no puedes vivir sin él. Aquí pasa igual, la primera vez que lo ves y lo entiendes dices: «Mira qué curioso», pero cuando pasa un tiempo, siembre que hay algún problema con cadenas de texto, las expresiones regulares surgen en tu mente.… Leer artículo completo

  • Reemplazar cadenas en C++, esta vez desde un map, para múltiples sustituciones

    Hace unos días hablamos de cómo reemplazar cadenas de texto en C++, tuvimos un método para copiar y pegar en nuestros proyectos muy fácil, pero cuando queremos hacer múltiples sustituciones podemos tener un problema: demasiadas llamadas a la función que producirán un código un poco feo…

    Para ello podemos utilizar el contenedor map de C++ y crear la misma función replace() que creamos hace unos días, pero esta vez aceptando un mapa como argumento, así buscaremos en cada una de las claves, y lo sustituiremos por cada uno de los valores que encontremos:

    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
    #include <iostream>
    #include <string>
    #include <map>

    using namespace std;

    string replace(string source, std::map<string,string>strMap, int offset=0, int times=0)
    {
      int total = 0;
      string::size_type pos;

      for (std::map<string, string>::iterator i=strMap.
    Leer artículo completo
  • Bug corregido en stermp y ya puestos lo subo a github

    Como algunos de vosotros me habéis enviado mensajes referentes a stermp (aquella colección de funciones que hice para utilizar algo parecido a conio.h desde Linux), lo he publicado en GitHub.

    Además, he arreglado un pequeño bug que afectaba a algunos ordenadores y sólo algunas veces cuando se recibía información de posición por ejemplo.

    Disponéis del código fuente de los archivos aquí, stermp.tar: 4.7Kb.

    También podéis visitarla como puse antes en GitHub, y también se podrá ver en algún que otro lado.… Leer artículo completo

  • Reemplazar cadenas de texto en C++ (string y Glib::ustring)

    Una herramienta muy útil a la hora de hacer nuestros programas es buscar y reemplazar texto de una cadena de caracteres. Imaginad por ejemplo el uso de plantillas, éstas serán cadenas de texto en las que reemplazaremos algunas palabras clave para generar el mensaje, o la salida que queremos. En principio, hacemos uso de las llamadas a métodos de string para encontrar una subcadena de texto dentro de una cadena, y más adelante reemplazarla por otra:

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

    using namespace std;

    int main()
    {
      string original = "Me voy a dormir, que todos sabemos que a partir de las 12 de la noche es hora de dormir.";

      string::size_type pos = original.
    Leer artículo completo
  • Copiar en el portapapeles un texto desde la línea de comandos [C]

    En ocasiones, cuando estamos haciendo shell scripts, surge la necesidad de copiar algo al portapapeles para que el usuario lo utilice, en principio, podemos utilizar xclip, aunque ese sería el portapapeles de X11, ese con el que se copia seleccionando con el ratón, y se pega con el botón del centro (o izquierdo+derecho si emulamos el botón central).
    Pero para dar algo de usabilidad (Control+V), y no queremos obligar al usuario a configurar sus gestores de portapapeles, esos grandes desconocidos que suelen estar ahí y nunca hacemos caso…

    Podemos hacer este pequeño programa en C, que utilizará Gtk para acceder al portapapeles, y escribir en él.… 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

  • Obtener el directorio personal del usuario (HOME) en C

    Muchas veces, en nuestros programas, es necesario conocer el directorio personal del usuario actual, para leer o escribir archivos, aquí traigo una función muy pequeña que hace este trabajo:

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <sys/types.h>
    #include <pwd.h>

    char *getHomeDir()
    {
      static char *home = NULL;
     
      if (!
    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

  • Algoritmos: Repartir el tiempo total de una tarea a lo largo de varios días en C

    Cuando tenemos una tarea que debemos llevar a cabo a largo medio/plazo, normalmente debemos dedicar un tiempo cada día a esa tarea pero, ¿cuánto tiempo necesitamos dedicar a esa tarea (como mínimo) para terminar en un plazo establecido?

    Gracias a Alejandro por la sugerencia de este programa.

    Primero el programa, y luego lo comentamos:

    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
    /**
    *************************************************************
    * @file calcula_horas.c
    *************************************************************/


    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    #include <string.h>

    typedef struct
    {
      int hours;
      int minutes;
      float raw;
    } Thm;

    time_t getTime(int day, int month, int year);
    int calculateDaysInRange(int daysInRange[7], time_t start, time_t end);
    int calculateTotalDays(int workDays[7], int daysInRange[7]);
    int calculateHoursADay(Thm *result, int totalDays, int hoursToWork, int totalHours);

    int main(int argc, char *argv[])
    {
      int error;
      int i ;
      int totalDays;
      time_t start = getTime(1, 6, 2013);
      time_t end = getTime(18, 6, 2013);
      /* Which days can we work in this task?
    Leer artículo completo