gentoo linux, java, software libre y otras hierbas
may, 28 2007 - 3:49 pm

Tutoriales de Programación de Pics [semi-actualizados]

Algunos tutoriales de Programación de Pics…

Espero les sirva!!!

3 Comentarios | deja el tuyo

mar, 02 2007 - 9:02 pm

Editores de texto en Linux

Como ya debes saber, lo primero que necesitamos para programar es un editor de texto. Uno de los primeros resultados del proyecto GNU fue el editor emacs, y los editores estuvieron entre los primeros programas que se portaron a Linux.

Pero vamos a centrar nuestra atención en el editor vim, el cual es básicamente una interfaz basada en pantallas escrita con base en ex (otro editor muy antiguo).

En la mayoría de los distros de Linux encontrarás el editor vim. Aunque muchas personas piensan que vim es enigmático y difícil de utilizar, por lo general es porque nos acostumbramos al bloc de notas de Windows, emacs (en modo gráfico) y/o a los IDE’s (a lo fácil); sin embargo, vim tiene muchas ventajas con respecto a otros editores:

  • Está disponible en prácticamente en todos los sistemas UNIX y Linux.
  • Necesita menos recursos de sistema que emacs, y por consecuencia se ejecuta aunque el sistema no esté funcionando completamente.
  • No es tan personalizable como el emacs, por lo que sus implementaciones se comportan casi de la misma manera.

Puedes utilizar cualquier otro editor de texto, aunque te recomiendo que domines los fundamentos del vim. Para comenzar puedes leerte este pequeño (muy pequeño) artículo acerca del vim.

ctags y etags

Al codificar un programa grande en C++, talvez sea necesario dividir las clases y métodos en archivos fuente separados. Pero después, al depurar el programa, puede resultar tediosa la tarea de navegar entre archivos. Por ejemplo, talvez esté editando el archivo A y en él haya una invocación a un método que se encuentre en otro fichero, talvez el B. Los programas ctags y etags generan archivos índice o “tag”, que vi y emacs pueden utilizar para ayudarlo a navegar por sus archivos fuente.

ctags genera marcas para vim, pero se puede configurar para que lo haga para emacs. etags genera marcas para emacs, pero se puede configurar para que lo haga para vim.

Vamos a ver un ejemplo del ctag con vim. Para ello escribimos el siguiente código en un archivo llamado HolaPrincipal.cpp:

//HolaPrincipal.cpp
#include<iostream>
using namespace std;
void Saludar(int i);
int main(int argc, char * argv[])
{
for(int i=0; i<5; i++)
{
Saludar(i);
cout<<endl;
}
}

y lo siguiente en Saludar.cpp:

//Saludar.cpp
#include<iostream>
using namespace std;
void Saludar(int i)
{
cout<<"["<<i<<"] elhackerr00lz";
}

Ahora vamos al directorio donde tenemos los dos archivos y escribimos el comando:

ctags *.cpp

Hemos creado el nuevo archivo tags. Ahora vamos a probarlo, para ello abrimos el archivo HolaPrincipal.cpp (vim HolaPrincipal.cpp); y usando las flechitas de dirección colocamos el cursor sobre la palabra Saludar. Oprime Ctrl+], y verás que el editor abre automáticamente el archivo que contiene la función (Saludar.cpp) y coloca el cursor al inicio de la misma.

Como he dicho anteriormente solo centraremos la atención al vim, para el emacs puedes manejar tanto el ctags como el etags. Utiliza la información en línea para ver como se utiliza.

5 Comentarios | deja el tuyo

mar, 02 2007 - 8:46 pm

Compiladores de C/C++ en Linux

El compilador C de GNU se llama gcc y puede compilar C, C++ y Objective-C. El compilador de C se apega al estándar ANSI, por lo que es fácil de portar un programa C ANSI a Linux.

Cómo compilar con gcc

El compilador GNU se invoca con el comando gcc. De manera predeterminada este comando preprocesará, compilará y en enlazará un programa de C. Existen muchas opciones para el gcc, y entre ellas existen controles que permiten ejecutar solo alguna fase de la secuencia preproceso/compilación/enlace.

El siguiente ejemplo sencillo es un programa en C que simula el lanzamiento de un dado n veces, y luego imprime el número de veces que sale cada una de sus caras. Nota: El ejemplo lo saqué de un libro de C, espero no me demanden.

