Archive for March, 2009

Confusión de Programación: Los inicios en C++

Hace 2 semanas y media un compañero de la universidad me presto una biblia de C++. Ese mismo fin de semana me puse a leer el librote y decidí probar el famosísimo “Hola Mundo”, aquí el programa:

#include<iostream.h>;
int main()
{
    cout << "Hola mundo, C++!" << endl;
    return 0;
}

Compilando y de pronto… zaz!!!

Línea 1.- #warning This file includes at least one deprecated or antiquated header.

Resulta ser que hay ciertos estándares que hay que seguir xD (aquí va otra paranoia mia tipo W3C), entonces busque algo de información al respecto y en efecto, ahora ya no lleva .h, ahora simplemente es #include<iostream> así que corregí y compilé nuevamente :D

Línea 4.- In function int main(): cout undeclared (first use this function)
Línea 4.- (Each undeclared identifier is reported only once for each function it appears in.): endl undeclared (first use this function)

Otra vez errores, ahora resulta ser de que cout, endl, cin, etc… necesitan declararse. Una de dos: dejar de programar en C++ por 2 años lo deja a uno bastante desactualizado ó nunca había usado un compilador que se basara en los estándares (en la prepa en la materia de programación estructurada usabamos borland y fueron cosas básicas las que aprendimos ;) ), aunque ya estoy pensando que pueden ser ambas razones pero bueno…

…investigando más sobre el tema encontré que para declararlos hay 3 formas distintas de hacer esto básicamente.

//primera forma[GLOBAL]:
#include<iostream>
using namespace std;
int main()
{
/*instrucciones*/
}

//segunda forma[DECLARANDO UNA POR UNA]:
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
//using std::/*etc..*/;
int main()
{
/*instrucciones*/
}

//tercera forma[DECLARANDO AL MOMENTO DE USO]:
#include<iostream>
int main()
{
	int x;
	std::cout << "Teclee un numero: ";
	std::cin >> x;
	return 0;
}

En la primera forma le estas diciendo al compilador que declare todo lo contenido en el “namespace std” y esto puede causar conflictos al declarar accidentalmente una variable, clase o una función que tenga el mismo nombre que alguna en el “namespace std”, además de estar declarando todo el contenido del “namespace std” el cual posiblemente no llegues a ocupar por completo de modo que solo gastas recursos.

La segunda forma es la que usualmente recomiendan, ya que no declaras todo el contenido del “namspace std” si no solamente lo que usarás de él, sin embargo hasta cierto punto puede resultar poco práctico.

La tercera forma es la que uso yo, ya que de este modo por lo menos para mi queda más claro el código y además no es declarado de manera global, sino solamente donde es utilizado.

Ahora que ya corregi estos errores a compilar se ha dicho!!!

Aquí el nuevo código:

#include<iostream>
int main()
{
	std::cout << "Hola mundo, C++" << std::endl;
	return 0;
}

Perfecto!!! ningún error, ¿a ver el ejecutable? :D

zazzzz!!!! ¿murió el ejecutable? ¿pero por qué se cerro? T_T . Nuevamente a Googlear…
otro tanto tiempo después…
solución!!! usar system(“pause”);, pues bien veamos si funciona correctamente, reescribimos el código…

#include<iostream>
int main()
{
	std::cout << "Hola mundo, C++" << std::endl;
	system("pause");
	return 0;
}

Al compilar esto el programa se detiene y muestra en pantalla un mensaje que dice: “Presione una tecla para continuar…” Vemos que el resultado es el esperado, el programa hace una pausa y al presionar cualquier tecla va al return 0; y se termina el programa, pero… ¿qué tal si quiero personalizar el mensaje?

Esa pregunta para alguien que ya sabe C++ es algo trivial e incluso pensé que encontraría una solución a la vuelta de la web y aunque no fue así de rápido, fue buena idea preguntarme eso ya que googleando la instrucción system(“pause”); me encontré con que no era algo correcto usarla debido a que efectuaba varias acciones:

1. Suspende el programa.
2. Llama al sistema operativo.
3. Abre la consola ó símbolo del sistema (ms-dos) [vuelve a ejecutar el sistema operativo en un subproceso].
4. El sistema operativo debe encontrar el comando PAUSE.
5. Destina la memoria para ejecutar el comando.
6. Ejecuta el comando y espera la pulsación de alguna tecla.
7. Libera la memoria.
8. Sale del sistema operativo.
9. Reanuda el programa.

Además de esto, NO ES COMPATIBLE EN OTROS SISTEMAS OPERATIVOS, es necesario usar winBugs para que la instrucción funcione correctamente, así que en cuanto a portabilidad para compilarlo en otro sistema ni pensarlo, no es multiplataforma.

Investigando al respecto encontré algunas alternativas. Para C: getchar(). Para C++: cin.get(). Como estoy programando en C++ la segunda opción es la necesaria para hacer lo que deseo pero antes de utilizar esta otra instrucción decidí googlear un poco más para ver si había alguna otra alternativa para hacer una pausa y esto fue lo que encontré: getch()

Al tener estas 2 alternativas me dispuse a escribir las sentencias correspondientes, al recompilar el código hubo una diferencia notable pero pequeña entre ambas. El código:

//usando cin.get()
#include<iostream>
int main()
{
	std::cout << "Hola mundo, C++" << std::endl;
	std::cin.get(); //usa std::
	return 0;
}

//usando getch()
#include<iostream>
#include<conio.h> //usa la librería conio.h
int main()
{
	std::cout << "Hola mundo, C++" << std::endl;
	getch(); //fácil de escribir
	return 0;
}

