Revistas en papel
Anterior
MenĂº
Logotipo

Amiga.InFo Nº 0 - Noviembre/Diciembre 1994 - Curso de C

NOTA: Pulsando sobre las fotos con borde azul ampliarás la imagen.

Comienzo aquí un nuevo curso dedicado al estudio y utilización de uno de los lenguajes de programación más utilizados entre los usuarios de Amiga: el C. Con él pretendemos cubrir las necesidades de nuestros lectores y ofrecerles una idea clara y completa de este lenguaje, tanto para iniciados como para los que quieran llegar a serlo. Los menos experimentados se preguntarán qué es eso del lenguaje de programación C, y sobre todo, para qué sirve. A lo largo de este curso, A. Moreno nos dará respuesta a estas y muchas otras preguntas.

Bienvenido al excitante mundo del C, un lenguaje de programación profesional que gusta tanto a los programadores aficionados como alos comerciales. No te preocupes si los primeros listados en C te suenan a "chino". Un listado en C no es más difícil de entender que uno en Basic, cuando se conoce. Al final del curso, más de uno será capaz de mejorarlo.


Objetivo del Curso

Al comenzar cualquier actividad es esencial tener una idea clara de los objetivos que se pretenden alcanzar, de los conocimientos que se van a adquirir y del material que se va a cubrir.

Es importante señalar, antes de nada, que no se pretende iniciar un estudio de la programación a un nivel muy elevado: mas bien comenzaremos asumiendo que careces de conocimientos sobre programación.

Intentaremos introducirnos en el estudio de la programación estructurada, utilizando para ello el lenguaje C. Partiremos desde la base más elemental, pero que incluso quien no tenga ni la más remota idea de lo que es ésto pueda seguirnos.

El objetivo global de este curso es proporcionarte una base completa (en todos los aspectos), de la programación en C para sacarle el máximo partido al Amiga. Objetivo suficientemente amplio y completo, como para hacer un curso de, por lo menos, un año de duración.


¿A quién va dirigido?

Este curso puede ser usado por una gran variedad de lectores, ya que cubre dos necesidades. Es un texto de referencia para el experimentado programador, o bien una obra de estudio personal para el nuevo programador interesado o implicado en la construcción de software para Amiga.

Se adopta el lenguaje C para fines generales y, por tanto, será útil tanto para estudiantes como para profesionales. Sin embargo, resulta eficaz usarlo junto con otros cursos sobre temas como: Sistemas Operativos, diseño de Software, lenguaje ensamblador, estructuras de datos, etc.

Podrán beneficiarse con este curso:

  • Programadores principiantes que han tenido alguna experiencia en AmigaBASIC, AMOS, Blitz Basic o GFA-BASIC y que ahora quieren aprender C.

  • Programadores experimentado que saben BASIC, Pascal, Modula-2 o C, y que ahora lo quieren aplicar al Amiga.

  • Programadores de Amiga que quieren explicaciones y ejemplos en castellano del control de memoria, control de pantalla y teclado, ficheros, entrada y salida, gráficos, sonido, etc.

  • El programador de Sistemas que necesita utilizar C para trabajar en un medio UNIX, encontrará una explicación completa sobre ésto. Explicaremos cómo procesar archivos y proporcionaremos los elementos necesarios del lenguaje para programar sistemas. Analizaremos con detenimiento varias bibliotecas estándar de funciones de entrada y salida.

No se da por supuesto en ningún momento que seas un programador experimentado. Así se explican ideas de programación junto con el propio lenguaje. El curso ha sido diseñado con la idea de hacerlo intelegible para todo el mundo, tanto para programadores principiantes como para experimentados. Se pretende que este curso sea una introducción amena y sencilla al fascinante mundo de la programación del Amiga.

En definitiva, va dirigido a todos aquellos deseosos de aprender con rapidez el lenguaje C en sus múltiples variantes (ANSI C, UNIX C y C bajo AmigaDOS).


¿Qué contiene?

Es casi imposible describir, en un único curso, el lenguaje de programación C. En la práctica hay dos tipos de textos sobre C:

a) Tutoriales sobre programación en C.
Los libros que siguen el estilo tutorial están repletos de ejemplos escritos en C. Puedes teclearlos y ejecutarlos perfectamente, e incluso te aconsejan que modifiques el ejemplo y aprendas de los resultados.

b) Referencias del C.
Los libros que siguen el estilo de referencias suelen ser una descripción compresiva de todas las llamadas estándar posibles.

Para este curso he optado por hacer una rápida, pero extensa, referencia sobre el lenguaje C para pasar posteriormente a hacer un tutorial sobre C para Amiga. los motivos son evidentes. Existe gran cantidad de libros para aprender C, desde un nivel muy básico hasta un nivel experto; sin embargo, no existe casi ningún libro, y sobre todo en castellano, para aprender a programar en C nuestro Amiga. Por lo tanto, la parte encargada de explicar el estándar ANSI-C tendrá menor número de ejemplos prácticos, en cambio, la parte de aplicación de C a Amiga estará repleta de ejemplos. Creo que verás más interesante un ejemplo sobre Amiga que un clásico "Hello World" de C; aunque, por supuesto lo llevará ya que es un curso para aprender C desde cero.

El curso consta de cuatro partes claramente diferenciadas:

  • La parte I ofrecer una completa descripción con numerosos programas y ejercicios del lenguaje de programación C, constituyendo un verdadero manual del mismo. Los diferentes artículos harán que pases de los conceptos simples a las estructuras de datos complejas y que todos los aspectos del lenguaje C se vayan cubriendo de forma progresiva.

Su objetivo es enseñar al lector que se enfrenta por primera vez con este lenguaje los conceptos fundamentales del mismo, para construir los cimientos necesarios para poder abordar con éxito las partes restantes del curso. Así mismo, también se ha pensado para que sirva de ayuda para todos aquellos programadores experimentados que deseen consultar algún aspecto del lenguaje de programación C. Por ejemplo, incluye:

- Introducción de conceptos básicos necesarios para todo programador.
- Uso de los editores de texto.
- Recomendaciones para escribir código legible.
- Introducción a los compiladores y otras herramientas necesarias.
- Uso y estudio de los cuatro compiladores de C más usados de Amiga.
- Justificación de la buena programación.
- Completa descripción del lenguaje de programación C.
- Comentarios y avisos sobre posibles errores de programación.
- Rutinas de Entrada/Salida para sus programas en C.
- y muchísimas cosas más ...

