Maldita sea…!

Un sabor amargo me queda despues de hoy!

Sucede que estamos en medio de la implantación de un pequeño software en la Municipalidad de Puno y hace algunas horas nos dimos con la sorpresa que el tipo de dato time_t incrustado en la clase CTime solo soporta fechas desde 01/01/1970 al 31/12/2039… maldita sea!

Tendremos que trabajar algunas horas extra solucionando ese «problemita».

Se había tomado la decisión de guardar las fechas en segundos para poder hacer mejor los cálculos posteriormente, creo que eso no va a cambiar. Pero se trabajo de igual manera con el resto de campos de tipo fecha. (craso error)

El problema saltó cuando se intentó registrar a alguien que había nacido en el año 1949: ¡Horror!

¿Por que no nos dimos cuenta? Aun que el problema pueda ser solucionado con unas cuantas líneas de código y previa modificación del modelo de la base de datos, ¿Por qué no pensaron en esto? (Esto se parece al problema de la memoria base de 256K) Creo que echarle la culpa a otros es de malos amigos, así es que dejémoslo ahí.

De ahora en adelante, utilizaremos la clase COleDatetime que evitarán sorpresas futuras y post’s como éste.

PD. Hay que estar preparados para el año 2039.

Articulos enviados en Marzo

Las semanas que pasaron nuestro servidor ha estado muy inestable, perdimos 2 meses de activad y muchos archivos, pero finalmente nos recuperamos del desastre y seguimos adelante con Latindevelopers.com

Teníamos pendientes 4 articulos por publicar:

Shell para Simulación

LaPetite – La Aplicación M.F.C. mas Pequeña

ImageCtrl

CARGAR JPG, GIF, BMP todo en uno

Espero que no vuelva a suceder el mismo desastre o que no afecte tanto a la comunidad.

Las proximas semanas vamos a terminar de implementar algunas secciones del site.

CString Trim

Quienes programamos en MFC Visual C++ algunas veces hemos tenido que eliminar los espacios en blanco de una cadena y sucede que la clase CString no tenia una sola funcion trim, sino las funciones TrimLeft y TrimRight.

Nose por que diablos demoraron tanto (o no se dieron cuenta) en agregar esa funcioncita.

Lo que se hacia normalmente es:

m_sCadena.TrimLeft();

m_sCadena.TrimRight();

Esto ahora ha causado un problema de compatibilidad con las versiones anteriores y no creo que sea la unica.

Leer datos MySQL desde C++ sobre Linux

Resulta que algunas veces es necesario acceder desde C/C++ a MySQL, razones hay muchas…. el asunto es como hacerlo.

Antes de hacer cualquier cosa debemos instalar las librerías de desarrollo de MySQL:

sudo apt-get install libmysqlclient-dev

Todos los archivos que necesitaremos van a estar ubicados en /usr/include/mysql y /usr/lib/mysql , los parámetros para compilar un archivo simple es como sigue:

gcc archivo.cpp \
           -o archivo \
           -I/usr/include/mysql -L/usr/lib/mysql \
           -lmysqlclient -lstdc++ -lz

Una breve descripción de los parámetros:

  • -o (output) indica el nombre que va a tener el archivo de resultado
  • -I le dice al compilador que incluya una ruta adicional para los archivos de inclusión
  • -L le dice al enlazador que incluya una ruta adicional para los archivos de librería dependientes
  • -l (ele minuscula) le dice al enlazador que incluya la librería especificada
  • \ es el caracter que usamos en la linea de comando para ejecutar varias lineas como una sola expresión.

Escribí para ustedes un código de ejemplo, no es gran cosa pero les va a dar luces para sus proyectos:

//conexion.cpp
#include 
#include 
#include 
 
using namespace std;
 