Al usar cin.get() lo que pasó fue que escribía cualquier caracter y aparecía en pantalla, de modo que es necesario presionar enter para cerrar el programa.

Al usar getch() me di cuenta que cerraba el programa al presionar cualquier caracter, de modo que estaba a punto de elegir usar getch() pero al recordar que usaba una líbrería más me puse a googlear nuevamente y me encontré que conio.h no pertenece a la biblioteca estandar de ANSI C y tampoco a la de C++, en efecto como lo podrán ver en los siguientes links: Biblioteca estandar C++, Biblioteca estandar C.

Entonces aquí por comodidad pueden usar getch() aunque es MUY recomendable seguir los estándares ;) además así se evitan incluir una librería extra que por cierto no está en el compilador de GNU/Linux. Ahora con respecto a cin.get() hay situaciones en las que usar esto no funciona como se espera debido a que cuando se pide un dato al usuario este se almacena en el buffer y por tanto para hacer que funcione correctamente cin.get() hay que limpiar ese buffer, para ello se utiliza cin.sync()

Ahora el código final:

#include<iostream>
int main()
{
	std::cout << "Hola mundo, C++" << std::endl;
	std::cin.sync(); /* En este ejemplo no es necesario agregar esta línea de código, solo es una referencia de su uso */
	std::cin.get();
	return 0;
}

Y bien así es como se pone un Hola mundo en C++ xD , trivial ¿no? y a pesar de todo este rollote se me hace más bonito C++ que Visual Basic, amén.

Nota: soy ateo igual que dios, pero pronto me volveré googleista ya que respondio muchas de mis plegarias que fueron expuestas en este post.
Nota2: Si a alguien le sirvió de algo todo este rollo aquí explicado agradezcan a google (y a León!!! xD ).
Nota3: Yo soy León :P .
Nota4: Cualquier error ya sea de sintaxis o de cualquier otro tipo, duda o sugerencia favor de dejar un comentario al respecto.

Referencias: Google, Wikipedia y GIDNetwork

Let Down – Chester Bennington

Esta canción se llama Let Down y es de Chester Bennington, esta canción saldrá en su nuevo disco que esta preparando solo, supuestamente este año saldrá su disco :D !!!. Chester Bennington es el vocalista de Linkin Park, grupo que usa muchas metáforas en sus canciones, así que aquí se presentan algunas :P . Aquí les dejo la letra con su respectiva traducción ;) . Algunas partes fueron traducidas muy literalmente para que quedara a tiempo con la canción :3 .

YouTube Preview Image

And the tears fall like rain
Y las lágrimas cayeron como lluvia
Down my face again
bajo mi cara de nuevo
Oh! the words you wouldn’t say
oh! las palabras que no dirías
And the games you played
y los juegos que jugaste
With my unfoolish heart
con mi sensato corazón
Oh! I should have known this from the start
Oh! debí haber sabido esto desde el principio

Oh! the winter and spring
Oh! el invierno y la primavera
Going hand in hand
Van de mano en mano
Just like my love and pain
Exactamente como mi amor y dolor
How the thought of you cuts deep within the vein
Como el pensar en ti corta profundo dentro de la vena
Oh! this brand new skin stretched across scared terrain
Oh! esta piel nueva se extiende a través de un terreno asustado

I don’t wanna be let down
No quiero ser decepcionado
I don’t wanna live my life again
No quiero vivir mi vida de nuevo
Don’t wanna be led down the same old road
No quiero ser conducido al mismo viejo camino
Said, I don’t wanna be let down
Dije, No quiero ser decepcionado
I don’t wanna live my lies again
No quiero vivir mis mentiras de nuevo
Don’t wanna be led down the same old road
No quiero ser conducido al mismo viejo camino

uh~uh~uh!

All those years down the drain
Todos esos años echados a perder*
Love was not enough
El amor no fue suficiente
When you want everything
Cuando tú querías todo
What I gave to you and now the end must start
Lo que te di a ti y ahora el fin debe empezar
Oh! I should have listened to my heart
Oh! debí haber escuchado a mi corazón

Cause I don’t wanna be let down
Por que no quiero ser decepcionado
I don’t wanna live my life again
No quiero vivir mi vida de nuevo
Don’t wanna be led down the same old road
No quiero ser conducido al mismo viejo camino
Said, I don’t wanna be let down
Dije, No quiero ser decepcionado
I don’t wanna live my lies again
No quiero vivir mis mentiras de nuevo
Don’t wanna be led down the same old road
No quiero ser conducido al mismo viejo camino

…oh~oh~oh!
oh~oh~oh~oh!

I don’t wanna be let down
No quiero ser decepcionado
I don’t wanna live my life again
No quiero vivir mi vida de nuevo
Don’t wanna be led down the same old road
No quiero ser conducido al mismo viejo camino
Said, I don’t wanna be let down
Dije, No quiero ser decepcionado
I don’t wanna live my lies again
No quiero vivir mis mentiras de nuevo
Don’t wanna be led down the same old road
No quiero ser conducido al mismo viejo camino

Nota*: La traducción literal es algo como “bajan al drenaje”
Nota2: No soy traductor xD así que puede contener errores la letra ;) . Espero les guste xD . Próximamente mas MDFs xD .

Ajedrez en Winbugs Vista (Chess Titans)

Eso de llegar al final de un juego con 3 peones como que esta medio feo, al final uno tiene que andarse protegiendo del rey xD

[click en la imagen para verla a tamaño completo 2.~y feria megas xD]

No es de mi agrado terminar un juego de ajedrez asi :S fue una masacre xD y nivel 4 =\ no quiero imaginar el siguiente nivel T_T