Incluye explicaciones completas y comprensibles de las facetas de C de uso más común. Se tratan la mayoría de las recomendaciones del estándar ANSI propuesto actualmente. Además, el curso presenta una aproximación actual a la programación, insistiendo en la importancia de la claridad, legibilidad, modularidad y eficiencia en el diseño de programas. Se te presentan de esta forma los principios de la buena programación, así como las reglas específicas del C. Aparecen programas en C completos y para Amiga por todo el curso, a partir del segundo artículo.

  • La parte II cubre técnicas avanzadas de programación en C, profundizando en aspectos concretos de programación y ofreciendo una colección de algoritmos básicos en problemas relacionados con:

    - Pilas
    - Colas
    - Listas
    - Árboles
    - Ordenamiento
    - y Búsqueda

  • La parte III trata aspectos específicos del AmigaDOS y del entorno de programación del SAS/C. Éstos incluyen:

    - "Debuggear" en Amiga.
    - Explicación completa de los aspectos más relevantes del sistema.
    - Multitud de ejemplos listos para ser usados en tus programas.
    - y un largo etcétera.

Se incluyen muchos ejemplos como parte principal del texto. Éstos incluyen a su vez numerosos ejemplos de programación de complejidad variable, así como ejemplos ilustrativos de las características especiales del sistema operativo del Amiga.

Por último:

  • La parte IV está formada por una serie de apéndices. Estos apéndices suministran una serie de tablas, reglas de sintaxis y símbolos de gran utilidad para programar en C. Constituyendo una referencia concisa e indispensable que los programadores de Amiga podrán usar como referencia. Entre otros, contiene los siguientes apéndices:

    - Librerías de C.
    - Librerías del Amiga
    - Códigos ASCII.
    - Códigos de Escape.
    - Mensajes de error del SAS/C.
    - Soluciones a los problemas propuestos.
    - etc.

Al final de cada artículo aparecen conjuntos de ejercicios y cuestiones de repaso que te permitirán probar la asimilación del material presentado. Deberías resolver el mayor número posible de estos problemas de cara a conseguir un aumento de la confianza en tí mismo y estimular de esta forma tu interés por el tema. Recuerdo que para la programación se necesita una cierta habilidad, de forma semejante a como se necesita para tocar un instrumento o escribir un libro, y esta habilidad no se adquiere simplemente leyendo este curso.


¿Qué se necesita?

A fin de obtener el máximo rendimiento de este curso, necesitarás lo siguiente:

  • Uno de los muchos compiladores de C existentes para Amiga. La lista de compiladores que hay en el marcado es muy amplia, pero nos servirá cualquiera de los siguientes: Lattice C, SAS/C, GCC, DICE, Aztec C, North C o cualquier otro de los existentes en las colecciones de Dominio Público. Debido a que no todo el mundo tiene un compilador de C en casa, he creído oportuno incluir en el disco de portada, la versión "Shareware" de DICE. Te recomiendo encarecidamente que, si quieres convertirte en todo un programador profesional de C, te compres uno de los compiladores de C mencionados anteriormente.

SAS C es, sin lugar a dudas, el mejor compilador de C para Amiga. A lo largo del curso analizaremos a fondo éste y otros compiladores.

GNU CC es un compilador cruzado de ámbito universitario. Puede crear un ejecutable para 680X0, PC, VAX, estaciones SUN, etc.

El compilador Aztec C será válido para seguir el Curso de C, aunque te recomiendo que cambies a: Dice, GCC o mejor aún, a SAS/C.

Instalación de la versión registrada de DICE. Incluye el set completo de "Includes" de Commodore, el código fuente de la c.lib, soporta operaciones en coma flotante, etc.

  • Por supuesto, un Amiga, con al menos:
RAM Disco duro Discos
GCC 3-4 Megas 30 Megas ---
DICE 2 Megas Recomendable 3
SASC 2-3 Megas 10 Megas 6
Aztec C 2 Megas Recomendable 4
  • Una o dos unidades de disco, o una unidad de disco y un disco duro.

  • Un televisor o monitor en color, ya que algunos ejemplos llevan gráficos o texto en color (aunque en la mayor parte del curso no se necesite el color).

  • Una impresora (opcional). Varios de los ejemplos requieren el uso de la impresora.

  • Workbench 2.0 o preferiblemente 3.0. He centrado el curso en las versiones más recientes del sistema operativo, ya que todavía hay muy poca documentación, y ninguna en castellano, sobre cómo programarlas.

  • No es necesario poseer profundos conocimientos de informática para abordar la lectura de este curso, aunque sí debes estar familiarizado, al menos, con el Amiga y los conceptos más comunes relacionados con él, bien sea de hardware (discos, ficheros, teclado, pantalla, memoria, ...) o de software (conocimientos básicos de AmigaDOS. Concretamente, necesitas conocer comandos del AmigaDOS: dir, copy, format, delete, type, list, rename, etc. y saber cómo se utilizan los directorios y el acceso a los ficheros).

Encontrarás más información sobre estos conceptos en el manual que acompaña a tu Amiga. También, interesaría que entendieras los conceptos de variable, vector, bucle, subrutina, función, acción, etc.

  • La mayoría de los ejemplos de programación de este curso no requieren conocimientos matemáticos o técnicos especiales, pero aquellos que sí lo requieren, como por ejemplo programación en 3D, vienen precedidos de un pequeño resumen teórico. Así mismo, se requerirá cierto conocimiento del sistema operativo del Amiga -desde el punto de vista del programador- y del lenguaje ensamblador del 680X0, pero para eso se publican, o se publicarán, también en AMIGA.InFo sus respectivos cursos; de forma que progresivamente te conviertas en un auténtico experto de la programación del AMIGA.


Listados incluidos en el disco de portada

TODOS los ejemplos que aparecen en el curso han sido compilados y ejecutados sin errores. El texto fuente de los mismos, junto con los ficheros de entrada utilizados y los resultados de salida producidos, están disponibles en el disco de portada.

La gran cantidad de comentarios explicativos que se incorporan en todos los ejemplos, salvo en los más sencillos de este curso, están para tu provecho, con la esperanza de que puedas aprender gracias al ejemplo.


Origenes del C