int main(int argc, char *argv[])
{
    MYSQL mysql;
 
    mysql_init(&mysql);
    if (!mysql_real_connect(&mysql
		,"localhost"
		,"root"
		,""
		,"ciudades",0,NULL,0))
    {
        cerr<<"Horror ! : "
	    <

El resultado de la ejecución es:

ivancp@ubuntu$ ./conexion
01 AMAZONAS
02 ANCASH
03 APURIMAC
04 AREQUIPA
05 AYACUCHO
06 CAJAMARCA
07 CALLAO
08 CUSCO
09 HUANCAVELICA
10 HUANUCO
11 ICA
12 JUNIN
13 LA LIBERTAD
14 LAMBAYEQUE
15 LIMA
16 LORETO
17 MADRE DE DIOS
18 MOQUEGUA
19 PASCO
20 PIURA
21 PUNO
22 SAN MARTIN
23 TACNA
24 TUMBES
25 UCAYALI

Espero les sirva mucho!

Coding Standards

Al empezar con esto de la programacion uno adopta una forma de escribir el codigo. Este codigo no siempre es bien visto por quienes tiene experiencia (como si se tratara de caligrafia).

No habia nada dicho al respecto de los estandares de codigo fuente, pero muchos se animaron a establecer estandares de «caligrafia» para el C/C++.

En este enlace pueden encontrar reglas que pueden seguir sin miedo para escribir sus programas en C/C++:

Coding Standards
http://www.possibility.com/Cpp/CppCodingStandard.html

GNU tiene sus propios estandares que hay que seguir para escribir codigo para GNU Linux. Se podria decir que es lo mismo, pero en este caso estas reglas estan hechas no solo para escribir codigo limpio sino tambien para que otros programadores entiendan lo que uno ha programado.

GNU Coding Standards
http://www.gnu.org/prep/standards/standards.html

Por mi parte puedo contarles que no me agrada mucho escribir las funciones de esta manera:

void
funcion (var1,var2)
int var1,
int var2
{
  //...
}

Por otro lado es mejor tener los corchetes bien acomodados para entender los bloques.

Prefiero que se vea asi:

int main(int argc, char *argv[])
{
	char str[80];
	while(cin.getline(str,80))
	{
		int len = strlen(str);
		cout<<endl;
		for(int i = 0 ; i < len ; i++)
		{
			cout<<ind(str[i],0,44);
		}
	}
	return 0;
}

que asi:

int main(int argc, char *argv[]){
	char str[80];
	while(cin.getline(str,80)){
		int len = strlen(str);
		cout<<endl;
		for(int i = 0 ; i < len ; i++)
		 cout<<find(str[i],0,44);
	}
	return 0;
}

Nuevo Articulo: Same Game

En una de esas encontré el problema del SameGame en la ACM. [Ver : http://acm.uva.es/p/v7/758.html]

Despues de resolverlo me animé a programar el juego en Visual C++ 6.0. Ya que hace mucho tiempo no programaba juegos y cosas asi para poder desestresarme. Espero que les guste.

Para poder resolver este problema utilicé un algoritmo de búsqueda recursiva simple, hace un tiempo atras (varios años) programé el juego de Bubble Puzzle ,con listas de listas y listas doblemente enlazadas, toda una complicación para aprobar el curso de Estructuras de Datos en el cual se eliminaban las bolitas de igual forma.

SameGame


SameGame.exe

El codigo fuente del juego lo pueden descargar de SameGame – Visual C++. Le hacen falta muchas mejoras, como por ejemlo: implementar la animación de la eliminación de los elementos, almacenar el score de los jugadores, mejorar la animación al estilo SameGame para linux, implementar una versión para linux, etc, etc.

Si alguien se anima a mejorarlo o ha encontrado un bug, puede enviarme un mail con las mejoras y volverlo a publicar.

Update:

Ahora pueden descargarse el juego compilado. (si presenta errores al momento de ejecutar envienme un mail)

Minesweeper – Busca minas

Minesweeper es uno de los cientos de problemas de la ACM, la idea es basicamente elaborar un programa que resuelva o simule ej juego del buscaminas. Pueden ver los detalles del problema en esta pagina: http://acm.uva.es/p/v101/10189.html

El problema planteado solamente tiene una entrada simple, pero pueda que la solución que estén elaborando no contemple todas las posibilidades. Para ello implementé un programita en c++ para generar entradas de ejemplo para el programa que estén desarrollando del tamaño que se indique, puede serles de mucha utilidad para testear sus programas.

#include <iostream.h>
int main(int argc, char* argv[])
{
    if(argc < 3)
    {
       cout<<"\nUso:\t"<<argv[0]<<" [N] [M] ";
       return 1;
    }

    int n = atoi(argv[1]);
    int m = atoi(argv[2]);
    cout<<n<<" "<<m<<endl;
    for(int i = 0; i < n ;i++)
    {
       for(int j = 0; j < m ;j++)
       {
          if(rand()%14 == 0)
          {
             cout<<"*";
          }else
          {
             cout<<".";
          }
       }
       cout<<endl;
    }
   cout<<"0 0";
	return 0;
}

El programa produce la siguiente salida.

15 30
...............*.....*........
.*.....*......................
.................*.*...*......
...*.......*.*.....*..........
....................*.........
.............*...............*
........*.................*...
*.....*...*........*..........
..............*....*......*...
.*............................
.........*..........*.........
.......*.*....................
................*.............
..*.*....*....*..*.........*..
..............................
0 0

La salida de sus soluciones debería ser como sigue:

Field #1:
111000111000001*10001*10000000
1*10001*1000001121212121100000
11211011101121101*3*201*100000
001*1000001*2*10113*3111100000
00111000001132200012*100000011
0000000111001*100001110001111*
11000112*21111100011100001*111
*10001*212*10111002*2000022200
22100111011101*1002*200001*100
1*1000001110011100122100011100
111000113*2000000001*100000000
0000001*3*20000111011100000000
0112111132200112*2100000001110
01*2*1001*1001*22*100000001*10
011211001110011111100000001110

Si necesitas alguna ayuda adicional puedes consultarla en el foro de programación c++.

Grafos

Los grafos son un tipo de estructuras de datos; no voy a explicar exactamente de que se tratan los grafos pero pueden encontrar mas información al respecto aqui.

Llegar a implementar en forma básica listas, árboles y grafos es una parte importante en los inicios de la carrera de un programador. Por lo que estoy preparando pequeño artículo sobre como implementar grafos.

Lo interesante de este articulo, que desarrollé hace algunos años, es que lo combiné con un algoritmo de ordenación grafica basada en distancias y para que el parpadeo no moleste lo implementé con double buffering.

Aquí un recorte de muestra del programa en ejecución.

Grafo Visual C++

Pueden descargarse un demo ejecutable, por lo pronto, en el siguiente enlace:

grafos.zip

Cuando lo tenga completamente listo voy a publicarlo documentado y podrán descargarlo con código fuente que podran compilar en diferentes sistemas operativos. Espero que luego les pueda servir como punto de inicio y llegar mas lejos con las estructuras de datos.

Update: Pueden descargar el artículo de la siguiente dirección:

Implementacion de Double Buffer en Visual C++:
http://www.latindevelopers.com/vcpp/bitmap/doble-buffer/

EXPRESS OLE DB – Visual C++

Cuando uno empieza a desarrollar aplicaciones en Visual C++ y tiene la necesidad de acceder a datos, se presentan muchas alternativas para ello. Muchas de las alternativas no se llevan bien entre ellas mismas lo que hace que la migración o el cambio de tecnología sea doloroso (ADO, DAO, OLE DB, etc)

Sypram es una compañía que ha desarrollado una librería que permite realizar una conexión a una base de datos desde Visual C++: EXPRESS OLE DB es una librería completa que extiende el uso de OLE DB sin la complejidad de éste. Es de muy fácil utilización y una alternativa muy robusta para el acceso a base de datos en Visual C++.

Actualmente utilizo esta librería en mis aplicaciones, pero aun sigo utilizando DAO como segunda alternativa.

Lo mejor de todo es que esta librería es de de distribución LIBRE. Puede ser descargada desde:
http://sypram.com/Download.htm

MySQL y Visual C++

MySQL es un gestor de base de datos en plena evolución, inicialmente captó mi atención (como muchos) por que es liviano, rapido, confiable. Tiene algunos problemas en situaciones extremas, aun asi sigo siendo su fiel seguidor.

Como programador debo comentarles que, como casi todos los gestores, MySQL provee unas API’s que estan escritas en C/C++ las cuales pueden incluirse para implementar aplicaciones de acceso a base de datos sin necesidad de ODBC y esas cosas.

Para ello escribí un articulo respecto a eso: Como acceder a una base de datos MySQL desde Visual C++. Seguramente los seguidores mas romanticos del movimiento de Software Libre (el cual apoyo) se escandalicen al ver tal combinación, pero quienes utilizamos Visual C++ sabemos que no existe mejor compilador para Windows.

Estoy escribiendo un programa con las librerías GTK para que pueda correr en Linux. Pronto lo tendré listo.

Mientras tanto pueden descargar el articulo incluyendo el codigo fuente del proyecto y algunos archivos necesarios en esta dirección:

https://www.latindevelopers.com/ivancp/articulos/mysqlapi.pdf

Para que puedan tener mas referencia respecto a las API’s de MySQL pueden visitar:

http://dev.mysql.com/doc/mysql/en/mysql-apis.html