Crea el archivo juego.c:

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

int tirarDado(void);

int main(int argc, char * argv[])
{
int i, iIter, dado[6];

if(argc<2)
{
printf("Uso: %s n\n",argv[0]);
return 1;
}
iIter = atoi(argv[1]);
memset(dado, 0, sizeof(dado));
for(i=0; i<iIter; i++)
{
dado[tirarDado() - 1]++;
}
printf("%d tiradas\n",iIter);
printf("\tCara\tTiradas\n");
for(i=0; i<6; i++)
{
printf("\t%d : \t%d\n",i+1, dado[i]);
}
}

Y el archivo tirador.c:

#include<stdlib.h>
int tirarDado(void)
{
return (rand()%6+1);
}

Podríamos utilizar un solo comando para compilar y crear el programa ejecutable:

gcc -o juego juego.c tirador.c

Puede ver que -o indica el nombre del archivo de salida (el ejecutable). gcc sabe que los archivos con la extensión *.c son archivos de C y los compila como tales. Sino especifica un nombre de archivo de salida, gcc creará predeterminadamente el archivo a.out.

Ahora veamos otra manera de compilar nuestro programa: haciéndolo por módulos (por separado):

gcc -c juego.c
gcc -c tirador.c
gcc -o juego juego.o tirador.o

En este caso indicamos al compilador, con la opción -c, que primero el archivo juego.c, luego el archivo tirador.c. Y por último le indicamos que cree el archivo binario ejecutable, utilizando los dos archivos objeto (resultados de la compilación): juego.o y tirador.o.

Cómo compilar con g++

El comando g++ nos permite compilar archivos de C++. Aunque gcc puede compilar programas de C++, no hace automáticamente todos los enlaces requeridos con las bibliotecas de clases. Necesita usar g++ para esto. Por ello es recomendable que utilices g++ si estás utilizando C++.

Ahora vamos a compilar la versión C++ de nuestro programa de los dados; el archivo juego.cpp:

#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
int tirarDado(void);
int main(int argc, char * argv[])
{
int i, iIter, dado[6];
if(argc<2)
{
cout<<"Uso: "<<argv[0]<<"n\n";
return 1;
}
iIter = atoi(argv[1]);
memset(dado, 0, sizeof(dado));
for(i=0; i<iIter; i++)
{
dado[tirarDado() - 1]++;
}
cout<<iIter<<" tiradas\n";
cout<<"\tCara\tTiradas\n";
for(i=0; i<6; i++)
{
cout<<"\t"<<i+1<<" :\t"<<dado[i]<<endl;
}
}

El archivo tirador.cpp:

#include<stdlib.h>
int tirarDado(void)
{
return (rand()%6+1);
}

La compilación en g++ es muy similar a gcc en casi todos los aspectos. Para compilar con un solo comando utiliza:

g++ -o juego juego.cpp tirador.cpp

Y para compilar por módulos:

g++ -c juego.cpp
g++ -c tirador.cpp
g++ -o juego juego.o tirador.o

ELF
Cuando se compila un programa, se genera un archivo objeto, y cuando se enlaza el programa, se crea un archivo binario ejecutable. El enlazador debe entender el formato de los archivos objeto, y como el sistema operativo debe cargar y ejecutar el programa ejecutable, también debe entender este formato.
Ya vio que el archivo ejecutable por defecto se llama a.out. Hace un tiempo, el formato de los archivos objeto y los archivos ejecutables se conocía como a.out. Este formato es muy antiguo y contiene bastantes defectos. El formato actual, utilizado por los sistemas UNIX y Linux se conoce como ELF (Formato Ejecutable y de Enlace). ELF es mucho más versátil que a.out, y se presta muy bien para crear bibliotecas compartidas (librerías dinámicas).

Puede saber cual es el formato de un archivo utilizando el comando file, por ej.:

file juego tirador.o /usr/bin/apt-get
juego: ELF 32-bit LSB executable, Intel 80386…
tirador.o: ELF 32-bit LSB relocatable, Intel 80386…
/usr/bin/apt-get: ELF 32-bit LSB executable, Intel 80386…

12 Comentarios | deja el tuyo

« Entradas anteriores
Entradas recientes »