El C fue diseñado e implantado por Dennis Ritchie, en los Laboratorios Bell de AT&T, para ser usado originalmente en la familia DEC PDP-11 de Digital Equipment (hacia el año 1972). El desarrollo del lenguaje ha estado fuertemente unido al del sistema operativo UNIX ya que el autor, Dennis Ritchie, simultaneaba el desarrollo de los dos (UNIX junto con Ken Thompson).

El sistema operativo UNIX, en un principio, estaba escrito en lenguaje ensamblador para el mini-ordenador PDP-7 de DEC, pero las constantes necesidades de mantenimiento, adaptación y crecimiento del sistema, llevaron a Ken Thompson a desarrollar un lenguaje independiente de la máquina.

En 1970 Ken Thompson, creó el lenguaje B inspirándose en el lenguaje BCPL desarrollado por Martin Richard en 1967 anticipándose a la moda de los lenguajes estructurados, Ken Thompson desarrolló un compilador y reescribió el sistema operativo UNIX sobre un ordenador PDP-11.

Posteriormente, en 1972 y basándose en el lenguaje B que Ken Thompson había creado a partir del BCPL, Dennis Ritchie definió el lenguaje C. Los lenguajes BCPL y B ya disponían de instrucciones de control clásicas como: if, while, do, etc. y de conceptos de programación como punteros, asignación dinámica. recursividad, etc. Al lenguaje C se le añadió la noción de tipos de datos, pero de forma menos firme que en los lenguajes ALGOL o PASCAL (anteriores al C).

Ya en 1973 nació un nuevo UNIX escrito por primera vez en un 90% bajo lenguaje C y diseñado para un ordenador PDP-11. Así, paralelo al sistema UNIX, es como nació el propio lenguaje C, un lenguaje escrito por programadores y con todas las utilidades que un programador necesita de un sistema operativo, a la vez que quedaba totalmente abierto a todas las nuevas necesidades que cada programador precisara.

Durante muchos años, el C estándar fue el proporcionado con el sistema operativo UNIX 5 y descrito en "The C Programming Language" por Brian Kernighan y Dennis Ritchie. Se le conoce a menudo como el "estándar K&R". Tanto el UNIX como el C se han implementado posteriormente en un número cada vez mayor de ordenadores, desde los microordenadores de mayor potencia hasta supercomputadores como el Cray-2, y se están transformando en un estándar industrial para el desarrollo de software. En lo que casi podría calificarse de milagro, la mayoría de estas implementaciones eran altamente compatibles entre sí, a nivel de código fuente.

Sin embargo, debido a que no existía un estándar, había discrepancias. Para cambiar esta situación, a principios de 1983 se creó un comité para trabajar en la creación de un estándar ANSI, que definiría de una vez por todas el lenguaje C. Tras siete años de "trabajo", el estándar fue adoptado en diciembre de 1989.

gracias a este estándar, se ha independizado al C del sistema operativo UNIX, soportando en la actualizad la mayoría de sistemas operativos: AmigaDOS, MSDOS, VMS/VAX, SYSTEM 7, OS/2, MACH, etc.

Este curso refleja el estándar ANSI C. Sin embargo, también se cubren importantes aspectos del viejo estándar K&R.


¿Para qué se utiliza el C?

Por lo que hemos visto sobre la historia del lenguaje C, podríamos pensar que es un lenguaje para el desarrollo de sistemas operativos, esto no es exactamente así. Un lenguaje de propósito general, como el C, puede ser utilizado para resolver una gran variedad de problemas informáticos en áreas como:

- Desarrollo de programas ofimáticos (procesadores de textos, bases de datos, hojas de cálculo, etc.).
- Programación de sistemas operativos (UNIX, MACH, LINUX, AmigaDOS, etc.).
- Aplicaciones científicas y de ingeniería (Simulación, Redes, etc.
- Aplicaciones financieras, Gestión comercial o familiar, etc.).
- Programación de microprocesadores.
- Programas de comunicaciones.
- Aplicaciones de inteligencia artificial o robótica.
- Diseño de juegos y pasatiempos en general.
- Programas de educación.
- Para controlar maquinaria compleja.
...y para mil cosas más.

Después de haber leído el párrafo anterior, pensaremos que el lenguaje C sirve para todo tipo de aplicaciones, pero tampoco es del todo cierto. Para resolver determinados problemas disponemos de lenguajes que nos facilitarán el trabajo, por ejemplo, si tenemos que realizar el mantenimiento de un fichero (altas, bajas, consultas, etc) la mejor solución es manejar una base de datos desde AREXX. Esta solución, nos ahorrará tiempo ya que, en C, deberíamos de realizar el programa completo. En la base de datos, tendríamos parte del trabajo resuelto. Además, es muy posible que esa base de datos haya sido programada en C, como es el caso de SuperBase 4.


Ventajas del lenguaje C

Cuando se nos planteó el reto de escribir un curso de programación para Amiga, la primera decisión a tomar fue qué lenguaje de programación escoger para los ejemplos. Había varias opciones claras: Modula-2, C, Ensamblador... pero nos quedamos con el C debido a que en los últimos años ha habido mayor tendencia al uso del C entre los programadores profesionales. Vamos a ver algunas de las razones que hacen del C uno de los lenguajes más potentes y populares:

  • C es un lenguaje de programación estructurado y de propósito general.

¿Cuales son las características de un lenguaje de programación estructurado?

Pues bien, las dos características principales que distinguen un lenguaje estructurado son, la posibilidad de utilizar subunidades o bloques y la inclusión en el lenguaje o booleano. Un bloque es un conjunto de sentencias, también llamadas instrucciones, indivisibles que están lógicamente relacionadas, es decir, si una instrucción de un bloque es ejecutada, también deben ser ejecutadas todas las restantes del bloque. Por ejemplo, supongamos una sentencia "if" en la que, si la condición es verdadera, deben ejecutarse tres sentencias simples. Si dichas sentencias pueden agruparse conjuntamente y referenciarse fácilmente y además se les puede considerar como una unidad indivisible, entonces forman un bloque. En el Ejemplo 1 observará un fragmento de un programa en C que mostrará el número 007 en la pantalla si X es menor que 20.

No existe ninguna posibilidad de que sólo se escriba en la pantalla 0 ó 7 ó 07 o cualquier número distinto de 007, puesto que las instrucciones entre llaves forman un bloque, y si X es menor que 20, se ejecutarán todas; en caso contrario (X>20 ó X=20) ninguna instrucción del bloque será ejecutada.

Ejemplo 1
if X<20
{
printf("0");
printf("0");
printf("7");
}

C es un lenguaje estructurado ya que permite la utilización de bloques y la inclusión de bucles controlados por test de tipo lógico o booleano.

A continuación presentamos algunos ejemplos de lenguajes estructurados y no estructurados.

No estructurados
FORTRAN
BASIC
COBOL
ENSAMBLADOR

Estructurados
Modula-2
Pascal
Ada
C

Tabla 1: Pequeña clasificación de lenguajes según si son estructurados o no.
  • No es un lenguaje de juguete. El C es un lenguaje de programación suficientemente rico y robusto como para ser una seria herramienta en el desarrollo de software profesional.

  • Está altamente estandarizado debido a que, por fin, tiene una simple y reconocida definición del lenguaje (esta definición estándar se llama ANSI-C).

  • El C es especialmente bueno para escribir programas y aplicaciones de sistema debido a su facilidad para controlar el hardware a muy bajo nivel. Está considerado como un lenguaje de alto y bajo nivel (para abreviar se dice que el C es un lenguaje de nivel medio). Ésto no significa que sea menos potente o más difícil de usar que lenguajes de alto nivel como BASIC o Modula-2, ni implica que C sea similar al lenguaje ensamblador; simplemente combina elementos de lenguajes de alto nivel con la potencia del lenguaje ensamblador. La Tabla 2 muestra cómo encaja el lenguaje C en el conjunto de lenguajes.

Nivel Alto:

Lenguaje Natural
Prolog
Ada
Pascal
COBOL
FORTRAN
BASIC
Modula-2

Nivel Medio:

C
FORTH
Ensamblador

Nivel Bajo: Lenguaje Máquina
Tabla 2: Comparación entre los lenguajes de programación más populares. El C es un lenguaje de nivel medio.

Por un lado, está considerado como un lenguaje de bajo nivel debido a que proporciona mecanismos que pueden ser utilizados para acceder a los niveles más bajos del ordenador: acceso a los registros, tratamiento de un simple bit, de un byte o de una palabra, manipulación de direcciones y punteros, etc. (elementos básicos con los que funciona un ordenador). Por otro lado, está considerado como un lenguaje de alto nivel debido a que proporciona facilidades propias de los lenguajes de alto nivel, como pueden ser soportar el concepto de tipo de datos (enteros, caracteres y reales. Un tipo de datos define un conjunto de valores que puede tener una variable junto con un conjunto de operaciones que se pueden realizar sobre esa variable), permitir utilizar estructuras de de datos muy complejas, permitir casi todas las conversiones de tipos posibles, etc.

PRECAUCIÓN: C no lleva a cabo comprobación de errores en tiempo de ejecución como puede ser la comprobación de límites de vectores, que realizan otros lenguajes de alto nivel. Estas comprobaciones quedan altamente como responsabilidad del programador.

  • Estos dos aspectos del lenguaje son complementarios. Las facilidades de bajo nivel incrementan la utilidad del lenguaje de cada máquina específica, mientras que, las facilidades de alto nivel permiten independizar el programa del hardware, haciendo posible que el programa se pueda utilizar en diferentes máquinas. El mecanismo de los punteros de C es un buen ejemplo de esta independencia del hardware. Estos permiten al programador incrementar un vector de elementos sin explicitar en el código información sobre el tamaño físico exacto de cada elemento del vector. El compilador de C será el encargado de generar el código apropiado para el tipo de dato de cada elemento del vector. Características como ésta, hacen del C un lenguaje mucho más transportable que el resto de lenguajes de alto nivel y, ciertamente, más transportable de lo que uno se podría esperar de un lenguaje que permite un contacto tan "íntimo" con el hardware.

Esta característica es una de las más importantes del C y es la culpable del gran éxito que está teniendo. La portabilidad permite que un programa diseñado para ejecutarse en una máquina pueda compilarse y ejecutarse en otra completamente diferente, siempre y cuando se respecten unas pocas reglas durante su programación. Ésto presenta la importante ventaja de no tener que ceñirnos a un único fabricante ni modelo, es decir, un programa desarrollado y probado en un ordenador personal bajo sistema operativo AmigaDOS, podría ser compilado y ejecutado sin modificaciones en un ordenador grande, bien bajo sistema operativo Unix u otro sistema cualquiera.

Otra posible combinación puede ser la de coger un fuente en C escrito para Amiga y transferirlo al PC con el "DOStoDOS" o mediante "CROSSDOS", una vez que tengamos el programa en el PC podremos hacer ciertos cambios específicos de los PC's (por ejemplo, los referentes a las diferentes tarjetas gráficas, si es que no hemos respetado la regla de no utilizar características específicas del hardware de la máquina, como son: viewports, copperlist, etc, de Amiga), y compilar el fuente en el PC sin problemas. (es decir, no te hace falta saber nada acerca de segmentos de datos o pila, de cómo se representan los datos en un PC, o cosas por el estilo). El C es, pues, muy superior al BASIC, Pascal o FORTRAN en cuanto a portabilidad.

  • Otro aspecto importante del lenguaje C es que sólo tiene 32 palabras clave (27 del estándar de Ritchie y Kernigham y 5 añadidas por el comité de estandarización del ANSI), que constituyen las órdenes que conforman el lenguaje. Debido a este pequeño juego de instrucciones y sus funciones, los programas desarrollados en C suelen ser de dimensiones bastantes reducidas en comparación con otros lenguajes de programación. Por ejemplo, el AmigaBASIC de Microsoft tiene 198 palabras reservadas.

  • Lo compacto del código fuente del C ahorra espacio en el disco, reduce el tiempo de compilación y también la cantidad de escritura que ha de realizar el programador.

Por ejemplo, las palabras clave de Pascal o Modula-2 BEGIN y END son simplemente en C los símbolos "{" "}"; la expresión que en Pascal o Modula 2 sería I:=I+1, en C sería I++: y el código en C equivalente al código en Pascal o Modula-2 del Ejemplo 2 sería el mostrado en el Ejemplo 3. En él se ve que el código puede ser escrito en C, con un ahorro del 60% de caracteres.

Una vez que te acostumbres a las sentencias del C, probablemente no desearás volver a la sintaxis verbal de otros lenguajes de programación bastante más extensa.

Ejemplo 2
A=A+5;
IF A>20 THEN
BEGIN
     A=A-1;
...  (" aquí iría el resto del código ")
END

Código escrito en Pascal o Modula-2. Los programas escritos en Modula 2 son más legibles que los escritos en C, pero son de mayor tamaño.


Ejemplo 3
If ((a+=5)>20){
      a--;
...   /* aquí iría el resto del código */
}

Código en C equivalente al del Ejemplo 2 en Pascal o Modula-2. Podemos observar el sustancial ahorro de caracteres que se ha producido.

COMENTARIO: El C se caracteriza principalmente por la escasez de reglas pero, ésto tiene una gran desventaja, al poder caer en la tentación de desarrollar programas difícilesde entender y mantener. Ésta es la causa de su mala reputación entre los programadores de Pascal o Modula-2. Se sabe que muchos programadores se precian de explotar la capacidad de compactar las expresiones del C a costa de la legibilidad del programa (Dos muestras de ello: el libro de C "The Puzzle", y el concurso anual de código rebuscado). ¡No es necesario escribir código incomprensible!

  • C es un lenguaje modular. Los programas pueden escribirse en módulos; cada módulo queda en un fichero aparte y cada fichero se compila separadamente. Luego, cada una de estas unidades, compiladas por separado, pueden ser combinadas (enlazadas) en un programa entero.

Las rutinas utilizadas normalmente pueden colocarse en una librería. Dicha librería podrá ser enlazada en los nuevos programas, cuando sea necesario.

Esta modularidad reduce significativamente los errores de programación e incrementa el desarrollo eficiente del software.

  • C ofrece una enorme librería de rutinas de apoyo en tiempo de ejecución. La mayoría de las implementaciones del C estándar, ofrecen librerías de funciones para: el control entre ficheros de alto y bajo nivel y discos de entrada/salida, control de la pantalla y teclado, conversión de variables, interfaz con el sistema operativo, control de memoria, funciones matemáticas, gráficos, etc.

  • C es fácil de aprender. Admitámoslo: no es tan fácil de aprender como el Pascal o el BASIC, pero, es ciertamente mucho más sencillo que el lenguaje ensamblador ya que tiene menos órdenes que el Pascal y además mantiene la programación estructurada y la longitud de los nombres de los símbolos (recordemos que el lenguaje ensamblador sólo toma un cierto número de caracteres de las variables y etiquetas y lo restante es simplemente, ignorado).

  • C es un lenguaje compilado, y como tal, permite la protección del software que desarrollan las compañías profesionales, y por supuesto, también proteje el código que puedas programar tú, de posibles "miradas no deseadas" de otra gente.

Los programadores de AmigaBASIC o AMOS, se ven obligados a suministrar el código fuente de su programa para que se pueda ejecutar. Es entonces, cuando se puede producir modificaciones, copias ilegales, infracción del copyright en poder del autor, etc. El C permite obtener un ejecutable que no guarda ninguna relación con el código fuente que lo generó, de esta forma, se consigue proteger totalmente el código del programa. Si el programa estuviera escrito en AmigaBASIC podríamos modificar, sin problemas, la línea o líneas que se encargan de imprimir el nombre del autor y poner el nuestro.

Si nos colocamos en el extremo opuesto, las ventajas del C se convierten en desventajas. Y, al igual que todos los lenguajes de programación, el C también tiene inconvenientes:

  • Como el C es un lenguaje compilado, la modificación de programas simples lleva más tiempo del que se emplearía con un lenguaje interpretado, como por ejemplo el AmigaBASIC.

  • La modularidad del C incrementa el tiempo de compilación en programas pequeños.

  • Al ser tan conciso se hace menos legible que el Pascal.

  • La tradición de grandes librerías de funciones estándar hace, normalmente, que el C sea más caro que otros lenguajes.

  • Lo compacto y flexible del C hace que algunas de sus partes resulten difíciles de aprender, sobre todo la referente a punteros.

Pero incluso con estas desventajas, el C es, probablemente, el mejor lenguaje para muchos propósitos y programadores.

En el próximo artículo, se introducirán los conceptos básicos necesarios para poder seguir el curso. Se presenta y comenta en el mismo una serie de instrucciones para conseguir compilar los ejemplos del curso con los cuatro compiladores de C disponibles para Amiga: SAS-C V6.51, GCC v2.5.8, DICE C V3.0 y por último Aztec C.

Los conceptos y definiciones formales propias del lenguaje C, se introducirán en el siguiente artículo (tercero), para así, poder dar un poco de culturilla general en éste.

Aunque no se traten en detalle los diversos aspectos de la arquitectura de computadoras que todo programador debiera conocer, este artículo presenta un resumen de los conceptos y terminología utilizados en los artículos restantes del curso.

DICE: Compilador de C (Incluido en el disco de Portada)

Nombre: DICE
Autor:

Mathew Dillon
891 Regal Rd.
Berkeley,Ca. 94708
USA

Descripción:

DICE son las siglas de "Dillon Integrated C Environment". Actualmente esta considerado como el compilador de C, Shareware, más potente para Amiga. El calificativo de Shareware es debido a que su distribución es gratuita, aunque es recomendable el envío de una bonificación al autor. Por un módico precio, recibirás la versión completa en casa. Lleva el compilador y el enlazador o montador (en inglés, linker), pero además, incluye un excelente editor de textos con opciones muy potentes para conseguir un entorno con todo lo necesario, para poder empezar a programar en C. Está acompañadode una amplia documentación, eso sí, en inglés pero si no deseas gastarte mucho dinero en la adquisición de un compilador de C para seguir este curso, la versión registrada de DICE es la mejor opción.

Principales características de DICE.

  • Es un 95% compatible con el ANSI C, incluye casi todas sus funciones estándar.

DME, el editor de textos que acompaña a DICE, permite hacer una rápida referencia en cualquier momento. Simplemente hay que colocarse sobre el nombre de una función, pulsar una tecla, y al momento dispondremos del manual de esa función en una ventana aparte.

  • Soporta todos los WorkBench. Dispone de un módulo estándar de arranque compatible con todas las versiones existentes del Workbench, es decir, cuando un programa es ejecutado desde el Workbench, se llama a una función diferente de entrada: la wbmain(wbmsg). De lo contrario usaríamos la librería c.lib y al detectar la ejecución de nuestro programa desde el Workbench, retomaría inmediatamente un -1 y abortaría la ejecución del programa.

  • DICE es bastante rápido. Cuando hacemos residentes los diferentes módulos que forman el compilador, conseguimos que la compilación casi "vuele". Gran parte de esta velocidad se consigue gracias a cargar de golpe ficheros enteros en la memoria. Ésto presenta un pequeño problema de memoria, pero en general, el uso que hace DICE de la memoria es, más o menos, el mismo que hace Aztec C y Lattice (primeras versiones del SAS/C).

  • El código que genera es compacto y bastante reducido en general. Los tamaños de los programas más pequeños pueden rondar los:

    _main(){} 448 bytes, no utiliza stdio/fd.
    main(){} 2736 bytes, utiliza algo de stdio.
    main(){ algún printf } 5492 bytes, utiliza gran parte de stdio.

  • El preprocesador es capaz de tratar macros de cualquier tamaño. No tiene límite de símbolos, y además, permite manejar hasta 64 niveles de "includes" y recursiones en las macros.

  • Soporta la creación de ejecutables residentes sin que el programador tenga que realizar trabajo alguno adicional.

  • Soporta completamente las versiones del sistema operativo 1.3 y 2.0, y con un fácil mecanismo de extensiones al final de los nombres de los ficheros, permite desarrollar programas para varias versiones de sistema operativo simultáneamente.

  • Incluye el código fuente de las diferentes librerías: c.lib, m.lib, auto.lib, etc, para poder corregir los bugs que se detecten y así compilar de nuevo la librería ya corregida. Además, incluye el código fuente de casi todas las utilidades que lo acompañan, para que el nuevo programador disponga de ejemplos de gran calidad de donde aprender técnicas de programación en C.

  • Posee una extensa documentación en inglés sobre cómo instalar el compilador, su utilización, el editor, las funciones estándar de C, las librerías suministradas, cómo realizar librerías propias, cómo generar código para ROMs y EPROMs, mensajes de error, cómo escribir código legible, los errores más comunes que cometen los principiantes, cómo registrarse, explicaciones -paso a paso- para principiantes, bugs conocidos, utilidades suministradas, UNIX, etc.

Las instrucciones complejas para instalar la versión DICE, del disco de portada, están en la página siguiente. Una vez instalado, podrás ojear los programas de ejemplo que lo acompañan. Podrás modificarlos y experimentar con ellos cambiando líneas del código fuente "para ver que ocurre". Te aconsejo que lo hagas, ya que es una muy buena forma de aprender divirtiéndote.

Por desgracia, no podrás compilar programas que usen llamadas a la librería gráfica o a cualquier otra del AmigaDOS, ya que, a la versión de DICE que te hemos suministrado no le hemos podido añadir los llamados "includes", pues son de propiedad de Commodore.

Puedes obtenerlos directamente de Commodore.

Si estás intereado en obtener los "includes" ponte en contacto con nosotros y haremos los trámites por tí.

otra forma de conseguir los "includes" de Commodore es comprando la versión registrada de DICE. Puedes encontrar una explicación completa de cómo registrarte en el fichero register.doc que encontrarás en el directorio docs, una vez que descomprimas la versión "Shareware" de DICE.

Por último, existen dos formas más de conseguirlos, aunque son opciones más caras, la primera es comprar el SAS/C y la segunda es comprar el libro en inglés "Complete Amiga C" de Cliff Ramshaw. (Este libro incluye la versión registrada de DICE y además, los "include" de Commodore).

Hemos preferido llenar el disco de portada al máximo, así que no hemos añadido ningún script para descomprimir DICE; por lo tanto, tendrás que descomprimirlo tu mismo desde una Shell.

DICE está guardado en el disco de portada como dos archivos separados, cada uno de ellos tendrá que ser descomprimido en un disquete aparte. Naturalmente, si dispones de disco duro, podrás instalar DICE en la partición que consideres oportuna.

Instalación:

El texto que sigue a continuación es una explicación detallada de cómo debes instalar la versión de DICE, incluída en el disco de portada del primer ejemplar de AMIGA.InFo. Por favor, lee las instrucciones cuidadosamente, antes de intentar instalarlo.

Necesitarás abrir una Shell y usar unos simples comandos (ed, assign, rename y copy). Si no estás seguro de saber abrir una ventana de Shell, consulta el manual suministrado al comprar tu Amiga.

La versión Shareware de DICE, contenida en el disco de portada, funciona con versiones 1.3 y superiores del Sistema Operativo del Amiga. Si todavía estás usando la 1.2 ¿no crees que ya va siendo hora de que actualices tu equipo?

Las instrucciones que debes seguir varían dependiendo de qué versión del sistema operativo estés utilizando actualmente y también de dónde quieras instalar DICE: en disco duro o en disquetes. Sigue el proceso que necesites de los detallados a continuación.


Instalando DICE en 2 disquetes:

Antes de nada necesitarás dos discos formateados y totalmente vacíos. Puedes formatear los dos discos usando el Workbench, por ejemplo. Consulta el manual de tu Amiga si no estás muy seguro de cómo formatear discos. Una vez formateados, renómbralos como DiceDisk1 y DiceDisk2. Es importante que te asegures de que el nombre de los discos es correcto, o el resto de la instalación no funcionará.

En el directorio llamado DICE, del disco 1 de portada, encontrarás dos ficheros:

dicepart1.lha
dicepart2.lha

Éstos son ficheros comprimidos. Aparentemente, sólo son dos ficheros, pero cada uno de ellos contiene muchos otros. El primer fichero: dicepart1.lha contiene todos los ficheros que han de ir en el primer disco que has formateado, DiceDisk1. El segundo contiene los ficheros para el segundo de los discos, DiceDisk2. Abre una Shell y teclea el comando siguiente. Al final de cada línea presiona la tecla <Return>.

AMIGAINFO1:c/lha x AMIGAINFO1:DICE/dicepart1.lha DiceDisk1:

Sigue las instrucciones que te aparecen en la pantalla, insertando el disco que te pide en cada momento. Si tienes dos unidades de disco, podrás usarlas para acelerar el proceso. Cuando la operación esté completa, y aparezca de nuevo el prompt de la Shell, necesitarás realizar un proceso similar para el segundo disco:

AMIGAINFo1:c/lha x AMIGAINFO1:DICE/dicepart2.lha DiceDisk2:

Una vez acabada la operación, ya dispondrásde dos discos con la versión Shareware de DICE instalada en ellos. No podrás arrancar con ninguno de los dos discos, así que tendrás que arrancar de un disco que contenga el Workbench cada vez que quieras utilizar DICE. Lo más efectivo es que te hagas una copia del Workbench exclusiva para trabajar con él. La puedes llamar, por ejemplo: DiceBench. Puedes realizar la copia usando el comando diskcopy, desde la Shell, o usando el Workbench. El comando relabel te permitirá cambiar el nombre al disco. Llámalo DiceBench. Éste será tu disco de arranque de DICE.


Si estás utilizando Workbench 1.3:

Arranca desde el nuevo DiceBench. Abre una Shell y teclea:

ed s:startup-sequence

Este comando cargará el editor. Para más instrucciones de cómo manejar este editor, consulta el manual suministrado con tu Amiga. Posiciónate al final del fichero que has cargado (tu startup-sequence), y antes del endcli del final del texto, añade las cuatro líneas siguientes:

assign dice: DiceDisk1
assign dlib: DiceDisk2:dlib
assign dinclude: DiceDisk1:include
setenv DCCOPTS "-1.3"

Ahora continúa en el punto Pasos Finales.


Si estás utilizando Workbench 2.0 o superior:

Arranca desde el nuevo DiceBench. Abre una Shell y teclea:

ed s:user-startup

Este comando cargará el editor. Para más instrucciones de cómo manejar este editor, consulta el manual suministrado con tu Amiga. Posiciónate al final del fichero que has cargado (tu user-startup), y añade las cuatro líneas siguientes:

assign dice: DiceDisk1:
assign dlib: DiceDisk2:dlib
assign dinclude: DiceDisk1:include
setenv DCCOPTS "-2.0"


Pasos finales

Graba el texto y sal del editor. Arranca de nuevo, de DiceBench y, usando una Shell, teclea:

ed s:shell-startup

Y añade esta línea al final del texto:

path dice:bin add

graba el texto y sal del editor. Por último, teclea esta línea desde una Shell:

copy DiceDisk1:s/.edrc.floppy DiceBench:s/.edrc

Ahora, ya dispones de DICE instalado totalmente en dos discos. Si tienes múltiples unidades de disco, te ahorrarás un gran número de cambios de disco. Cuando arranques del nuevo DiceBench, te pedirá que insertes discos en varios puntos durante el proceso de arranque. No te preocupes, esto es normal. Puedes continuar en el punto Utilizando DICE.


Instalando DICE en un Disco Duro:

Antes de nada, escoge donde vas a instalar la versión de DICE y crea un nuevo directorio llamado Dice. Por ejemplo, si lo quieres instalar en la partición llamada Work: crea un directorio allí. Puedes hacerlo desde el Workbench si tienes Workbench 2.0 o superior, o utilizando una Shell si tienes la 1.3 (consulta el manual de tu Amiga si no estás muy seguro).

Voy a suponer que has creado un directorio llamado Dice en la partición Work:. Si no es así, sustituye todas las apariciones de Work:Dice, en el texto que sigue por el path apropiado.

Abre una Shell y teclea los comandos siguientes. Al final de cada línea presiona la tecla <Return>. Cada vez que lo hagas, verás un scroll en pantalla de gran cantidad de información. No te preocupes, esto es normal. Es producido por el programa lha cuando extrae los ficheros comprimidos, dentro de los dos ficheros, incluidos en el disco de portada.

AMIGAINFo1:c/lha x AMIGAINFo1:DICE/dicepart1.lha Work:Dice
AMIGAINFo1:c/lha x AMIGAINFo1:DICE/dicepart2.lha Work:Dice


Si estás utilizando Workbench 1.3:

Abre una Shell y teclea:

ed s:startup-sequence

Este comando cargará el editor. Para más instrucciones de cómo manejar este editor, consulta el manual suministrado con tu Amiga. Posicionate al final del fichero que has cargado (tu startup-sequence), y antes del endcli del final del texto, añade las cuatro líneas siguientes:

assign dice: Work:Dice
assign dlib: Work:Dice/dlib
assign dinclude: Work:Dice/include
setenv DCCOPTS "-1.3"

Ahora continúa en el punto Pasos Finales.


Si estas utilizando Workbench 2.0 o superior:

Abre una Shell y teclea:

ed s:user-startup

Éste comando cargará el editor. Para más instrucciones de cómo manejar este editor, consulta el manual suministrado con tu Amiga. Posiciónate al final del fichero que has cargado (tu user-startup), y añade las cuatro líneas siguientes:

assign dice: Work:Dice
assign dlib: Work:Dice/dlib
assign dinclude: Work:Dice/include
setenv DCCOPTS "-2.0"


Pasos Finales:

Graba el texto y sal del editor. Usando una Shell, teclea:

ed s:shell-startup

Y añade esta línea al final del texto:

path dice:bin add

Graba el texto y sal del editor. Por último, teclea esta línea desde una Shell:

copy Dice:s/.edrc.hd s:.edrc

Ahora realiza un reset para asegurarte de que los cambios efectuados toman efecto, y bueno, DICE ya está instalado en tu sistema.


Utilizando DICE:

Ya disponemos del compilador totalmente instalado y preparado para trabajar. Si lo has instalado en el disco duro, entonces no tendrás problemas. Si lo has instalado en disquetes, no olvides que tendrás que arrancar desde una copia del Workbench llamada DiceBench. El AmigaDOS necesita que introduzcas DiceDisk1: cada vez que utilices alguno de los comandos de DICE: dme, dcc, etc. de los guardados en el directorio bin. Si no lo haces así, te mostrará el mensaje de error "command not found". Esto último, sólo es aplicable a los sistemas basado en disquetes.

Hay cuatro pasos que tendremos que seguir para escribir un programa en C: editar, compilar, montar (en inglés, linking) y por último, ejecutar.


1.Editar

Todas las operaciones que podemos hacer con DICE, hay que hacerlas desde una Shell. Por lo tanto, lo primero es abrir una Shell.

Lo siguiente es decidir donde vamos a guardar/grabar nuestro trabajo. La RAM es el "dispositivo" más veloz pero, por supuesto, si se produce un guru o apagas la máquina, perderás todo el trabajo realizado. Debido a ésto, tendrás que tener un disco formateado y vacío para grabar nuestro trabajo, o un directorio en el disco duro.

Todos los ejemplo del curso están en la forma conocida como "código fuente". Para introducirlos en el Amiga usaremos un editor de textos. El programa Ed, que hemos utilizado anteriormente para modificar el startup-sequence, es uno de ellos. Pero DICE tiene incluido un editor mucho mejor, llamado DME. Puedes ejecutar DME desde una Shell, tecleando:

dme

Normalmente, ejecutaremos DME pasándole como parámetro el nombre del fichero de texto que queramos editar. Supongamos que vamos a grabar nuestro código fuente en un disquete llamado MiCodigo: Si tu programa se llama ejemplo.c (por convenio, se pone la extensión .c al final del nombre), entonces teclearemos:

dme MiCodigo:ejemplo.c

(Los usuarios de la versión de DICE en disquetes, tendrán que introducir DiceDisk1 en la unidad de disco antes de teclearlo). Este comando abrirá el editor con un fichero vacío. Simplemente teclea un listado y después selecciona <Save-Quit>. Ya estaremos en condiciones de pasar al siguiente paso.


2 y 3 Compilar y Montar

Compilar es el proceso de traducir el código fuente escrito en C a código máquina, lenguaje ejecutable por la unidad central de proceso del Amiga. La compilación es la función principal de DICE. Antes de poder ejecutar un programa compilado, hay que montarlo. El proceso de montar, enlaza el programa compilado con otros programas y librerías escritas previamente. Afortunadamente, DICE se encarga de compilar y montar el código fuente por nosotros. Podemos efectuar los dos procesos con una simple línea de comandos. Suponiendo que has creado el fichero ejemplo.c con el editor, como he mencionado anteriormente, podemos compilarlo y montarlo con la línea siguiente:

dcc MiCodigo:ejemplo.c -o MiCodigo:ejemplo

(Los usuarios de la versión de DICE en disquetes, tendrán que introducir DiceDisk1 en la unidad de disco antes de teclearlo). El comando "dcc" le indica a DICE que tiene que compilar y montar el ejemplo.c (hay que dar el path completo de donde está el código fuente). La opción -o permite indicar el path y nombre del ejecutable resultante.

Si todo ha ido bien, tendremos un ejecutable llamado ejemplo en el disco Micodigo. (Los usuarios de la versión de DICE en disquetes, tendrán que cambiar varias veces de disco, ésto es normal, no te preocupes). Si el compilador te ha informado de la presencia de algún error, entonces, es que probablemente te has equivocado al teclear el código fuente. Ejecuta de nuevo el editor y verifica el texto que has tecleado. Una vez que hayas corregido el texto, grábalo e intenta la compilación otra vez.


4. Ejecutar tu programa

Cuando, por fin, consigues librarte de los mensajes de error.. sólo falta ejecutar el fichero que produce DICE. Puedes ejecutarlo de la misma forma que ejecutarías otro comando del AmigaDOS, simplemente tecleando el nombre (incluyendo su path completo si fuese necesario) desde una Shell. Si has grabado tu programa compilado en el disco llamado MiCodigo, entonces teclea:

MiCodigo:ejemplo

Si todo va bien, verás el resultado maravilloso que produce tu primer programa en C. (Normalmente un guru como una casa).

La versión que te hemos suministrado de DICE, esta repleta de ficheros de texto (en inglés) que completan la documentación del compilador. Esta documentación en disco te ayudará a usar el sistema de mejor forma posible. Los ficheros de ayuda se encuentran en el directorio doc/. Para los usuarios de disquetes, es este directorio DiceDisk2:doc/. Para los usuarios de disco duro, es este otro directorio dice:doc/. Por favor, realiza el esfuerzo de leerte la documentación (si sabes el suficiente inglés). Te ayudará a solventar muchos de los problemas con los que te vas a ir encontrando, sobre todo, al principio.


Diferencias entre la versión Shareware de DICE y la Registrada

La versión de DICE incluida en el disco de portada, que acompaña al primer ejemplar de AMIGA.InFo, es distribuible libremente. El entorno del compilador y éste funciona totalmente, pero no contiene algunas de las características extras que tiene la versión registrada de DICE, Registrarse cuesta $50 (dólares); encontrarás los detalles de cómo registrarte en el fichero llamado Register.doc situado en el directorio doc/ de los discos de DICE. Alternativamente, existe la posibilidad de que nos pidas la versión registrada de DICE a nosotros. La redacción de AMIGA.InFo realizará los trámites por tí, sin coste alguno.

ventajas de la versión registrada:

- Incluye el set completo de "Includes" de Commodore y la amiga.lib (esencial para sacarle el máximo partido a los gráficos y sonido del Amiga).

- Trae una documentación mucho más extensa, con gran cantidad de programas de ejemplo.

- Contiene el código fuente de la librería de C.

- Soporta los "bitfields" y las opciones: _chip y _geta4.

- Soporta operaciones matemáticas en punto flotante.

Esta última ventaja necesita una pequeña explicación. La versión Shareware de DICE no puede trabajar con variables del tipo "float" (es decir, números con parte fraccionaria). Algunos de los ejemplos de este curso requerirán que el compilador soporte la opción de operaciones en punto flotante para poderlo compilar. Si utilizas la versión Shareware, entonces tendrás que modificar los ejemplos para poderlos compilar.

Por ejemplo, cada vez que te encuentres con una variable del tipo float, en uno de los ejemplo del curso, cambiala al tipo int. Además, dónde veas los dos caracteres %f, dentro de una llamada printf o scanf, sustitúyelos por los dos nuevos caracteres %d. Si hay asignaciones a estas variables, entonces borra la parte decimal de los valores.

Estos cambios permitirán compilar los ejemplos utilizando variables del tipo entero en lugar de las del tipo float. Recuerdo que estos cambios sólo son necesarios si utilizas la versión Shareware de DICE. La versión Registrada, o un compilador comercial, podrán compilar perfectamente los ejemplos sin modificaciones.


Includes de Commodore

Los includes de Commodore son una serie de ficheros que, con ayuda de otro fichero llamado amiga.lib, permiten al programador de C, sacarle la máxima potencia a las facilidades del Amiga. Con la versión Shareware de DICE, podrás realiar simples entradas y salidad vía Shell, pero llamar a las librerías de la ROM del Amiga, para abrir pantallas y ventanas, por ejemplo, no te será posible sin los includes de Commodore. Si te vas a tomar en serio la programación del Amiga, necesitarás estos ficheros, y por supuesto, un compilador de C en condiciones.


Envía esta página web a un amigo:
Esta opción está desactivada temporalmente, rogamos disculpen las molestias

Volver a la página anterior

Al menú principal