Sie sind auf Seite 1von 147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Programacin en Ada Texto completo


De Wikilibros, la coleccin de libros de texto de contenido libre. Programacin en Ada/Texto completo

Logotipo

Contenido
1 Programacin en Ada 1.1 Prlogo 1.1.1 Acerca de este libro 1.2 Crditos y licencia 2 Introduccin 2.1 Caractersticas principales 3 Historia 3.1 Enlaces externos 4 Manual de referencia 5 Instalacin de un compilador 5.1 GNAT 5.1.1 GNAT GPL Edition: Ada 2005 5.1.2 GNAT 3.15p precompilado 5.1.3 Paquetes precompilados formando parte de distribuciones 5.1.3.1 Mac OS X 5.1.3.2 Linux 5.1.3.2.1 SuSE 5.1.3.2.2 Debian GNU/Linux 5.1.3.2.3 Gentoo GNU/Linux 5.1.3.2.4 Mandrake 5.1.3.3 Windows 5.1.3.3.1 MinGW 5.1.3.3.2 Cygwin 5.1.3.4 MS-DOS 5.1.3.5 Solaris 8, 9, 10 sobre SPARC y x86 5.1.4 Compilarlo uno mismo 5.2 Aonix ObjectAda 5.2.1 Enlaces 6 Un ejemplo bsico: Hola Mundo 6.1 Abreviando 6.2 Compilacin 7 Elementos del lenguaje 7.1 Alfabeto
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 1/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

7.2 Componentes lxicos 7.2.1 Identificadores 7.2.2 Nmeros 7.2.3 Literales de tipo carcter 7.2.4 Cadenas de caracteres 7.2.5 Delimitadores 7.2.6 Comentarios 7.2.7 Palabras reservadas 7.3 Manual de referencia de Ada 8 Tipos 8.1 Clasificacin de tipos 8.2 Declaracin de tipos 8.3 Algunos atributos aplicables a tipos 8.4 Subtipos 8.5 Superar una ambigedad 8.6 Tipos avanzados 8.7 Manual de referencia de Ada 9 Enteros 9.1 Tipos enteros con signo 9.1.1 Ejemplo 9.1.2 Tipos enteros con signo predefinidos 9.2 Enteros modulares 9.3 Manual de referencia de Ada 10 Enumeraciones 10.1 Operadores y atributos predefinidos 10.2 Literales carcter 10.3 Tipo boolean 10.4 Subtipos de enumeracin 10.5 Manual de referencia de Ada 11 Coma flotante 11.1 Manual de referencia de Ada 12 Coma fija 12.1 Coma fija decimal 12.2 Coma fija ordinaria 12.3 Manual de referencia Ada 13 Arrays 13.1 Declaracin de arrays 13.1.1 Sintxis bsica 13.1.2 Con subrango conocido 13.1.3 Con un subrango desconocido 13.1.4 Con elementos aliased 13.2 Uso de arrays 13.2.1 Ejemplo de uso 13.3 Vase tambin 13.4 Manual de referencia de Ada 14 Strings 14.1 Manual de refencia de Ada 15 Registros 15.1 Acceso a los campos
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 2/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

15.2 Registro nulo 15.3 Tipos especiales de registros 15.4 Manual de referencia de Ada 16 Registros discriminados 16.1 Manual de referencia Ada 17 Registros variantes 17.1 Vase tambin 17.2 Manual de referencia de Ada 18 Punteros a objetos 18.1 Ejemplos 18.2 Liberacin de memoria 18.3 Manual de referencia de Ada 19 Punteros a subprogramas 19.1 Manual de referencia de Ada 20 Tipos derivados 20.1 Caractersticas 20.2 Ejemplo 20.3 Tipos derivados frente a subtipos 20.4 Manual de referencia de Ada 21 Tipos etiquetados 21.1 Tipos polimrficos (class-wide type) 21.2 Llamadas que despachan 21.3 Manual de referencia de Ada 22 Subtipos 22.1 Manual de referencia de Ada 23 Objetos 23.1 Variables 23.2 Constantes 23.3 Manual de referencia de Ada 24 Atributos 24.1 Atributos aplicables a tipos 24.2 Atributos aplicables a objetos 24.3 Ejemplos 24.4 Manual de referencia de Ada 25 Expresiones 25.1 Notacin 25.2 Manual de referencia de Ada 26 Operadores 26.1 Clasificacin 26.2 Propiedades 26.3 Comprobacin de pertenencia (in, not in) 26.4 Operadores lgicos de corto-circuito 26.5 Manual de referencia de Ada 27 Sentencias y estructuras de control 27.1 Clasificacin de sentencias 27.2 Bloques 27.2.1 Definicin 27.2.2 Ejemplo 27.3 Sentencia de seleccin (if)
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 3/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

27.3.1 Definicin 27.3.2 Ejemplo 27.4 Sentencia de seleccin por casos (case) 27.4.1 Definicin 27.4.2 Ejemplo 27.5 Bucles 27.5.1 Sentencia de bucle simple (loop) 27.5.1.1 Definicin 27.5.1.2 Ejemplo 27.5.2 Sentencia de bucle iterativo (for) 27.5.2.1 Definicin 27.5.2.2 Ejemplo 27.5.3 Sentencia de bucle condicional (while) 27.5.3.1 Definicin 27.5.3.2 Ejemplo 27.6 Otras sentencias de control (goto, exit, return, abort) 27.6.1 Sentencia goto 27.6.2 Sentencia exit 27.6.3 Sentencia return 27.6.4 Sentencia abort 27.7 Manual de referencia de Ada 28 Subprogramas 28.1 Procedimientos 28.2 Funciones 28.3 Parmetros nombrados 28.4 Parmetros por defecto 28.5 Manual de referencia de Ada 29 Sobrecarga 29.1 Sobrecarga de literales de enumeracin 29.2 Sobrecarga de operadores 29.3 Sobrecarga de subprogramas 29.4 Manual de referencia de Ada 30 Entrada/salida 30.1 Direct I/O 30.2 Sequential I/O 30.3 Storage I/O 30.4 Stream I/O 30.5 Text I/O 30.6 Biblioteca predefinida 30.7 Manual de referencia de Ada 31 Interfaz con otros lenguajes 31.1 Ejemplo de importacin desde C 31.2 Manual de Referencia de Ada 32 Clusulas de representacin 32.1 Manual de Referencia de Ada 33 Diseo y programacin de sistemas grandes 34 Paquetes 34.1 Especificacin y cuerpo 34.2 Ejemplos
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 4/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

34.3 Dependencia entre especificacin y cuerpo 34.4 Declaracin y visibilidad 34.5 Importacin de paquetes 34.6 Manual de referencia de Ada 35 Clusula use 35.1 Definicin 35.2 Desventajas 35.3 Vase tambin 36 Clusula with 36.1 Manual de referencia de Ada 37 Declaraciones 37.1 Declaraciones de subprogramas 37.2 Vista de una entidad 37.3 Parte declarativa 37.4 Regin declarativa de una declaracin 37.5 Manual de referencia de Ada 38 mbito 38.1 Manual de referencia de Ada 39 Visibilidad 39.1 Reglas de visibilidad 39.2 Manual de referencia de Ada 40 Renombrado 40.1 Manual de referencia de Ada 41 La biblioteca 41.1 La biblioteca Ada (unidades y subunidades) 41.1.1 Subsecciones 42 Unidades de biblioteca 42.1 Manual de referencia de Ada 43 Unidades hijas 43.1 Espacio de nombres 43.2 Visibilidad 43.3 Manual de referencia de Ada 44 Subunidades 44.1 Manual de referencia de Ada 45 Compilacin separada y dependiente 45.1 Manual de referencia de Ada 46 Tipos abstractos de datos 46.1 Tipos abstractos de datos (tipos privados) 46.2 Enlaces externos 46.2.1 Manual de referencia de Ada 47 Tipos limitados 47.1 Tipos privados limitados 47.2 Manual de referencia de Ada 48 Unidades genricas 48.1 Polimorfismo paramtrico 48.2 Parmetros de unidades genricas 48.3 Ver tambin 48.4 Manual de referencia de Ada 49 Excepciones
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 5/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

49.1 Excepciones predefinidas 49.2 Manejador de excepciones 49.3 Declaracin y elevacin de excepciones 49.4 Informacin de la excepcin 49.5 Manual de referencia de Ada 49.6 Enlaces externos 50 Concurrencia 50.1 Concurrencia 50.2 Subsecciones 51 Tareas 51.1 Definicin de tareas 51.2 Ciclo de vida y tipos 51.3 Ejemplo 51.4 Manual de referencia de Ada 52 Sincronizacin mediante citas 52.1 Sincronizacin de tareas mediante puntos de entrada o citas (entry) 52.2 Manual de referencia de Ada 53 Aceptacin de citas 53.1 Aceptacin de citas (accept) 53.2 Manual de referencia de Ada 54 Seleccin de citas 54.1 Seleccin de citas (select) 54.2 Manual de referencia de Ada 55 Llamadas a punto de entrada complejas 55.1 Llamadas a punto de entrada complejas 55.2 Tipos de punto de entrada 55.2.1 Llamada con tiempo lmite 55.2.2 Llamada condicional 55.2.3 Transferencia asncrona 55.3 Manual de referencia de Ada 56 Tareas dinmicas 56.1 Creacin dinmica de tareas (tipos tareas) 56.2 Manual de referencia de Ada 57 Dependencia de tareas 57.1 Dependencia de tareas 57.2 Manual de referencia de Ada 58 Ejemplos de tareas 58.1 Ejemplos completos de tareas 58.1.1 Semforos 58.1.2 Simulacin de trenes 58.1.3 Buffer circular 58.1.4 Problema del barbero durmiente 58.1.5 Problema de los filsofos cenando 58.1.6 Chinos: una implementacin concurrente en Ada 58.2 Manual de referencia de Ada 59 GLADE: programacin distribuida 59.1 Introduccin a GNAT-GLADE 59.2 Cmo funciona GNAT-GLADE? 59.3 Lenguaje de configuracin de gnatdist
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 6/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

59.3.1 Cmo se escriben las configuraciones? 59.4 Primer ejemplo 59.4.1 calculadora.ads 59.4.2 calculadora.adb 59.4.3 cliente.adb 59.4.4 ejemplo.cfg 59.4.5 Compilacin y ejecucin del programa 59.5 Instalacin bajo Debian GNU/Linux 59.6 Enlaces externos 59.7 Manual de referencia de Ada 59.8 Autores 60 Unidades predefinidas 60.1 Manual de refencia de Ada 61 Unidades predefinidas. Standard 61.1 Paquete Standard 61.2 Especificacin 61.3 Manual de referencia de Ada 62 Unidades predefinidas. Ada.Exceptions 62.1 Informacin sobre la excepcin 62.2 Especificacin de Ada.Exceptions 62.3 Manual de referencia de Ada 63 Unidades predefinidas. Ada.Strings.Fixed 63.1 Ejemplo 63.2 Especificacin 63.3 Manual de refencia de Ada 64 Unidades predefinidas. Ada.Text_IO 64.1 Ejemplo de E/S por consola 64.2 Ficheros de texto 64.3 Ejemplo de E/S por fichero 64.4 Portabilidad 64.5 Manual de referencia de Ada 65 Unidades predefinidas. Ada.Text_IO.Editing 65.1 Manual de referencia de Ada 66 Unidades predefinidas. Ada.Sequential_IO 66.1 Instanciacin 66.2 Funciones y procedimientos ms comunes 66.3 Excepciones ms frecuentes 66.4 Ejemplos 66.5 Manual de referencia de Ada 67 Unidades predefinidas. Ada.Command_Line 67.1 Ejemplo 67.2 Especificacin 67.3 Manual de referencia de Ada 68 Recursos en la Web 68.1 Informacin general, portales 68.2 Asociaciones y grupos 68.3 Estndar 68.3.1 Estndar de Ada 95 68.3.2 Estndar de Ada 83
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 7/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

68.4 Cursos y tutoriales 68.5 Libros electrnicos completos 68.6 Software libre o gratuito 68.6.1 Repositorios de proyectos 68.6.2 Buscadores y directorios de cdigo Ada 68.6.3 Entornos de desarrollo integrado 68.6.4 Herramientas para programadores 68.6.5 Libreras y bindings 68.6.6 Otras aplicaciones 68.7 Vendedores de compiladores 68.8 Artculos 68.9 Noticias y bitcoras 68.10 Directorios de enlaces 68.11 Foros, chats y listas de correo 68.12 Ingeniera de software 68.13 Buscadores 69 GNU Free Documentation License 69.1 0. PREAMBLE 69.2 1. APPLICABILITY AND DEFINITIONS 69.3 2. VERBATIM COPYING 69.4 3. COPYING IN QUANTITY 69.5 4. MODIFICATIONS 69.6 5. COMBINING DOCUMENTS 69.7 6. COLLECTIONS OF DOCUMENTS 69.8 7. AGGREGATION WITH INDEPENDENT WORKS 69.9 8. TRANSLATION 69.10 9. TERMINATION 69.11 10. FUTURE REVISIONS OF THIS LICENSE

Programacin en Ada
Prlogo
El objetivo de este libro es aprender a programar en el lenguaje Ada, desde sus caractersticas ms sencillas hasta las ms avanzadas. Ada es un lenguaje potente, pero no por ello es ms complicado que Pascal, por poner un ejemplo.

Buscar en este libro

Los prerrequisitos son: nociones generales de programacin y experiencia en otro lenguaje. Aunque si an no se sabe programar se puede complementar con la lectura de otro manual destinado a ello. Hay dos maneras de leer este libro. Una es desde el principio hasta el final, siguiendo el orden establecido en el ndice y en los encabezados de cada seccin. Otra es utilizar los enlaces libremente para saltar a los temas de inters elegidos por el lector.
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 8/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Acerca de este libro


Este manual que se est editando ahora en Wikilibros, deriva del libro escrito por Jos Alfonso Malo Romero, antiguo profesor de la Universidad de Alcal, para sus clases. Esa versin ya estaba licenciada segn la GFDL, la misma licencia que usamos en Wikilibros, y se puede encontrar en varios formatos en MicroAlcarria (http://www.microalcarria.com/descargas/documentos/Lenguajes/Ada/castellano/) . El estado actual de desarrollo es: , lo que indica que an hay trabajo por hacer. Recuerda que esto es un wiki: ests invitado a colaborar en la escritura de este libro. Es fcil, lee la bienvenida a los nuevos autores. Si no quieres o no puedes contribuir pero quieres hacer sugerencias, como qu captulos te gustara ver ms desarrollados o qu tema echas de menos, puedes hacerlo en la pgina de discusin.

Crditos y licencia
Los autores de Programacin en Ada son: Jos Alfonso Malo Romero, por la versin 1.0.1 (http://www.microalcarria.com/descargas/documentos/Lenguajes/Ada/castellano/) (2001 - 2002) Por la actual versin de es.wikibooks.org (//es.wikibooks.org) (2004-2005): Manuel Gmez (Contribuciones) Andrs Solio (Contribuciones) Varios autores de Ada Programming, por ciertos captulos que han sido traducidos de ese libro (sus historiales as lo indican). Alvaro Lpez Ortega (http://www.alobbs.com/) , por la versin inicial de Programacin en Ada/GLADE [1] (http://es.tldp.org/Tutoriales/ADA-Glade/html/) (2001). Si quieres colaborar, sigue los consejos de Cmo colaborar. Cuando hayas contribuido a la escritura del libro, aade tu nombre a la lista de autores.

Se autoriza la copia, la distribucin y la modificacin de este documento bajo los trminos de la licencia de documentacin libre GNU, versin 1.2 o cualquier otra que posteriormente publique la Fundacin del Software Libre (Free Software Fundation); sin secciones invariantes (Unvariant Sections), textos de portada (Front-Cover Texts), ni textos de contraportada (Back-Cover Texts). Se incluye una copia en ingls de esta licencia en el artculo Text of the GNU Free Documentation License.

Introduccin
La programacin de computadores, esto es, la creacin de software para ellos, es un proceso de escritura. As como los escritores de libros y artculos de revistas, los programadores (escritores de programas) deben expresar sus ideas por medio de una lengua escrita. Sin embargo, a diferencia de los escritores de novelas, los
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 9/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

programadores deben expresar sus textos en lenguajes de propsito especial, basados en las matemticas, conocidos como lenguajes de programacin. Ada, es uno de entre muchos posibles lenguajes de programacin. Fue diseado con un claro propsito en mente: la calidad del producto. Entendindose por calidad, la confianza que los usuarios van a poder depositar en el programa. Si bien es posible escribir cualquier programa en Ada, ste ha sido utilizado principalmente, en el desarrollo de software de control, de tiempo real y de misin crtica. Tpicamente, estos sistemas son responsables de procesos industriales y militares, muy costosos, y en los cuales incluso vidas humanas dependen del buen funcionamiento del software. Es vital en tales sistemas, utilizar un lenguaje que como Ada, ayuda en la creacin de software de alta calidad. Por otro lado, Ada, como lenguaje que promueve las buenas prcticas en ingeniera del software, es muy usado en la enseanza de la programacin en muchas universidades de todo el mundo. Veamos cules son las caractersticas ms destacables del lenguaje.

Caractersticas principales
Legibilidad Los programas profesionales se leen muchas ms veces de las que se escriben, por tanto, conviene evitar una notacin que permita escribir el programa fcilmente, pero que sea difcil leerlo excepto, quizs, por el autor original y no mucho tiempo despus de escribirlo. Tipado fuerte Esto asegura que todo objeto tenga un conjunto de valores que est claramente definido e impide la confusin entre conceptos lgicamente distintos. Como consecuencia, el compilador detecta ms errores que en otros lenguajes. Construccin de grandes programas Se necesitan mecanismos de encapsulado para compilar separadamente y para gestionar bibliotecas de cara a crear programas transportables y mantenibles de cualquier tamao. Manejo de excepciones Los programas reales raramente son totalmente correctos. Es necesario proporcionar medios para que el programa se pueda construir en capas y por partes, de tal forma que se puedan limitar las consecuencias de los errores que se presenten en cualquiera de las partes. Abstraccin de datos Se puede obtener mayor transportabilidad y mejor mantenimiento si se pueden separar los detalles de la representacin de los datos y las especificaciones de las operaciones lgicas sobre los mismos. Procesamiento paralelo Para muchas aplicaciones es importante que el programa se pueda implementar como una serie de actividades paralelas. Dotando al lenguaje de estos mecanismos, se evita tener que aadirlos por medio de llamadas al sistema operativo, con lo que se consigue mayor transportabilidad y fiabilidad. Unidades genricas En muchos casos, la lgica de parte de un programa es independiente de los tipos de los valores que estn siendo manipulados. Para ello, se necesita un mecanismo que permita la creacin de piezas de
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 10/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

programa similares a partir de un nico original. Esto es especialmente til para la creacin de bibliotecas.

Historia
La historia de Ada comienza en 1974 cuando el Ministerio de Defensa de los Estados Unidos llev a cabo un estudio de los lenguajes de programacin utilizados en sus proyectos y concluy que COBOL era un estndar para procesado de datos y FORTRAN para clculo cientfico. Sin embargo, la situacin con respecto a los sistemas empotrados era diferente: el nmero de lenguajes en uso era enorme. Ante esta falta de estandarizacin que provocaba gastos intiles, se propuso el uso de un nico lenguaje para estos sistemas. El primer paso del desarrollo fue la redaccin en 1975 programacin. Las flechas indican relaciones de de un documento que perfilaba los requisitos que deba influy a satisfacer el lenguaje. Despus de varias modificaciones, en 1976 se produjo una versin de estos requisitos sobre la que se evaluaron varios lenguajes. El resultado fue que ninguno de los lenguajes existentes cumpla todos los requisitos. As pues, el paso siguiente fue la aceptacin de propuestas de diversos contratistas para el diseo de un nuevo lenguaje, de los que se eligieron cuatro de ellos. El siguiente paso fue el refinamiento de las propuestas elegidas y se revisaron las especificaciones para dar la versin definitiva conocida como Steelman. La eleccin final del lenguaje se hizo en 1979 cuando se declar vencedor el desarrollo de CII Honeywell Bull. Se decidi que se llamara Ada en honor a Augusta Ada Byron, condesa de Lovelace (1815-1852), hija de Lord Byron, quien fue ayudante y patrocinadora de Charles Babbage trabajando en su mquina analtica mecnica, de hecho, est considerada por muchos como el primer programador de la historia. En 1983 se public el primer estndar ISO de Ada, el conocido Manual de referencia de Ada o ARM. La primera revisin del lenguaje vino en 1995, marcando las dos versiones histricas que existen hasta el momento: Ada 83 y Ada 95. La ltima revisin ha sido aprobada recientemente por ISO y popularmente recibe el nombre de Ada 2005.
Grfico de la historia de los lenguajes de

Enlaces externos
Ms sobre la historia de Ada en:

Ada Lovelace (1838)

Artculo de Wikipedia Steelman language requirements Steelman On-Line (http://www.dwheeler.com/steelman/) , incluye el artculo "Ada, C, C++, and Java vs. the Steelman (http://www.dwheeler.com/steelman/steeltab.htm) "

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

11/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Manual de referencia
A menudo abreviado ARM o RM, el manual de referencia de Ada (nombre completo: Ada Reference Manual, ISO/IEC 8652:1995(E)), es el estndar oficial que define el lenguaje. A diferencia de otros documentos oficiales de ISO, el manual de Ada se puede reproducir libremente, lo cual es una gran ventaja para su difusin. En este libro encontrars enlaces al manual de referencia en cada seccin acabada, en relacin con el tema tratado. El ARM es el lugar donde todas las preguntas sobre Ada tienen respuesta, aunque puede ser un texto un tanto rido por su carcter de estndar oficial. En cualquier caso es la fuente ms completa y exacta de informacin. Otros documentos de cabecera de Ada son los Ada Rationale, documentos que acompaan al estndar y explican las justificaciones en el diseo de cada revisin del lenguaje. Enlace externos al Manual de Referencia y Rationale Ada 2005: Reference Manual y Rationale (http://www.adaic.com/standards/ada05.html) Ada 95 Ada 95 Reference Manual (http://adaic.org/standards/95lrm/html/RM-TTL.html) Ada 95 Rationale (http://www.adaic.com/standards/95rat/RAThtml/rat95-contents.html) Ada 83: Ada 83 Reference Manual (http://archive.adaic.com/standards/83lrm/html/lrm-TOC.html) Ada 83 Rationale (http://archive.adaic.com/standards/83rat/html/ratl-TOC.html)

Instalacin de un compilador
En esta seccin explicaremos cmo instalar un compilador de Ada. Existen dos opciones gratuitas: GNAT, compilador libre y gratuito. Versin demo de ObjectAda.

GNAT
GNAT es el nico compilador de Ada gratuito completamente funcional. De hecho es parte del GNU Compiler Collection y por tanto es software libre. Sin embargo, la empresa que lo mantiene AdaCore (http://www.adacore.com) , ofrece contratos de mantenimiento de las ltimas versiones, antes de hacerlas pblicas. GNAT es tambin el nico compilador que implementa todos los anexos (captulos opcionales) del estndar de Ada.

GNAT GPL Edition: Ada 2005


Esta es la versin pblica ms reciente de AdaCore. Ten en cuenta que esta versin slo permite distribuir binarios bajo la licencia GPL (la misma que usa Linux). Como ventaja decir que esta versin tiene soporte de las nuevas caractersticas de Ada 2005. Esta es la versin recomendable para estudiantes y profesionales que
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 12/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

no necesitan soporte y licencian bajo GPL. Para profesionales que quieren soporte o vender software bajo su propia licencia, AdaCore vende la edicin llamada GNAT Pro (http://www.adacore.com) . GNAT GPL Edition se puede descargar de libre.adacore.com (http://libre.adacore.com/) .

GNAT 3.15p precompilado


Para los que quieren distribuir binarios bajo una licencia distinta a la GPL y no pueden permitirse comprar una licencia de GNAT Pro lo ms recomendable es descargar el paquete precompilado de la versin 3.15p, la ltima publicada por AdaCore bajo licencia GMGPL. Existen versiones para Windows, GNU/Linux y Solaris. Aunque la versin precompilada no se ha actualizado recientemente, an es suficiente para la mayora de usuarios. Esta versin ha pasado el Ada Conformity Assessment Test Suite. El Libre Site tambin proporciona el IDE para GNAT: GPS (http://libre.adacore.com/gps) . Se recomienda descargar estos paquetes adicionalmente: Linux ftp://ftp.cs.kuleuven.ac.be/pub/Ada-Belgium/mirrors/gnu-ada/3.15p/gnat-3.15p-i686-pcredhat71-gnu-bin.tar.gz ftp://ftp.cs.kuleuven.ac.be/pub/Ada-Belgium/mirrors/gnu-ada/3.15p/florist-3.15p-src.tgz ftp://ftp.cs.kuleuven.ac.be/pub/Ada-Belgium/mirrors/gnu-ada/3.15p/asis/asis-3.15p-src.tgz http://libre.adacore.com/gps/gps-2.1.0-academic-x86-linux.tgz Windows ftp://ftp.cs.kuleuven.ac.be/pub/Ada-Belgium/mirrors/gnu-ada/3.15p/winnt/gnat-3.15p-nt.exe ftp://ftp.cs.kuleuven.ac.be/pub/Ada-Belgium/mirrors/gnu-ada/3.15p/winnt/gnatwin-3.15p.exe ftp://ftp.cs.kuleuven.ac.be/pub/Ada-Belgium/mirrors/gnu-ada/3.15p/asis/asis-3.15p-src.tgz http://libre.adacore.com/gps/gps-2.1.0-academic-x86-windows.exe OS/2 ftp://ftp.cs.kuleuven.ac.be/pub/Ada-Belgium/mirrors/gnu-ada/3.15p/contrib/os2/gnat-3.15p-os2bin-20021124.zip

Paquetes precompilados formando parte de distribuciones


Existen varias distribuciones que contienen una copia del compilador GNAT, pero como consejo deberas comprobar la vesin de GCC:
g c cv e r s i o n g c c( G C C )3 . 4 . 3 C o p y r i g h t( C )2 0 0 4F r e eS o f t w a r eF o u n d a t i o n ,I n c .

Versiones que comiencen con 3.3. tienen muchos problemas por lo que deberas actualizarla a una vesin 3.4.. Mac OS X GNAT for Macintosh (http://www.adapower.net/macos/) proporciona una versin de GNAT, integracin con Xcode y varios bindings.
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 13/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Linux La mayora de las versiones de Linux vienen con paquetes de GNAT como parte de la distribucin de GCC. Estas versiones se pueden usar perfectamente en vez de la versin de Libre Site.
SuSE

Todas las versiones tienen un compilador GNAT includo. La versin SuSE 9.2 y superiores contienen tambin paquetes de ASIS, Florist y GLADE. Se necesitan estos paquetes:
g n a t g n a t r u n t i m e

Debian GNU/Linux

En Debian, GNAT se puede instalar con esta orden:


a p t i t u d ei n s t a l lg n a t

Otros paquetes interesantes para el desarrollo en Ada bajo Debian 3.1 Sarge son: gnat - The GNU Ada 95 compiler ada-mode - Ada mode for GNU Emacs and XEmacs ada-reference-manual - The standard describing the Ada 95 language adabrowse - HTML generator for Ada 95 library unit specifications adacgi - Ada CGI interface asis-programs - Ada Semantic Interface Specification (ASIS) example programs gch - Ada quality & style checker gnade-dev - Develoment files for the GNat Ada Database Environment gnat-3.3 - The GNU Ada compiler gnat-3.4 - The GNU Ada compiler gnat-doc - Documentation for the GNU Ada compiler gnat-gdb - Ada-aware version of GDB gnat-glade - Distributed Systems Annex for GNAT (GNU Ada 95 compiler) gnat-gps - The GNAT Programming System - advanced IDE for C and Ada libadabindx-dev - Ada binding to the X Window System and *tif libadasockets0-dev - bindings for socket services in Ada libasis-3.15p-1-dev - Ada Semantic Interface Specification (ASIS) headers and li braries libaunit-dev - AUnit, a unit testing framework for Ada libaws-dev - Ada Web Server development files libflorist-3.15p-1-dev - POSIX.5 Ada interface to operating system services libgnomeada-2.4 - Ada binding for the Gnome Library libgtkada-2.4 - Ada binding for the GTK library libopentoken-dev - OpenToken lexical analysis library for Ada libtexttools-dev - Ada and C++ library for writing console applications libxmlada1-dev - XML/Ada, a full XML suite for Ada programmers
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 14/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

libasis-3.14p-1 - Ada Semantic Interface Specification (ASIS) runtime library libcharles0-dev - Data structure library for Ada95 modelled on the C++ STL
Gentoo GNU/Linux

Bajo Gentoo la instalacin de GNAT es muy sencilla gracias al emerge:


e m e r g eg n a t

Mandrake

En Mandrake, GNAT se puede instalar con esta orden:


u r p m ig n a t

Windows Tanto MinGW para Windows como Cygwin contienen un paquete de GNAT.
MinGW

MinGW - Minimalist GNU for Windows (http://mingw.sourceforge.net) . Esta lista puede ayudarte a instalarlo: 1. Instalar MinGW-3.1.0-1.exe. 1. extraer binutils-2.15.91-20040904-1.tar.gz. 2. extraer mingw-runtime-3.5.tar.gz. 3. extraer gcc-core-3.4.2-20040916-1.tar.gz. 4. extraer gcc-ada-3.4.2-20040916-1.tar.gz. 5. extraer gcc-g++-3.4.2-20040916-1.tar.gz (opcional). 6. extraer gcc-g77-3.4.2-20040916-1.tar.gz (opcional). 7. extraer gcc-java-3.4.2-20040916-1.tar.gz (opcional). 8. extraer gcc-objc-3.4.2-20040916-1.tar.gz (opcional). 9. extraer w32api-3.1.tar.gz. 2. Instalar mingw32-make-3.80.0-3.exe (opcional). 3. Instalar gdb-5.2.1-1.exe (opcional). 4. Instalar MSYS-1.0.10.exe (opcional). 5. Instalar msysDTK-1.0.1.exe (opcional). 1. extraer msys-automake-1.8.2.tar.bz2 (opcional). 2. extraer msys-autoconf-2.59.tar.bz2 (opcional). 3. extraer msys-libtool-1.5.tar.bz2 (opcional). Se recomienda usar D:\MinGW como directorio de instalacin. Es de notar que la versin para Windows del Libre Site tambin se basa en MinGW.
Cygwin
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 15/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Cygwin (http://www.cygwin.com) , el entorno GNU para Windows, tambin contiene una versin de GNAT, aunque ms antigua que la de MinGW, y no soporta DLLs ni multi-tarea (al 11/2004). MS-DOS DJGPP (http://www.delorie.com/djgpp/) es un porte a MS-DOS de una seleccin de herramientas GNU con extensiones de 32 bits, que est mantenido activamente. Incluye la coleccin completa de compiladores de GCC, lo cual ahora incluye Ada. Vase el sitio de DJGPP (http://www.delorie.com/djgpp/) para instrucciones de instalacin. Los programas de DJGPP, a parte de en modo nativo MS-DOS, se pueden ejecutar en ventanas de DOS en Windows. Solaris 8, 9, 10 sobre SPARC y x86 Descarga GCC de blastwave.org (http://www.blastwave.org) . Es la suite completa con el compilador de GNAT.

Compilarlo uno mismo


Si quieres las ltimas caractersticas, incluyendo el soporte experimental de Ada 2005, tendrs que compilar t mismo el GNAT. Instrucciones: Linux o Cygwin: vase ada.krischik.com (http://ada.krischik.com) . Windows: pendiente

Aonix ObjectAda
Aonix ObjectAda es un compilador comercial que proporciona una versin gratuita de evaluacin, con limitaciones en el nmero y tamao de archivos y en el nmero de controles que se pueden colocar en una ventana. El IDE de ObjectAda es muy similar al de MS Visual C++ y al de Delphi e incluye un GUI builder.

Enlaces
Aonix ObjectAda (http://www.aonix.com/objectada.html) Versin demo (http://www.aonix.com/oa_win_demo.html)

Un ejemplo bsico: Hola Mundo


Un ejemplo comn de la sintaxis de un lenguaje es el programa Hola mundo. He aqu una implementacin en Ada con la intencin de ser un primer contacto.
w i t hA d a . T e x t _ I O ; p r o c e d u r eH o l a _ M u n d oi s
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 16/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

b e g i n A d a . T e x t _ I O . P u t _ L i n e ( " H o l a ,m u n d o ! " ) ; e n dH o l a _ M u n d o ;

Por ahora puede ser suficiente con aprender a compilar y enlazar un programa escrito en Ada, pero si tienes curiosidad aqu va una explicacin del programa. La clusula with establece una dependencia con el paquete Ada.Text_IO y hace disponible toda la funcionalidad relacionada con la Entrada/Salida de textos. Despus se define un procedimiento como programa principal. Ntese que en Ada no tiene que tener un nombre especial como m a i n , simplemente ha de estar fuera de cualquier paquete. Al compilar se indica cul es el programa principal. Ada.Text_IO.Put_Line llama al procedimiento Put_Line definido en el paquete Ada.Text_IO para imprimir la cadena " H o l a ,m u n d o ! " .

Abreviando
Si no deseamos tener sentencias largas, como Ada.Text_IO.Put_Line, se pueden usar dos mtodos para abreviar: 1. Usar una clusula use para hacer directamente visible todas las entidades definidas en Ada.Text_IO. No es recomendable abusar de esta clusula por las razones explicadas aqu. 2. Usar una clusula renames, para renombrar Ada.Text_IO con un nombre ms corto.
-C o nc l s u l au s e w i t hA d a . T e x t _ I O ;u s eA d a . T e x t _ I O ; p r o c e d u r eH o l a _ M u n d oi s b e g i n P u t _ L i n e ( " H o l a ,m u n d o ! " ) ; e n dH o l a _ M u n d o ;

-C o nc l u s u l ar e n a m e s w i t hA d a . T e x t _ I O ;u s eA d a . T e x t _ I O ; p r o c e d u r eH o l a _ M u n d oi s p a c k a g eT _ I Or e n a m e sA d a . T e x t _ I O ; b e g i n T _ I O . P u t _ L i n e ( " H o l a ,m u n d o ! " ) ; e n dH o l a _ M u n d o ;

Compilacin
Como ejemplo, con el compilador GNAT este programa se debe escribir en un archivo llamado hola_mundo.adb (el nombre del procedimiento que contiene, ms .adb) y se compilara as:
g n a t m a k eh o l a _ m u n d o . a d b

Naturalmente si usas un entorno integrado de desarrollo la compilacin ser una opcin de men o un botn de la barra de herramientas.
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 17/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

El resultado es un archivo ejecutable llamado hola_mundo que imprime Hola, mundo! por su salida estndar (normalmente en una ventana en modo texto).

Elementos del lenguaje


Alfabeto
El alfabeto de Ada consta de: Letras maysculas: A, ..., Z y minsculas: a, ..., z. Dgitos: 0, ..., 9. Caracteres especiales. Es de destacar que en Ada 95 se admiten caracteres como '', '' y vocales acentuadas ya que se permiten los 256 caracteres comprendidos en ISO Latin-1. El alfabeto de minsculas puede usarse en vez de o junto con el alfabeto de maysculas, pero se considera que los dos son idnticos (a excepcin de las cadenas de caracteres y literales tipo carcter).

Componentes lxicos
Se pueden encontrar en Ada los siguientes componentes lxicos: Identificadores Literales numricos Literales de tipo carcter Cadenas de caracteres Delimitadores Comentarios Palabras reservadas Hacer constar, que el espacio no constituye nada ms que un separador de elementos lxicos, pero es muy importante utilizarlos para una mayor legibilidad, tanto dentro de las sentencias, como elemento de sangrado para ayudar a diferenciar los bloques. Ejemplo:
T e m p e r a t u r a _ S a l a: =2 5 ; -T e m p e r a t u r aq u ed e b et e n e rl as a l a .

Esta lnea contiene 5 elementos lxicos: El identificador T e m p e r a t u r a _ S a l a El delimitador compuesto : = El nmero 2 5 El delimitador simple ; El comentario -T e m p e r a t u r aq u ed e b et e n e rl as a l a .
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 18/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Identificadores
Definicin en BNF:
i d e n t i f i c a d o r: : =l e t r a{[s u b r a y a d o]l e t r a|c i f r a} l e t r a: : =A|. . .|Z|a|. . .|z c i f r a: : =0|. . .|9 s u b r a y a d o: : =_

Aunque dentro de esta definicin entraran las palabras reservadas que tienen un significado propio en el lenguaje y, por tanto, no pueden ser utilizadas como identificadores. Nota: en la versin Ada 95 se incorporan los caracteres de Latin-1, con lo que se pueden escribir identificadores como Ao o Dimetro. No hay lmite en el nmero de caracteres de un identificador, aunque todo identificador deber caber en una nica lnea. Como en cualquier lenguaje, es recomendable utilizar nombres significativos como Hora_Del_Dia y no H, carente de significado. Problema: Son identificadores Ada validos estas palabras? En caso negativo, por qu razn? _Hora_Del_Da, Inicio_, Maana, Hora_Del_Da, Jabal, contador, 2a_vuelta, ALARMA, Access, Precio_en_$, alarma__general, HoraDelDa.

Solucin: _Hora_Del_Da: no, porque comienza por guin bajo. Inicio_: no, porque termina por guin bajo. Maana: s. Hora_Del_Da: s. Jabal: s. contador: s. 2a_vuelta: no, porque comienza por nmero. ALARMA: s. Access : no, es una palabra reservada de Ada. Precio_en_$: no, contiene un carcter ($) que no es letra, cifra ni guin bajo. alarma__general: no, porque contiene dos guiones bajos seguidos. HoraDelDa: s.

Nmeros
Los literales numricos constan de: dgitos 0 . .9 el separador de decimales . el smbolo de exponenciacin eo E
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 19/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

el smbolo de negativo el separador _ Como ejemplo, el nmero real 98,4 se puede representar como: 9 . 8 4 E 1 ,9 8 . 4 e 0 ,9 8 4 . 0 e 1
0 . 9 8 4 E + 2 .N oe s t a r ap e r m i t i d o9 8 4 e 1 .

Para representacin de nmero enteros, por ejemplo 1.900, se puede utilizar 1 9 E 2 ,1 9 0 e + 1 1 _ 9 0 0 E + 0 . Sirviendo el carcter _como mero separador para una mejor visualizacin. Una ltima caracterstica es la posibilidad de expresar un literal numrico en una base distinta de 10 encerrando el nmero entre caracteres # , precedido por la base: un nmero entre 2 y 16. Por ejemplo, 2 # 1 0 1 #equivale a 101 en base binaria, es decir al nmero 5 en decimal. Otro ejemplo con exponente sera 1 6 # B # E 2que es igual a 11 16 = 2.816 (ntese que es 16 y no 10 porque la base en este caso es 16).

Literales de tipo carcter


Contienen un nico carcter, por ejemplo: A . Aqu s se diferencian maysculas de minsculas. Se delimitan por un apstrofe. Ejemplos:
' A '' '' % '

Cadenas de caracteres
Contienen uno o varios caracteres y se delimitan por el carcter de dobles comillas: " , por ejemplo: "ABC". En este caso se diferencian maysculas de minsculas.

Delimitadores
Los delimitadores pueden ser uno de los siguientes caracteres especiales:
& ' ( ) * + , . / : ; < = >

O ser uno de los delimitadores compuestos por dos caracteres especiales:


= > . . * * : = / = > = < = < < > > < >

Comentarios
Los comentarios se utilizan para ayudar a comprender los programas y lo constituye toda parte de texto precedida de dos guiones () hasta el fin de lnea. No existe la posibilidad de insertar otro elemento lxico en la misma lnea a partir de los dos guiones, es decir, el resto de la lnea se interpreta como comentario en su totalidad.
-E s t ec o m e n t a r i oo c u p au n al n e ac o m p l e t a . M i s _ A h o r r o s: =M i s _ A h o r r o s*1 0 . 0 ;-E s t ee s t d e s p u sd eu n as e n t e n c i a . M i s _ A h o r r o s: =M i s _ A h o r r o s*-E s t ee s t e n t r em e d i a sd eu n as e n t e n c i aq u eo c u p ad o sl n e a s .
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 20/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

1 0 0 _ 0 0 0 _ 0 0 0 . 0 ;

Palabras reservadas
Como el resto de los elemento lxicos, las palabras reservadas de Ada son equivalentes tanto en maysculas como en minsculas. El estilo ms extendido es escribirlas completamente en minsculas. En Ada las palabras reservadas pueden tener un uso distinto dependiendo del contexto, los distintos usos de cada una se puede consultar en el captulo Palabras reservadas.
a b o r t a b s a b s t r a c t a c c e p t a c c e s s a l i a s e d a l l a n d a r r a y a t g e n e r i c b e g i n b o d y i f c a s e c o n s t a n t d e c l a r e d e l a y d e l t a d i g i t s d o m o d i n i s l i m i t e d l o o p r a i s e r a n g e r e c o r d r e m r e n a m e s r e q u e u e x o r w h e n w h i l e w i t h g o t o f o r f u n c t i o n p a c k a g e p r a g m a p r i v a t e p r o c e d u r e p r o t e c t e d u n t i l u s e e l s e e l s i f e n d e n t r y e x c e p t i o n e x i t o f o r o t h e r s o u t t a g g e d t a s k t e r m i n a t e t h e n t y p e n e w n o t n u l l s e l e c t s e p a r a t e s u b t y p e r e t u r n r e v e r s e

Manual de referencia de Ada


Section 2: Lexical Elements (http://www.adaic.com/standards/95lrm/html/RM-2.html)

Tipos
Clasificacin de tipos

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

21/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Jerarqua de tipos en Ada

Los tipos de Ada se pueden clasificar en: Escalar: Discreto: Enteros: Integer, Natural, Positive. Enumeraciones: Boolean, Character. Real: Coma flotante. Coma fija. Compuesto: Vector: Arrays, Strings. Registros: r e c o r d . Puntero: a c c e s s . Punteros a objetos Punteros a subprogramas Privados: p r i v a t e . Tareas: t a s k .

Declaracin de tipos
Para definir un tipo no estndar, se puede emplear el siguiente esquema:
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 22/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

d e c l a r a c i n _ t i p o: : =t y p ei d e n t i f i c a d o ri sd e f i n i c i n _ t i p o;

Sirvan como ejemplos las siguientes definiciones de tipos:


-E s c a l a r e sd i s c r e t o sn oe s t n d a r : t y p eT I n d i c ei sr a n g e1 . . 5 0 ; -E s c a l a r e sr e a l e sn oe s t n d a r : t y p eT P e s oi sd i g i t s1 0 ; -C o m af l o t a n t ec o np r e c i s i nd e1 0c i f r a s . t y p eT M a s ai sd e l t a0 . 0 1r a n g e1 2 . 0. .1 2 . 0 ;-C o m af i j a0 . 0 1p r e c i s . -E n u m e r a c i n : t y p eT C o l o ri s( R O J O ,V E R D E ,A Z U L ) ; -V e c t o r e s : t y p eT M a t r i zi sa r r a y( 1 . . 1 0 ,1 . . 1 0 )o fF l o a t ; t y p eT V e c t o r 5i sa r r a y( T I n d i c er a n g e5 . . 1 0 )o fF l o a t ; -R e g i s t r o s : t y p eT V l v u l ai s r e c o r d N o m b r e :S t r i n g ( 1 . . 2 0 ) ; A b i e r t a :B o o l e a n ; V e l o c i d a d L q u i d o :F l o a tr a n g e0 . 0. .3 0 . 0 ; e n dr e c o r d ; -P u n t e r o s : t y p eP E n t e r oi sa c c e s sI n t e g e r ;

-A r r a y si r r e s t r i n g i d o s .T i e n e nu nn m e r oi n d e f i n i d od e -e l e m e n t o s .E sn e c e s a r i oe s p e c i f i c a rl o sl m i t e sa ld e c l a r a r -v a r i a b l e sd ee s et i p o . d e c l a r e t y p eT V e c t o r I n d e fi sa r r a y( I n t e g e rr a n g e< > )o fF l o a t ; V :T V e c t o r I n d e f( 1 . . 4 ) ; b e g i n V ( 1 ): =1 0 . 2 8 ; V: =( 1 . 2 ,1 . 5 ,1 . 8 ,1 . 3 ) ; V: =( 1= >1 . 2 ,2= >1 . 7 ,o t h e r s= >0 . 0 ) ; e n d ;

Algunos atributos aplicables a tipos


Los atributos son operaciones predefinidas que se pueden aplicar a tipos, objetos y otras entidades. Por ejemplo estos son algunos atributos aplicables a tipos: Last: Integer'Last es el mximo valor que puede tomar la variable de tipo Integer. Tambin es el ltimo valor de un tipo enumerado o del ndice de un vector. First: Integer'First es el mnimo valor que puede tomar la variable de tipo Integer. Tambin es el primer valor de un tipo enumerado o del ndice de un vector.
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 23/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Range : Vector'Range indica el rango que ocupa la variable Vector, es decir, equivale a Vector'First..Vector'Last. En el caso de ms de una dimensin, el valor Matriz'Range(1) indica el rango de la primera dimensin. Succ: TColor'Succ(ROJO) indica el siguiente valor a ROJO que toma el tipo TColor, si no existe, se eleva la excepcin Constraint_Error. Pred: TDa'Pred(VIERNES) indica el anterior valor a VIERNES que toma el tipo TDa, si no existe, se eleva la excepcin Constraint_Error. Pos : El atributo Pos indica la posicin ocupada por un determinado valor en un tipo enumeracin. Por ejemplo: TColor'Pos(ROJO). La primera posicin se considera 0. Val: El atributo Val indica el valor que ocupa una determinada posicin en un tipo enumeracin. Por ejemplo: COLOR'Val(1). Para identificar unvocamente un valor de un tipo enumeracin se emplea TColor' (ROJO) y TIndicador'(ROJO) para distinguir el valor ROJO del tipo TColor o TIndicador.

Subtipos
Los subtipos definen un subconjunto de los valores de un tipo determinado, pero no son un tipo distinto de su tipo base.

Superar una ambigedad


En el supuesto caso de que se quiera superar una ambigedad en el tipo de una variable (debera evitarse) en un determinado instante, se puede optar por convertirlo (no recomendable) o cualificarlo: Convertir el tipo, por ejemplo: Integer(I) convierte el nmero I a entero. Cualificar el tipo, por ejemplo: Integer'(I) interpreta I como entero. En ambos casos, el resultado es I como entero. La cualificacin sirve para cuando un literal no se sabe a qu tipo pertenece y se le indica de ese modo. Por ejemplo:

. . . t y p eC o l o ri s( R o j o ,A z u l ,N a r a n j a ) ; t y p eF r u t ai s( N a r a n j a ,P e r a ,M e l o n ) ; p r o c e d u r eP u t( U n a _ F r u t a:F r u t a ) ; p r o c e d u r eP u t( U n _ C o l o r:C o l o r ) ; . . . b e g i n P u t( C o l o r ' ( N a r a n j a ) ) ;-L l a m aap r o c e d u r eP u t( U n _ C o l o r:C o l o r ) P u t( F r u t a ' ( N a r a n j a ) ) ;-L l a m aap r o c e d u r eP u t ( U n a _ F r u t a:F r u t a ) P u t( N a r a n j a ) ;-E r r o rd es i n t a x i s ,l al l a m a d ae sa m b i g u a P u t( R o j o ) ;-O k ,l l a m aap r o c e d u r eP u t( U n _ C o l o r:C o l o r ) e n d ;

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

24/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Tipos avanzados
Hay otros tipos ms avanzados en Ada. Puedes optar por leer estos tipos ahora o por continuar el libro por la siguiente leccin Objetos (variables y constantes). Registros discriminados Registros variantes Punteros a objetos Punteros a subprogramas Tipos derivados Tipos etiquetados

Manual de referencia de Ada


3.2 Types and Subtypes (http://adaic.org/standards/95lrm/html/RM-3-2.html) 3.2.1 Type Declarations (http://adaic.org/standards/95lrm/html/RM-3-2.html)

Enteros
Tipos enteros con signo
Un tipo entero con signo se define declarando un rango, por ejemplo:
t y p e n d i c ei sr a n g e1. .5 0 ;

Los extremos del rango se pueden consultar con los atributos 'First y el 'Last del tipo. Cuando se asigna un valor a una variable de este tipo, se chequea en tiempo de ejecucin si pertenece al rango. En caso negativo se levanta la excepcin Constraint_Error. El compilador puede definir el tamao ms eficiente para el tipo a no ser que se defina una clusula de representacin.
t y p e n d i c ei sr a n g e1. .5 0 ; f o r n d i c e ' S i z eu s e8 ;

Ejemplo
El siguiente ejemplo, tomado del wikilibro en ingls sobre Ada, define un nuevo rango de -5 a 10 e imprime el rango completo.

-F i l e :r a n g e _ 1 . a d b( v i e w( h t t p : / / c v s . s o u r c e f o r g e . n e t / v i e w c v s . p y / a d a c l / W i k i B o o k _ A d a / S o u r c e / r a n g e _ 1 . a w i t hA d a . T e x t _ I O ; p r o c e d u r eR a n g e _ 1
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 25/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

i s t y p eR a n g e _ T y p ei sr a n g e5. .1 0 ; p a c k a g eT _ I Or e n a m e sA d a . T e x t _ I O ; p a c k a g eI _ I Oi sn e w A d a . T e x t _ I O . I n t e g e r _ I O( R a n g e _ T y p e ) ; b e g i n f o rAi nR a n g e _ T y p el o o p I _ I O . P u t( I t e m = >A , W i d t h= >3 , B a s e = >1 0 ) ; i fA<R a n g e _ T y p e ' L a s tt h e n T _ I O . P u t( " , " ) ; e l s e T _ I O . N e w _ L i n e ; e n di f ; e n dl o o p ; e n dR a n g e _ 1 ;

Tipos enteros con signo predefinidos


En el paquete Standard se predefinen varios tipos enteros con signo, como Integer (y sus subtipos Natural y Positive), Short_Integer, Long_Integer y posiblemente otros (dependiendo del compilador). Estos tipos tienen los tamaos ms adecuados para la arquitectura del computador. Si no tienes razones para definir nuevos tipos enteros, considera usar estos tipos o un subtipo de ellos. Esta sera una posible representacin grfica de los subtipos de Integer:

Enteros modulares
Los enteros modulares no tienen signo y son cclicos, es decir no se produce desbordamiento (overflow) sino wrap-around. Para estos tipos estn predefinidos los operadores lgicos (a n d ,o r ,x o r ) para realizar operaciones a nivel de bits. Se definen as:
t y p eN o m b r ei sm o dM d u l o ;

Donde el 'First es 0 y 'Last es Mdulo - 1. Como los tipos modulares son cclicos . Se puede definir un subtipo de un tipo modular:
t y p eB y t ei sm o d2 5 6 ; s u b t y p eM e d i o _ B y t ei sB y t er a n g e0. .1 2 7 ;
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

26/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Pero, cuidado porque el mdulo de M e d i o _ B y t esigue siendo 256.

Manual de referencia de Ada


3.5.4 Integer Types (http://www.adaic.com/standards/95lrm/html/RM-3-5-4.html)

Enumeraciones
Un tipo enumeracin es una lista definida de los posibles valores que puede adoptar un objeto de ese tipo. La declaracin:
t y p eC o l o r _ P r i m a r i oi s( R o j o ,V e r d e ,A z u l ) ;

establece que a un objeto del tipo Color_Primario se le puede asignar cualquiera de los tres valores indicados, y ningn otro valor. Como los tipos numricos, donde por ejemplo 1 es un literal entero, Rojo, Verde y Azul son los llamados literales del tipo. Las enumeraciones son uno de los tipos discretos, los otros son los tipos enteros.

Operadores y atributos predefinidos


Aparte del operador de igualdad ("="), los tipos enumeracin tienen predefinidos todos los operadores de orden: "<", "<=", "=", "/=", ">=", ">"; donde la relacin de orden viene dada implicitamente por la secuencia de los literales: cada literal tiene una posicin, empezando por 0 para el primero, que se incrementa en uno para cada sucesor. Esta posicin se puede obtener mediante el atributo 'Pos; el inverso es 'Val, que devuelve el valor correspondiente a una posicin. En nuestro ejemplo:
C o l o r _ P r i m a r i o ' P o s( R o j o )=0 C o l o r _ P r i m a r i o ' V a l( 0 ) =R o j o

Los literales pueden sobrecargarse, es decir, puede haber otro tipo con los mismos literales.
t y p eL u z _ d e _ T r f i c oi s( R o j o ,A m b a r ,V e r d e ) ;

Normalmente se puede determinar por el contexto a qu tipo pertenece el literal Rojo. Cuando es imposible, el programador ha de usar una expresin de desambiguacin: Tipo'(Valor).

Literales carcter
Una caracterstica bastante nica de Ada es la posibilidad de usar literales caracter como literales de una enumeracin.
t y p eA B Ci s( ' A ' ,' B ' ,' C ' ) ;

El literal 'A' no tiene mucho que ver con el literal 'A' del tipo predefinido Character (o Wide_Character).
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 27/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Todo tipo que tiene al menos un literal carcter es un tipo carcter. Para todo tipo carcter, existen literales de cadena y el operador de concatenacin predefinido "&".
t y p eM i _ C a r a c t e ri s( N o _ C a r a c t e r ,' a ' ,L i t e r a l ,' z ' ) ; t y p eM i _ S t r i n gi sa r r a y( P o s i t i v er a n g e< > )o fM i _ C a r a c t e r ; S :M i _ S t r i n g: =" a a "&L i t e r a l&" z a "&' z ' ; T :M i _ S t r i n g: =( ' a ' ,' a ' ,L i t e r a l ,' z ' ,' a ' ,' z ' ) ;

En este ejemplo, S y T contienen el mismo valor. El tipo predefinido Character se define de este modo en el paquete Standard.

Tipo boolean
El tipo predefinido boolean es una enumeracin definida en el paquete Standard de este modo:
t y p eB o o l e a ni s( F a l s e ,T r u e ) ;

Por esta razn el tipo boolean tiene todos los atributos definidos para cualquier otra enumeracin.

Subtipos de enumeracin
Se puede usar un rango para definir un subtipo sobre una enumeracin:
s u b t y p eL e t r a _ M a y s c u l ai sC h a r a c t e rr a n g e' A '. .' Z ' ; s u b t y p eC o l o r _ F r oi sC o l o r _ P r i m a r i or a n g eV e r d e. .A z u l ;

Manual de referencia de Ada


3.5.1 Enumeration Types (http://www.adaic.com/standards/95lrm/html/RM-3-5-1.html)

Coma flotante
Para definir un tipo de coma flotante es suficiente con definir cuantos dgitos se necesitan de este modo:
d i g i t sD i g i t o s

Si se desea tambin se puede definir el rango mnimo:


d i g i t sD i g i t o sr a n g eP r i m e r o. . l t i m o

Esta capacidad es uno de los grandes beneficios de Ada sobre la mayora de los lenguajes de programacin en este respecto. Otros lenguajes, slo proporcionan un tipo float y otro long float , y lo que la mayora de los programadores hacen es:
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 28/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

elegir float si no estn interesados en la precisin de lo contrario, eligen long float , puesto que es lo mejor que pueden obtener. En cualquiera de los dos casos, el programador no sabe cual es la precisin que obtiene. En Ada, uno especifica la precisin necesitada y el compilador elige el tipo de coma flotante que cumple al menos esa precisin. De este modo el requisito se cumple. Adems, si la mquina tiene ms de dos tipos de coma flotante, el compilador puede hacer uso de todos ellos. Por supuesto, el programador tambin puede hacer uso de los tipos de coma flotante predefinidos que son Float y posiblemente (si el compilador lo implementa) Short_Float , Short_Short_Float , Long_Float y Long_Long_Float .

Manual de referencia de Ada


3.5.7 Floating Point Types (http://www.adaic.com/standards/95lrm/html/RM-3-5-7.html)

Coma fija
Coma fija decimal
Es posible definir un tipo de coma fija decimal declarando el delta (el error absoluto) y la cantidad de dgitos en base decimal necesitados (incluyendo la parte real):
d e l t aD e l t ad i g i t sD i g i t o s

Delta ha de ser una potencia de 10, si no, el tipo no ser de coma fija decimal. Tambin podemos definir el rango mnimo necesitado:
d e l t aD e l t ad i g i t sD i g i t o sr a n g eP r i m e r o. . l t i m o

Ejemplo:
t y p eT _ P r e c i o _ e n _ E u r o si sd e l t a0 . 0 1d i g i t s1 5 ;

Coma fija ordinaria


Para un tipo de coma fija ordinaria (binaria) se especifica simplemente el delta con un rango.
d e l t aD e l t ar a n g eP r i m e r o. . l t i m o

Ejemplo:
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 29/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

t y p eT _ M e d i d ai sd e l t a0 . 1 2 5r a n g e0 . 0. .2 5 5 . 0 ;

Manual de referencia Ada


3.5.9 Fixed Point Types (http://www.adaic.org/standards/95lrm/html/RM-3-5-9.html)

Arrays
Un array es una coleccin de elementos a los que se puede acceder por su ndice. En Ada todo tipo definitivo (aquel del que se conoce su tamao) se permite como elemento y cualquier tipo discreto, (es decir, enteros con signo y modulares, o enumeraciones) puede usarse como ndice.

Declaracin de arrays
Los arrays de Ada son de alto nivel, comparados, por ejemplo, con los de C/C++. Esto se traduce en varias posibilidades sintcticas que se presentan a continuacin.

Sintxis bsica
La declaracin bsica de un array es la siguiente:
a r r a y( T i p o _ n d i c e )o fT i p o _ E l e m e n t o

Este array consiste en un elemento de tipo Tipo_Elemento por cada posible valor de Tipo_ndice. Por ejemplo, si quisieramos contar las ocurrencias de cada letra en un texto nos definiramos un array de este tipo:
t y p eC o n t a d o r _ C a r a c t e r e si sa r r a y( C h a r a c t e r )o fN a t u r a l ;

Nota: usamos Natural como tipo de elemento puesto que los valores negativos de Integer no tienen sentido en una cuenta. Es conveniente usar el subtipo entero ms adecuado en cada caso, puesto que as nos beneficiamos de la comprobacin de rango y podemos descubrir errores fcilmente.

Con subrango conocido


A menudo no necesitamos un array con todos los valores posibles del tipo del ndice. En este caso definimos un subtipo del tipo ndice con el rango necesitado.
s u b t y p eS u b t i p o _ n d i c ei sT i p o _ n d i c er a n g eP r i m e r o. . . l t i m o ; a r r a y( S u b t i p o _ n d i c e )o fT i p o _ E l e m e n t o ;

Para lo que hay una forma ms abreviada si no deseamos definir el subtipo con nombre, se puede hacer annimamente:

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

30/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

a r r a y( T i p o _ n d i c er a n g eP r i m e r o. . . l t i m o )o fT i p o _ E l e m e n t o ;

Puesto que Primero y ltimo son expresiones del tipo Tipo_ndice, una forma ms simple es la siguiente:
a r r a y( P r i m e r o. . . l t i m o )o fT i p o _ E l e m e n t o

Ten en cuenta que si First y Last son literales numricos, esto implica que el tipo ndice base es el Integer. Si en el ejemplo anterior, slo desesemos contar letras maysculas desechando otros caracteres, podramos definir el tipo array de este modo:
t y p eC o n t a d o r _ C a r a c t e r e si sa r r a y( C h a r a c t e rr a n g e' A '. .' Z ' )o fN a t u r a l ;

Con un subrango desconocido


A menudo el rango necesitado no se conoce hasta tiempo de ejecucin o necesitamos objetos array de varias longitudes. En lenguajes de ms bajo nivel como C necesitaramos hacer uso de la memoria dinmica (del heap). Pero no es el caso de Ada, puesto que la caja <> nos permite declarar arrays de tamao no restringido:
a r r a y( T i p o _ n d i c er a n g e< > )o fT i p o _ E l e m e n t o

Cuando declaramos objetos de este tipo, los extremos (bounds) del array deben conocerse, bien como resultado de una funcin o por una inicializacin mediante un agregado. Desde su declaracin hasta su finalizacin, el objeto no puede cambiar de tamao.

Con elementos aliased


Los programadores de C/C++ dan por hecho que todo elemento de un array tiene una direccin propia en memoria (de hecho el nombre del array es un puntero sobre el que se puede operar). En Ada, esto no es siempre as. Veamos este ejemplo:
t y p eD a _ D e _ M e si sr a n g e1. .3 1 ; t y p eD a _ C o n _ C i t ai sa r r a y( D a _ D e _ M e s )o fB o o l e a n ; p r a g m aP a c k( D a _ C o n _ C i t a ) ;

Puesto que hemos empaquetado el array, el compilador usar el mnimo espacio de almacenamiento posible. En la mayora de los casos esto implica que los 8 valores booleanos cabrn en un byte. Pero este no es el nico caso en el que el compilador de Ada puede empaquetar un array puesto que tiene libertad en los casos en que sea ms optimo. Si queremos acceder con un puntero a cada elemento tenemos que expresarlo explcitamente.
t y p e D a _ D e _ M e si sr a n g e1. .3 1 ; t y p eD a _ C o n _ C i t ai sa r r a y( D a _ D e _ M e s )o fa l i a s e dB o o l e a n ;

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

31/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Uso de arrays
Para acceder a los elementos de un array se usan el nombre del objeto array seguido del ndice entre parntesis. Se puede acceder a una rodaja (slice) de un array usando (x .. y).
V e c t o r _ A( 1. .3 ): =V e c t o r _ B( 4. .6 ) ;

El operador "&" permite concatenar arrays:


N o m b r e _ C o m p l e t o: =N o m b r e&''&A p e l l i d o s ;

Si se intenta acceder a un elemento ms alla de los lmites del array o se asigna a un array (completo o slice) un array de distinto tamao se levanta la excepcin Constraint_Error (a menos que los chequeos estn deshabilitados).

Ejemplo de uso
w i t hA d a . T e x t _ I O ,A d a . I n t e g e r _ T e x t _ I O ; u s eA d a . T e x t _ I O ,A d a . I n t e g e r _ T e x t _ I O ; p r o c e d u r eA g e n d ai s t y p eD i a _ D e _ M e si sr a n g e1. .3 1 ; t y p eD i a _ C o n _ C i t ai sa r r a y( D i a _ D e _ M e s )o fB o o l e a n ; C i t a s _ E n _ M a y o:D i a _ C o n _ C i t a: =( o t h e r s= >F a l s e ) ;-S ei n i c i a l i z at o d oe lm e saF a l s e b e g i n -T e n g oc i t a sl o sd i a s3 ,d e l8a l1 6( e x c e p t oe l1 4 ) ,ye l l t i m od ad e lm e s . C i t a s _ E n _ M a y o( 3 ): =T r u e ; C i t a s _ E n _ M a y o( 8. .1 6 ): =( o t h e r s= >T r u e ) ; C i t a s _ E n _ M a y o( 1 4 ): =F a l s e ; C i t a s _ E n _ M a y o( C i t a s _ E n _ M a y o ' L a s t ): =T r u e ; P u t( " E nm a y ot i e n e sc i t a sl o sd i a s : " ) ; f o rIi nC i t a s _ E n _ M a y o ' R a n g el o o p i fC i t a s _ E n _ M a y o( I )t h e n P u t( D i a _ D e _ M e s ' I m a g e( I ) ) ; e n di f ; e n dl o o p ; e n dA g e n d a ;

Vase tambin
Fundamentos de programacin/Estructuras de datos/Arrays

Manual de referencia de Ada


3.6 Array Types (http://www.adaic.org/standards/95lrm/html/RM-3-6.html)

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

32/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Strings
En Ada los strings son un tipo especial de array que est implicitamente definido en el paquete Standard como:
t y p eS t r i n gi sa r r a y( P o s i t i v er a n g e< > )o fC h a r a c t e r ;

Que el rango se defina sobre el subtipo Positive implica que ningn string de Ada puede empezar en 0. Esta es una diferencia con los strings de C/C++, la otra es que un string de Ada no tiene por qu terminar en NUL (carcter de cdigo 0), de hecho puede tener caracteres NUL intercalados. Esto es as porque los arrays de Ada siempre llevan asociados los lmites (atributos 'First y 'Last). Los literales de tipo String se encierran entre comillas. Al ser String un array no restringido no podemos definir variables de ese tipo sin definir explcitamente o implcitamente los lmites del array.
N o m b r e:S t r i n g( 1. .8 ) ; -E x p l c i t a m e n t e

N o m b r e:S t r i n g: =" F u l a n i t o " ;-I m p l c i t a m e n t e

El operador & est definido para concatenar strings entre s y caracteres con strings.
N o m b r e _ C o m p l e t o:c o n s t a n tS t r i n g: =N o m b r e&''&A p e l l i d o s ;

Puesto que hay dos tipos de caracteres, hay tambin dos tipos de strings: String y Wide_String que es un array de Wide_Character. En Ada 2005 aparece tambin el tipo Wide_Wide_String cuyos elementos son Wide_Wide_Character. Para facilitar el uso de los strings hay varios paquetes predefinidos para su manejo: Ada.Strings.Fixed: para strings de tamao fijo. Ada.Strings.Bounded: para strings con longitud variable y un limite superior definido. Ada.Strings.Unbounded: para strings con longitud variable y sin lmites de tamao. Para manejo de Wide_Strings existen otros tres paquetes predefinidos que se nombran anteponiendo Wide_ a cada uno.

Manual de refencia de Ada


2.6 String Literals (http://www.adaic.com/standards/95lrm/html/RM-2-6.html) 3.6.3 String Types (http://www.adaic.com/standards/95lrm/html/RM-3-6-3.html) A.4.3 Fixed-Length String Handling (http://www.adaic.com/standards/95lrm/html/RM-A-4-3.html) A.4.4 Bounded-Length String Handling (http://www.adaic.com/standards/95lrm/html/RM-A-4-4.html) A.4.5 Unbounded-Length String Handling (http://www.adaic.com/standards/95lrm/html/RM-A-4-5.html)

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

33/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Registros
Un registro es un tipo que almacena varios campos de tipos distintos y que se identifican por su nombre. En C/C++ se llaman s t r u c ty en Pascal y Ada r e c o r d .
t y p eT _ S e n s o ri s r e c o r d M a g n i t u d:N a t u r a l ; A l a r m a :B o o l e a n ; e n dr e c o r d ;

Acceso a los campos


Para acceder a los campos de un registro se usa la clsica notacin registro.componente:
p r o c e d u r eM e d i r _ t e m p e r a t u r ai s S e n s o r _ t e m p e r a t u r a:T _ S e n s o r ; b e g i n S e n s o r _ t e m p e r a t u r a . M a g n i t u d: =2 3 ; S e n s o r _ t e m p e r a t u r a . A l a r m a: =F a l s e ; -. . . i fS e n s o r _ t e m p e r a t u r a . A l a r m at h e n P u t _ L i n e( " A l a r m ad et e m p e r a t u r a " ) ; e n di f ; e n d ;

Para asignar valores a todos los componentes se puede utilizar un agregado, lo cual es til para asegurarnos de que no dejamos ninguno sin darle un valor:
p r o c e d u r eA s i g n a r _ t e m p e r a t u r ai s S e n s o r _ t e m p e r a t u r a:T _ S e n s o r ; b e g i n S e n s o r _ t e m p e r a t u r a: = ( M a g n i t u d= >2 3 , A l a r m a = >F a l s e ) ; e n d ;

Tambin es posible dar un valor inicial a algunos o todos los componentes de un registro de modo que todos los objetos de ese tipo se inicialicen automticamente con esos valores:
t y p eT _ S e n s o ri s r e c o r d M a g n i t u d:N a t u r a l: =0 ; A l a r m a :B o o l e a n: =F a l s e ; e n dr e c o r d ;

Registro nulo
El registro nulo se puede usar cuando se necesita un tipo que no almacene ningn dato (aunque parezca raro hay casos en los que es til, como instanciar un genrico que pide un tipo, para el cual no tenemos ningn dato que pasarle). Hay dos maneras de declarar un registro nulo:
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 34/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

t y p eR e g i s t r o _ N u l o i sr e c o r d n u l l ; e n dr e c o r d ;

t y p eR e g i s t r o _ N u l oi sn u l lr e c o r d ;

Ambas definiciones son semnticamente idnticas, la segunda es simplemente una sintaxis abreviada. La declaracin de una variable o constante de este tipo sera:
N u l o:c o n s t a n tR e g i s t r o _ N u l o: =( n u l lr e c o r d ) ;

Tipos especiales de registros


Registros con discriminante Registros con parte variante Registros etiquetados, dan soporte de la programacin orientada a objetos en Ada 95.

Manual de referencia de Ada


3.8 Record Types (http://www.adaic.com/standards/95lrm/html/RM-3-8.html)

Registros discriminados
En un tipo registro discriminado, a algunos de los componentes se los conoce como discriminantes y el resto pueden depender de ellos. Los discriminantes tienen que ser de tipo discreto o puntero. Por ejemplo:
t y p eT _ M a t r i zi sa r r a y( I n t e g e rr a n g e< > ,I n t e g e rr a n g e< > )o fF l o a t ; t y p eT _ M a t r i z _ C u a d r a d a( O r d e n :P o s i t i v e )i s r e c o r d M a t r i z :T _ M a t r i z ( 1 . . O r d e n ,1 . . O r d e n ) ; e n dr e c o r d ;

De esta forma, se asegura que la matriz utilizada sea cuadrada. El primer componente (Orden) es el discriminante del subtipo discreto Positive, mientras que el segundo componente (Matriz) es una matriz siempre cuadrada y cuyos lmites dependen del valor de Orden. Ahora se utilizara de la siguiente manera:
M :T _ M a t r i z _ C u a d r a d a ( 3 ) ; -T a m b i ns ep u e d ee m p l e a rM :T _ M a t r i z _ C u a d r a d a ( O r d e n= >3 ) ; M: =( 3 ,( 1 . . 3= >( 1 . . 3= >0 . 0 ) ) ) ; M: =( M . O r d e n ,( M . M a t r i z ' R a n g e ( 1 )= >( M . M a t r i z ' R a n g e ( 2 )= >5 . 0 ) ) ) ; -E nl as e n t e n c i aa n t e r i o rM . o r d e ny ae s t d e f i n i d oei g u a la3 .

Una vez que se declara la variable ya no se puede cambiar su restriccin. Sin embargo, si se declara lo siguiente:
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 35/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

M a x :c o n s t a n t: =1 0 0 ; s u b t y p eT _ n d i c ei sI n t e g e rr a n g e0 . . M a x ; t y p eT _ V e c t o r _ E n t e r o si sa r r a y( I n t e g e rr a n g e< > )o fI n t e g e r ; t y p eT _ P o l i n o m i o( N :T n d i c e: =0 )i s -D i s c r i m i n a n t ec o nv a l o ri n i c i a l . r e c o r d P o l :T _ V e c t o r _ E n t e r o s ( 0 . . N ) ; e n dr e c o r d ;

Ahora, se pueden declarar variables que no tengan restricciones:


P ,Q :T _ P o l i n o m i o ;

El valor inicial de sus discriminantes sera cero (el valor por defecto de N). As, se podra cambiar el discriminante posteriormente de esta manera:
P :T _ P o l i n o m i o: =( 3 ,( 5 ,0 ,4 ,2 ) ) ; R :T _ P o l i n o m i o ( 5 ) ; -A q u s l os ep o d r a nu s a rp o l i n o m i o sd eg r a d o5 .

Manual de referencia Ada


3.7 Discriminants (http://www.adaic.com/standards/95lrm/html/RM-3-7.html)

Registros variantes
Puede interesar que un registro contenga partes de su estructura que puedan variar en funcin de otras. Para ello se definen los registros variantes que son un tipo especial de registros discriminados en los que la existencia de algunos campos depende del valor del discriminante. Por ejemplo:
d e c l a r e t y p eT T i p o V u e l oi s( M I L I T A R ,C I V I L ,E N E M I G O ,D E S C O N O C I D O ) ; t y p eT R e g i s t r o V u e l o( C l a s i f :T T i p o V u e l o )i s r e c o r d V e l o c i d a d :F l o a t ; D e t a l l e s :S t r i n g ( 1 . . 1 0 0 ) ; c a s eC l a s i fi s w h e nC I V I L= >n u l l ; w h e nM I L I T A R= >O r i g e n ,D e s t i n o :S t r i n g ( 1 . . 1 0 ) ; w h e nE N E M I G O|D E S C O N O C I D O= >N i v e l A m e n a z a :I n t e g e r ; e n dc a s e ; e n dr e c o r d ; V u e l o 1 :T R e g i s t r o V u e l o( M I L I T A R ) ; b e g i n V u e l o 1 . O r i g e n: =" F r a n c i a " ; e n d ;

Ilegal sera V u e l o 1 . N i v e l A m e n a z a: =1 ;pues dicho campo slo es vlido para D E S C O N O C I D Oo E N E M I G O . Si el discriminante lleva un valor por defecto entonces el registro es variante durante su ciclo de vida (es mutable), si no, el valor del discriminante se fija en su declaracin y no vara durante la vida del objeto.
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 36/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Los registros variantes en cierto modo estn sobrepasados por la extensin de los tipos etiquetados, sin embargo an son tiles en casos simples como aquellos en los que se conocen todas las posibilidades y no se desea que alguien aada una derivacin a posteriori.

Vase tambin
Registros Registros discriminados Registros etiquetados

Manual de referencia de Ada


3.8.1 Variant Parts and Discrete Choices (http://www.adaic.com/standards/95lrm/html/RM-3-8-1.html)

Punteros a objetos
Un nombre est ligado a un objeto desde su declaracin hasta que el flujo del programa deja la unidad que contena su declaracin. Sin embargo, los punteros o apuntadores (access) proporcionan acceso a otros objetos, que se pueden crear y destruir dinmicamente. El nombre de access en vez del habitual pointer se debe a que al disear Ada se quera huir de la mala fama que los punteros haban creado gracias a lenguajes como C, en los que se puede usar los punteros de manera muy insegura. Los tipos acceso de Ada son ms seguros entre otras cosas porque no existe la aritmtica de punteros, especialmente peligrosa. Adems el uso de punteros en Ada es prescindible en muchas ms situaciones que en C. Las variables de tipo puntero en Ada se inicializan implcitamente a null.

Ejemplos
Por ejemplo, se puede definir un puntero a un tipo entero de esta manera:
t y p eP E n t e r oi sa c c e s sI n t e g e r ;

En un ejemplo con registros:


d e c l a r e t y p eT B f e ri s r e c o r d M e n s a j e :S t r i n g ( 1 . . 4 ) ; P r i o r i d a d :I n t e g e r ; e n dr e c o r d ; t y p eP T B f e ri sa c c e s sT B f e r ; M e n s a j e 1 ,M e n s a j e 2 :P T B f e r ; b e g i n M e n s a j e 1: =n e wT B f e r ; -S ec r e au no b j e t od et i p oT B f e r . M e n s a j e 2: =n e wT B f e r ' ( P r i o r i d a d= >2 ,M e n s a j e= >" H o l a " ) ; -C o na l ls ep u e d ed e s r e f e r e n c i a re lp u n t e r o . -M e n s a j e 1e su np u n t e r oyM e n s a j e 1 . a l le se lr e g i s t r o . M e n s a j e 1 . a l l . P r i o r i d a d: =3 ;
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 37/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

-S i ne m b a r g o ,a la c c e d e rac a m p o sd e lr e g i s t r ol ad e s r e f e r e n c i a c i n -p u e d eh a c e r s ei m p l c i t ay. a l le so p c i o n a le ne s o sc a s o s : M e n s a j e 1 . P r i o r i d a d: =3 ; e n d ;

Es til para implementar listas, colas, rboles y grafos. Por ejemplo:


d e c l a r e -T N o d o r b o l B i n a r i os en e c e s i t ap a r ad e f i n i re lp u n t e r o . t y p eT N o d o r b o l B i n a r i o ; -S ed e c l a r ad e s p u s . t y p eP T N o d o r b o l B i n a r i oi sa c c e s sT N o d o r b o l B i n a r i o ; t y p eT N o d o r b o l B i n a r i oi s r e c o r d R a m a I z d a :P T N o d o r b o l B i n a r i o ; D a t o :F l o a t ; R a m a D c h a :P T N o d o r b o l B i n a r i o ; e n dr e c o r d ; r b o l B i n a r i o :P T N o d o r b o l B i n a r i o ; b e g i n -S ec r e al ar a zd e l r b o lb i n a r i o . r b o l B i n a r i o: =n e wT N o d o r b o l B i n a r i o ' ( n u l l ,1 . 0 ,n u l l ) ; e n d ;

Liberacin de memoria
Cuando se quiera liberar la memoria dinmicamente, hay que hacer uso del procedimiento genrico Ada.Unchecked_Deallocation [2] (http://www.adaic.org/standards/95lrm/html/RM-13-11-2.html#I4441) , el cual se instancia con los tipos de objeto y de puntero, y se le llama pasndole punteros. Por ejemplo:
w i t hA d a . U n c h e c k e d _ D e a l l o c a t i o n ; p r o c e d u r eE j e m p l o _ L i b e r a r _ M e m o r i ai s t y p eT V e c t o ri sa r r a y( I n t e g e rr a n g e< > )o fF l o a t ; t y p eP V e c t o ri sa c c e s sT V e c t o r ; P V :P V e c t o r ; p r o c e d u r eL i b e r a r _ V e c t o ri sn e wA d a . U n c h e c k e d _ D e a l l o c a t i o n ( T V e c t o r ,P V e c t o r ) ; b e g i n P V: =n e wT V e c t o r ( 1 . . 1 0 ) ; P V . a l l: =( o t h e r s= >0 . 0 ) ; -. . . L i b e r a r _ V e c t o r( P V ) ;-L am e m o r i ae sl i b e r a d ayP Ve sa h o r an u l l e n dE j e m p l o _ L i b e r a r _ M e m o r i a ;

El nombre de Unchecked_Deallocation viene del hecho de que no hay comprobacin de que no queden punteros colgantes (dangling pointers), es decir que si se ha copiado el puntero en otra variable, despus de llamar a Liberar_Vector el puntero copia est apuntando a una direccin de memoria no reservada y los efectos son imprevisibles, puesto que se puede haber reservado y se pude escribir o leer memoria que ya no pertenece a ese objeto. Este sistema es similar al de C++ con new y delete. Un sistema de recoleccin de basura similar al de Java est previsto en el estndar, pero ningn compilador de Ada hasta el momento lo proporciona. Esto es debido a que aunque es un mecanismo ms seguro, es menos eficiente y puede ser un problema para los sistemas de tiempo real por su impredictibilidad. En Ada 95 existen mtodos de gestin de memoria ms seguros que el uso directo de Unchecked_Deallocation
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 38/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

basados en los tipos controlados, algo semejante a lo que se consigue en C++ con constructores y destructores que manejan memoria dinmica.

Manual de referencia de Ada


3.10 Access Types (http://www.adaic.com/standards/95lrm/html/RM-3-10.html)

Punteros a subprogramas
Un puntero a subprograma nos permite llamar a un subprograma sin conocer su nombre ni dnde est declarado. Este tipo de punteros se suele utilizar en los conocidos callbacks.
t y p eT P C a l l b a c ki sa c c e s sp r o c e d u r e( I d:I n t e g e r ;M e n s a j e:S t r i n g ) ;

t y p eT F C a l l b a c ki sa c c e s sf u n c t i o n( M e n s a j e:S t r i n g )r e t u r nN a t u r a l ;

Para obtener el valor del puntero se usa el atributo 'Access aplicado a un subprograma con el prototipo adecuado, es decir, han de coincidir orden y tipo de los parmetros, y en el caso de las funciones, el tipo de retorno.
p r o c e d u r eP r o c e s a r E v e n t o( I d:I n t e g e r ;M e n s a j e:S t r i n g ) ; M i C a l l b a c k:T P C a l l b a c k: =P r o c e s a r E v e n t o ' A c c e s s ;

Los punteros a subprograma fueron una de las extensiones de Ada 95.

Manual de referencia de Ada


3.10 Access Types (http://www.adaic.com/standards/95lrm/html/RM-3-10.html)

Tipos derivados
Hay ocasiones en las que es til introducir un tipo nuevo que es similar en la mayora de los aspectos a uno ya existente, pero que es un tipo distinto. Con la siguiente sentencia, se dice que S es un tipo derivado de T:
t y p eSi sn e wT ;

Caractersticas
Los aspectos que definen a un tipo son su conjunto de valores y su conjunto de operaciones. El conjunto de valores de un tipo derivado es una copia del conjunto de valores del progenitor y, al ser copia, no pueden asignarse entre ambos. El conjunto de operaciones aplicables a un tipo derivado son:
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 39/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Los atributos son los mismos. A no ser que el tipo progenitor sea limitado, posee la asignacin, igualdad y desigualdad predefinidas. El tipo derivado heredar los subprogramas primitivos del tipo progenitor, es decir, los subprogramas que tengan algn parmetro o un resultado de dicho tipo, y bien sean predefinidos o estn definidos en el mismo paquete que el tipo progenitor. Estas operaciones heredadas, a efectos de uso, es como si estuvieran definidas en la misma regin declarativa que el tipo derivado.

Ejemplo
Por ejemplo, si se tiene t y p eT E n t e r o N u e v oi sn e wI n t e g e r , entonces el tipo derivado TEnteroNuevo heredar los subprogramas predefinidos como "+", "-", "abs", etc. y los atributos como First o Last. As, por ejemplo, se puede escribir:
t y p eT N u m M a n z a n a si sn e wI n t e g e r ; N u m M a n z a n a s :T N u m M a n z a n a s ; -. . . N u m M a n z a n a s: =N u m M a n z a n a s+1 ;

Como puede observarse, se hace uso del operador "+" predefinido para el tipo Integer.

Tipos derivados frente a subtipos


Cundo crear un tipo derivado en vez de un subtipo? Cuando queremos tener un nuevo tipo cuyos valores no deseamos que se confundan con los del tipo original pero queremos que posea las mismas operaciones y la misma representacin que el tipo base. Por ejemplo:
-S u p o n g a m o sq u et e n e m o sc a j a se nl a sq u ec a b e n2 0p i e z a sd ef r u t a s s u b t y p eT N u m F r u t a si sN a t u r a lr a n g e1. .2 0 ; t y p eT N u m M a n z a n a si sn e wT N u m F r u t a s ; t y p eT N u m P e r a si sn e wT N u m F r u t a s ; N u m M a n z a n a s :T N u m M a n z a n a s ; N u m P e r a s :T N u m P e r a s ; N u m F r u t a s :T N u m F r u t a s ; -. . . -E r r o rd ec o m p i l a c i n ,n op o d e m o sj u n t a rp e r a sc o nm a n z a n a s : N u m M a n z a n a s: =N u m M a n z a n a s+N u m P e r a s ; -I l e g a l -P e r os i e m p r ep o d e m o sc o n t a b i l i z a r l o sc o m of r u t a sc o n v i r t i e n d oa lt i p o -b a s e : N u m F r u t a s: =T N u m F r u t a s( N u m M a n z a n a s )+T N u m F r u t a s( N u m P e r a s ) ;

Nota para programadores de C/C++: t y p e d e frealmente no define un tipo, sino que define un nuevo nombre para un mismo tipo, algo parecido al subtype, pero nada que ver con el t y p eSi sn e wT .

Manual de referencia de Ada


es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 40/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

3.2.3 Classification of Operations (http://www.adaic.com/standards/95lrm/html/RM-3-2-3.html) 3.4 Derived Types and Classes (http://www.adaic.com/standards/95lrm/html/RM-3-4.html)

Tipos etiquetados

Ada 83 fue diseado para dar soporte a desarrollos de sistemas empotrados, de tiempo real y misin crtica. Para este tipo de trabajos, las caractersticas de Ada, como el tipado fuerte y la divisin en paquetes, permitan el uso de una serie de metodologas de desarrollo, con un razonable grado de comodidad. Sin embargo, en los aos 90, el advenimiento de la programacin orientada a objectos, hizo necesario que Ada se extendiera para dar cabida a esta nueva metodologa. Esto debido, a que la programacin orientada a objeto necesitaba de un soporte en el manejo de tipos y en la visibilidad de los mtodos, que Ada 83 hubiera considerado como no permitido. Los cambios necesarios, fueron incorporados al nuevo estndar: Ada95. Bsicamente, los cambios se centraron alrededor del uso de los tipos etiquetados , una construccin software que aade flexibilidad al tipado fuerte, justo en grado necesario para permitir representar en Ada un diagrama de objectos , por ejemplo, en UML. Los tipos etiquetados de Ada 95 son los que permiten realizar el polimorfismo. A menudo se asimila la combinacin de un tipo etiquetado y el paquete que lo contiene a una clase en otros lenguajes de programacin tambin orientados a objetos. Sin embargo hay algunas diferencias de sintaxis, que no de filosofa general, que veremos en este apartado. Un tipo etiquetado puede ser un registro de modo que su estructura es pblica, o puede ser un tipo privado, aunque en la parte privada siempre se termina definiendo como un registro.
t y p eT _ B a s ei st a g g e d r e c o r d . . . e n dr e c o r d ;

t y p eT _ B a s ei st a g g e dp r i v a t e ;

Un tipo etiquetado se puede extender.


t y p eT _ D e r i v a d oi sn e wT _ B a s ew i t h r e c o r d . . . e n dr e c o r d ;

t y p eT _ D e r i v a d oi sn e wT _ B a s ew i t hp r i v a t e ;

El nuevo tipo hereda todos las operaciones primitivas del tipo base y las puede redefinir.
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 41/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Todo objeto de un tipo etiquetado contiene una etiqueta (tag) que permite reconocer su tipo en tiempo de ejecucin.

Tipos polimrficos (class-wide type)


En Ada el polimorfismo se consigue con un tipo especial que puede contener objetos de cualquier tipo derivado de uno dado. Estos tipos especiales se indican con el atributo Class, es decir, T_Base'Class puede almacenar cualquier objeto derivado del tipo T_Base. Este tipo de la clase es un tipo irrestringido, es decir, para declarar un objeto de este tipo tenemos que inicializarlo llamando a una funcin, asignndole otro objeto o con un new (si es un puntero a tipo polimrfico, es decir, access all T_Base'Class).

Llamadas que despachan


La ventaja del polimorfismo es poder escribir algoritmos que no dependen del tipo concreto de los objetos que se manejan. El polimorfismo dinmico que proporciona la programacin orientada a objetos permite que una operacin sobre un objeto polimrfico se realice de distinto modo dependiendo del tipo concreto del objeto de que se trate en la ejecucin. Otras formas de polimorfismo son el polimorfismo paramtrico que se implementa en Ada con las unidades genricas y el polimorfismo por sobrecarga. En Ada este polimorfismo se consigue llamando a una operacin primitiva de un objeto polimrfico. Cuando el objeto sobre el que se realiza la operacin es polimrfico y el parmetro formal del subprograma llamado es concreto, el subprograma realmente llamado puede ser uno redefinido para el tipo concreto si se ha redefinido para l una implementacin distinta de la del tipo base. Nota para programadores de C++: esto quiere decir que en Ada todos los "mtodos" son virtuales, pero no todas las llamadas son virtuales, slo las que llaman a un mtodo de un objeto polimrfico (semejante a un puntero a clase base).

Manual de referencia de Ada


3.9 Tagged Types and Type Extensions (http://www.adaic.com/standards/95lrm/html/RM-3-9.html) 3.9.1 Type Extensions (http://www.adaic.com/standards/95lrm/html/RM-3-9-1.html) 3.9.2 Dispatching Operations of Tagged Types (http://www.adaic.com/standards/95lrm/html/RM-3-92.html)

Subtipos
Los subtipos se emplean para definir un subconjunto de un tipo determinado definido por una restriccin. Esta restriccin puede ser un rango para un tipo escalar:
s u b t y p eT D a D e l M e si sI n t e g e rr a n g e1 . . 3 1 ; s u b t y p eT D a F e b r e r oi sT D a D e l M e sr a n g e1 . . 2 9 ; s u b t y p eT L a b o r a b l ei sT D a D e S e m a n ar a n g eL u n e s . . V i e r n e s ;
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 42/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

O una restriccin en un array irrestringido:


t y p eT M a t r i zi sa r r a y( P o s i t i v er a n g e< > ,P o s i t i v er a n g e< > )o fI n t e g e r ; s u b t y p eT M a t r i z 1 0 x 1 0i sT M a t r i z( 1. .1 0 ,1. .1 0 ) ;

O una restriccin en el valor de un registro discriminado:


t y p eT P e r s o n a( S e x o:T S e x o )i s r e c o r d N o m b r e:T N o m b r e ; c a s eS e x oi s w h e nM u j e r= >E m b a r a z a d a:B o o l e a n ; w h e nH o m b r e= >n u l l ; e n dc a s e ; e n dr e c o r d ; s u b t y p eT M u j e ri sT P e r s o n a( S e x o= >M u j e r ) ;

Los subtipos de un mismo tipo base son totalmente compatibles entre s, es decir no es necesaria una conversin de tipos para asignar objetos de subtipos distintos. Sin embargo, si en tiempo de ejecucin se asigna un objeto a una variable y no se cumplen las restricciones del subtipo, se levantar la excepcin Constraint_Error.

Manual de referencia de Ada


3.2 Types and Subtypes (http://www.adaic.com/standards/95lrm/html/RM-3-2.html) 3.2.2 Subtype Declarations (http://www.adaic.com/standards/95lrm/html/RM-3-2-2.html)

Objetos
Los objetos son entidades que se crean en tiempo de ejecucin y contienen un valor de un determinado tipo. En Ada los objetos se clasifican en variables y constantes. Ntese que el concepto de objeto no implica necesariamente el uso del paradigma de la orientacin a objetos. Para programar orientado a objetos en Ada se utilizan los objetos de tipo etiquetado.

Variables
Una variable se introduce en el programa mediante una declaracin, que se podra denotar as:
d e c l a r a c i n _ v a r i a b l e: : =i d e n t i f i c a d o r{,i d e n t i f i c a d o r}:t i p o [: =e x p r e s i n];

Por ejemplo:
V :B o o l e a n: =T R U E ; I ,J :I n t e g e r: =1 ; N o m b r e :S t r i n g: =" W i k i l i b r o s " ; D e s t i n o _ A _ C a l c u l a r :C o o r d e n a d a s ;
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 43/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Constantes
Una constante es un objeto que se inicializa a un valor cuando se declara y posteriormente no puede cambiar. Una constante se declara igual que una variable, pero aadiendo la palabra reservada c o n s t a n t :
d e c l a r a c i n _ c o n s t a n t e: : =i d e n t i f i c a d o r{,i d e n t i f i c a d o r}:c o n s t a n t [t i p o ][: =e x p r e s i n];

Por ejemplo:
P I :c o n s t a n tF l o a t: =3 . 1 4 1 5 9 _ 2 6 5 3 6 ;

Un tipo especial de constante es el nmero nombrado para el cual no es necesario especificar un tipo y que es equivalente a usar el literal correspondiente.
O t r o P I :c o n s t a n t: =3 . 1 4 ; -E ne s t ec a s oe sd et i p ou n i v e r s a l _ f l o a t .

Manual de referencia de Ada


3.3 Objects and Named Numbers (http://www.adaic.com/standards/95lrm/html/RM-3-3.html)

Atributos
Los atributos son operaciones predefinidas que se pueden aplicar a tipos, objetos y otras entidades. Tienen la siguiente sintaxis:
E n t i d a d ' A t r i b u t o

o bien
T i p o ' A t r i b u t o ( E n t i d a d )

Atributos aplicables a tipos


Por ejemplo estos son algunos atributos aplicables a tipos (por orden alfabtico): Ceiling. Se usa con la forma X'Ceiling(Y), siendo X cualquier tipo flotante e Y una variable de ese tipo. Devuelve el "techo" de Y, es decir el valor entero ms pequeo que es mayor o igual que Y. Digits . Representa el nmero de decimales de la mantisa de un tipo flotante. First. Indica el mnimo valor que puede tomar una variable de un tipo discreto, sea entero o enumeracin. Se usa con la forma T'First, siendo T un tipo discreto (entero o enumeracin).
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 44/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Image . Se usa con la forma X'Image(Y), siendo X cualquier tipo discreto e Y una variable de ese tipo. Devuelve una cadena (String) con la representacin del valor de la variable Y. Last. Indica el mximo valor que puede tomar una variable de un tipo discreto, sea entero o enumeracin. Pos . Indica la posicin ocupada por un determinado valor en un tipo enumeracin. Por ejemplo: TColor'Pos(ROJO). La primera posicin se considera 0. Pred. TDa'Pred(VIERNES) indica el anterior valor a VIERNES que toma el tipo TDa, si no existe, se eleva la excepcin Constraint_Error. Rounding. Se usa con la forma X'Rounding(Y), siendo X cualquier tipo flotante e Y una variable de ese tipo. Devuelve el valor de Y redondeado al entero ms cercano. Si Y est exactamente entre dos valores enteros, toma el valor del mayor entero (p.e, Float'rounding(1.5)=2.0). Size . Indica el mnimo espacio en bits en que se pueden almacenar objetos de este tipo. Tcnicamente se define como lo que ocupara un componente de un registro de este tipo cuando el registro est empaquetado (pragma Pack ). Succ. TColor'Succ(ROJO) indica el siguiente valor a ROJO que toma el tipo TColor, si no existe, se eleva la excepcin Constraint_Error. Truncation. Se usa con la forma X'Truncation(Y), siendo X cualquier tipo flotante e Y una variable de ese tipo. Devuelve el valor truncado de Y a un valor entero. Val. Indica el valor que ocupa una determinada posicin en un tipo enumeracin. Por ejemplo: COLOR'Val(1).

Atributos aplicables a objetos


Por ejemplo estos son algunos atributos aplicables a objetos: Size : tamao en bits de un objeto. Valid: si tiene una representacin vlida para su tipo. til cuando se obtienen valores desde el mundo exterior mediante Unchecked_Conversion u otro mecanismo. First, Last: aplicados a arrays dan el primer y el ltimo ndices del array. Range : Vector'Range indica el rango que ocupa la variable Vector, es decir, equivale a Vector'First..Vector'Last. En el caso de ms de una dimensin, el valor Matriz'Range(1) indica el rango de la primera dimensin.

Ejemplos
t y p eT i p o _ e n u m e r a d oi s( E n u m 1 ,E n u m 2 ,E n u m 3 ) ; f o rT i p o _ e n u m e r a d o ' S i z eu s e2 ;-P a r ar e p r e s e n t a r3u n i d a d e sn e c e s i t a m o s2b i t s t y p eT i p o _ e n t e r o i sr a n g e1. .5 ; . . . p r a g m aA s s e r t( T i p o _ e n u m e r a d o ' L a s t=E n u m 3 ) ; -C o r r e c t o p r a g m aA s s e r t( T i p o _ e n t e r o ' F i r s t =1 ) ; -C o r r e c t o
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 45/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

p r a g m aA s s e r t( T i p o _ e n t e r o ' L a s t =4 ) ;

- I n c o r r e c t o ! ! -C o r r e c t o -C o r r e c t o -C o r r e c t o

p r a g m aA s s e r t( T i p o _ e n u m e r a d o ' P r e d (E n u m 2)=E n u m 1 ) ; p r a g m aA s s e r t( T i p o _ e n u m e r a d o ' S u c c (E n u m 2)=E n u m 3 ) ; p r a g m aA s s e r t( T i p o _ e n u m e r a d o ' I m a g e (E n u m 1)=" E n u m 1 " ) ;

t y p eT i p o _ f l o t a n t ei sd i g i t s1 0r a n g e0 . 0 . . 1 0 0 . 0 ;-1 0c i f r a sd e c i m a l e se nl am a n t i s a

V a r _ F l o t a n t e :F l o a t: =1 . 5 ; V a r _ F l o t a n t e 2:F l o a t: =1 . 9 ; V a r _ F l o t a n t e 3:F l o a t: =1 . 0 ; V a r _ F l o t a n t e 4:F l o a t: =1 . 8 ; V a r _ F l o t a n t e 5:F l o a t: =1 . 1 ; . . . p r a g m aA s s e r t( F l o a t ' C e i l i n g ( v a r _ F l o t a n t e ) =2 . 0 ) ; p r a g m aA s s e r t( F l o a t ' C e i l i n g ( v a r _ F l o t a n t e 2 )=2 . 0 ) ; p r a g m aA s s e r t( F l o a t ' C e i l i n g ( v a r _ F l o t a n t e 3 )=1 . 0 ) ; p r a g m aA s s e r t( F l o a t ' C e i l i n g ( v a r _ F l o t a n t e 3 )=2 . 0 ) ;

-C o r r e c t o -C o r r e c t o -C o r r e c t o - I n c o r r e c t o ! !

p r a g m aA s s e r t( F l o a t ' T r u n c a t i o n ( v a r _ F l o t a n t e )=1 . 0 ) ; -C o r r e c t o p r a g m aA s s e r t( F l o a t ' T r u n c a t i o n ( v a r _ F l o t a n t e 2 )=1 . 0 ) ; -C o r r e c t o p r a g m aA s s e r t( F l o a t ' T r u n c a t i o n ( v a r _ F l o t a n t e 3 )=1 . 0 ) ; -C o r r e c t o p r a g m aA s s e r t( F l o a t ' T r u n c a t i o n ( v a r _ F l o t a n t e 4 )=1 . 0 ) ; -C o r r e c t o p r a g m aA s s e r t( F l o a t ' R o u n d i n g ( v a r _ F l o t a n t e 5 ) =1 . 0 ) ; -C o r r e c t o p r a g m aA s s e r t( F l o a t ' R o u n d i n g ( v a r _ F l o t a n t e ) =2 . 0 ) ; -C o r r e c t o

A:C h a r a c t e r: =C h a r a c t e r ' V a l( 3 2 )-At o m ae lv a l o rd ee s p a c i o( v a l o r3 2e nl at a b l aA S C I I ) B:C h a r a c t e r: ='' ; -Bt a m b i nt o m ae lv a l o rd ee s p a c i o

R e s u l t a d o:N a t u r a l ; . . . i fn o tR e s u l t a d o ' V a l i dt h e n -' R e s u l t a d o 'e s t f u e r ad e lr a n g o ,c o nv a l o rn e g a t i v o R e s u l t: =N a t u r a l ' F i r s t ; e n di f

Manual de referencia de Ada


4.1.4 Attributes (http://www.adaic.com/standards/95lrm/html/RM-4-1-4.html) Annex K: Language-Defined Attributes (http://www.adaic.com/standards/95lrm/html/RM-K.html)

Expresiones
Una expresin es una parte de un programa que calcula u obtiene un valor. Toda expresin tiene un tipo asociado que es el del valor calculado/obtenido. Una expresin est formada por una combinacin de valores, objetos, operadores, atributos y funciones.

Notacin
Una expresin en Ada se puede construir de la siguiente manera simplificada:
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 46/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

e x p r e s i n: : =r e l a c i no p e r a d o rr e l a c i n r e l a c i n: : =e x p r e s i n _ s i m p l e[o p e r a d o r _ r e l a c i o n a le x p r e s i n _ s i m p l e] |e x p r e s i n _ s i m p l e[n o t]i nr a n g o e x p r e s i n _ s i m p l e: : =[o p e r a d o r _ u n a r i o]t r m i n o {o p e r a d o r _ b i n a r i ot r m i n o}

Manual de referencia de Ada


4.4 Expressions (http://www.adaic.org/standards/95lrm/html/RM-4-4.html)

Operadores
Clasificacin
sta es la lista de operadores de Ada de menor a mayor precedencia. Clasificacin de operadores Clase Lgicos Nombre Conjuncin Disyuncin inclusiva Disyuncin exclusiva Relacionales Igualdad Desigualdad Menor que Menor o igual que Mayor que Mayor o igual que Aditivo unario Identidad Negacin Aditivo binario Suma Resta Concatenacin Multiplicativo Concatenacin Multiplicacin Divisin Mdulo Resto
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

Frmula

Sintxis Ada
a n d o r x o r = / = < < = > > = + + & * / m o d r e m
47/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

De mxima precedencia Exponenciacin Negacin Valor absoluto

* * n o t a b s

Propiedades
En todos los casos, excepto para la exponenciacin, los dos operandos deben ser del mismo tipo. Los operadores se pueden sobrecargar.

Comprobacin de pertenencia (in, not in)


Adems existe la comprobacin de pertenencia ( ,i n ; ,n o ti n ) que tcnicamente no es un operador y no se puede sobrecargar. Su precedencia es la misma que la de los operadores relacionales. Se puede utilizar con rangos o con subtipos.
-S u p o n g a m o sq u eXe sd et i p oI n t e g e r i fXi nP o s i t i v et h e n-P o s i t i v ee su ns u b t i p od eI n t e g e r . . . i fXn o ti n4. .6t h e n . . . e n di f ; e n di f ;

d e c l a r e t y p eD i a _ S e m a n ai s ( L u n e s ,M a r t e s ,M i e r c o l e s ,J u e v e s ,V i e r n e s ,S a b a d o ,D o m i n g o ) ; s u b t y p eD i a _ L a b o r a b l ei sD i a _ S e m a n ar a n g eL u n e s. .V i e r n e s ; H o y:D i a _ S e m a n a: =O b t e n e r _ D i a ; b e g i n i fH o yi nD i a _ L a b o r a b l et h e n-D i a _ L a b o r a b l ee su ns u b t i p od eD i a _ S e m a n a I r _ A l _ T r a b a j o ; i fH o yn o ti nL u n e s. .M i e r c o l e st h e n P e n s a r _ E n _ E l _ F i n _ D e _ S e m a n a ; e n di f ; e n di f ; e n d ;

Operadores lgicos de corto-circuito


Para los operadores lgicos existen versiones para minimizar las evaluaciones (short-circuit evaluation). Es decir, se evala primero el operando de la izquierda y despus, slo si es necesario para determinar el resultado, el de la derecha: Conjuncin a n dt h e n : no se evala la segunda expresin si la primera es falsa porque ya sabemos que el resultado ser falso. Disyuncin inclusiva o re l s e : no se evala la segunda expresin si la primera es verdadera porque ya sabemos que el resultado ser verdadero.
-B/A>3n os ee j e c u t a r s iAe s0l oq u en o ss e r t i lp a r ae v i t a r
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 48/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

-u nC o n s t r a i n t _ E r r o r i fA/ =0a n dt h e n B/A>3t h e n P u t _ L i n e( " B/Ae sm a y o rq u e3 " ) ; e n di f ;

Manual de referencia de Ada


4.5 Operators and Expression Evaluation (http://www.adaic.com/standards/95lrm/html/RM-4-5.html)

Sentencias y estructuras de control


Clasificacin de sentencias
Simple: Secuencial: Nula (n u l l ). Asignacin (X : =Y ; ) Llamada a procedimiento. Cdigo. Llamada a punto de entrada (e n t r y ). En procesamiento paralelo. Espera (d e l a y ). Terminacin abrupta (a b o r t ). En procesamiento paralelo. Control: Terminacin de bucle (e x i t ). Salto a etiquetas (g o t o ). No recomendable. Elevacin de excepcin (r a i s e ). Retorno de subprograma (r e t u r n ). Compuesta: Secuencial: Bloque. Sentencia if. Sentencia case. Bucle (l o o p ). Paralela: Sentencia a c c e p t . Sentencia s e l e c t .

Bloques
Ada distingue entre declaraciones, que introducen identificadores nuevos, y sentencias, que no lo hacen. El fragmento de texto ms simple que incluye declaraciones y sentencias es un bloque.

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

49/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Definicin
b l o q u e: : = [i d e n t i f i c a d o r:] [d e c l a r e p a r t e _ d e c l a r a t i v a] b e g i n s e n t e n c i a s [e x c e p t i o n m a n e j a d o r _ d e _ e x c e p c i n {m a n e j a d o r _ d e _ e x c e p c i n}] e n d[i d e n t i f i c a d o r];

Ejemplo
-S u p u e s t a sXeYd e c l a r a d a sc o na n t e r i o r i d a dd et i p oF l o a t : d e c l a r e T e m p :F l o a t ; -E s t av a r i a b l es l oe sv i s i b l ed e n t r od e lb l o q u e . b e g i n -S ei n t e r c a m b i a n2v a r i a b l e s . T e m p: =X ; X: =Y ; Y: =T e m p ; e n d ;

Destacar que un bloque es una sentencia y cuando se ejecuta se elaboran las declaraciones contenidas en su parte declarativa (entre declare y begin) y despus se ejecutan las sentencias del cuerpo (entre begin y end). El mbito de las variables declaradas en un bloque finaliza cuando termina dicho bloque.

Sentencia de seleccin (if)


Definicin
s e n t e n c i a _ s e l e c c i n: : = i fc o n d i c i nt h e ns e c u e n c i a _ d e _ s e n t e n c i a s [{e l s i fc o n d i c i nt h e ns e c u e n c i a _ d e _ s e n t e n c i a s}] [e l s es e c u e n c i a _ d e _ s e n t e n c i a s] e n di f;

w i t hA d a . T e x t _ I o , A d a . I n t e g e r _ T e x t _ I o ; u s eA d a . T e x t _ I o , A d a . I n t e g e r _ T e x t _ I o ; p r o c e d u r ec o m p t a r _ L Ai s c p , c :c h a r a c t e r ; n :i n t e g e r ; d e c l a r a m o sl a sv a r i a b l e s b e g i n P u t ( " E s c r i b eu n af r a s e " ) ; p e d i m o syr e c o j e m o st e x t o P u t ( c ) ; n: =0 ; i n i c i a l i z a m o snac e r o c p: ='' ; g e t ( c ) ;s ic pe se s p a c i os e g u i rl e y e n d o

Flujo de control if-then-else

w h i l ec/ =' . 'l o o p m i e n t r a scs e ad i f e r e n t ed e lP U N T Oe n t r a re nb u c l e i fc p=' L 'a n dc=' A 't h e n n: =n + 1 ; e n di f ;-s ic pe sLyce sAi n c r e m e n t a rnyf i n a l i z a re li f c p: =c ;
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 50/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

G e t ( c ) ;i g u a l a m o sc pacp a r ap r o c e d e rycs i g u ea lp r o x i m ac a r a c t e r e n dl o o p ;F I N A L I Z A M O SB U C L E P u t ( " E ln u m e r od ep a l a b r a sd el af r a s ee s " ) ;e n s e a m o se np a n t a l l av a r i a b l en P u t ( n ) ; e n dc o m p t a r _ L A ;

Ejemplo
i fH o y=D O Mt h e n -S ih o ye sd o m i n g o . M a a n a: =L U N ; e l s i fH o y/ =S A Bt h e n -S in oe sd o m i n g on is b a d o . L a b o r a b l e: =T r u e ; e l s e -C u a l q u i e ro t r oc a s o . M a a n a: =T D a ' S u c c ( H o y ) ; e n di f ;

Sentencia de seleccin por casos (case)


Definicin
s e n t e n c i a _ s e l e c c i n _ p o r _ c a s o s: : = c a s ee x p r e s i ni s a l t e r n a t i v a _ c a s o{a l t e r n a t i v a _ c a s o} e n dc a s e; a l t e r n a t i v a _ c a s o: : = w h e ne l e c c i n{|e l e c c i n}= >s e c u e n c i a _ d e _ s e n t e n c i a s e l e c c i n: : =e x p r e s i n _ s i m p l e|r a n g o _ d i s c r e t o|o t h e r s

Ejemplo

Flujo de control de la estructura case

c a s eH o yi s w h e nM I E . . V I E= >E n t r e n a r _ d u r o ; -R a n g o . w h e nM A R|S A B= >E n t r e n a r _ p o c o ; -V a r i a se l e c c i o n e s . w h e nD O M= >C o m p e t i r ; -U n ae l e c c i n . w h e no t h e r s= >D e s c a n s a r ; -D e b es e r n i c ayl a l t i m aa l t e r n a t i v a . e n dc a s e ;

Bucles
Sentencia de bucle simple (loop)
Definicin
s e n t e n c i a _ b u c l e _ s i m p l e: : = [i d e n t i f i c a d o r _ b u c l e:]l o o p s e c u e n c i a _ d e _ s e n t e n c i a s e n dl o o p[i d e n t i f i c a d o r _ b u c l e];

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

51/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Ejemplo
V i d a :l o o p -E lb u c l ed u r ai n d e f i n i d a m e n t e . T r a b a j a r ; C o m e r ; D o r m i r ; e n dl o o pV i d a ;

Este bucle slo se puede abandonar si alguno de los procedimientos levanta una excepcin. El bucle simple a menudo se acompaa de una sentencia exit para abandonar el bucle cuando se cumple una condicin.
l o o p A l i m e n t a r _ C a l d e r a ; M o n i t o r i z a r _ S e n s o r ; e x i tw h e nT e m p e r a t u r a _ I d e a l ; e n dl o o p ;

Sentencia de bucle iterativo (for)


Definicin
s e n t e n c i a _ b u c l e _ i t e r a t i v o: : = [i d e n t i f i c a d o r _ b u c l e:]f o rp a r m e t r o s _ f o rl o o p s e c u e n c i a _ d e _ s e n t e n c i a s e n dl o o p[i d e n t i f i c a d o r _ b u c l e]; p a r m e t r o s _ f o r: : =i d e n t i f i c a d o ri n[r e v e r s e]r a n g o _ d i s c r e t o

Ejemplo
f o rIi n1 . . Nl o o p -Is ei t e r ad e s d e1h a s t aN . V ( I ): =0 ; e n dl o o p ;

Sentencia de bucle condicional (while)


Definicin
s e n t e n c i a _ b u c l e _ i t e r a t i v o: : = [i d e n t i f i c a d o r _ b u c l e:]w h i l ec o n d i c i nl o o p s e c u e n c i a _ d e _ s e n t e n c i a s e n dl o o p[i d e n t i f i c a d o r _ b u c l e];

Ejemplo
I: =1 ; w h i l eI>Nl o o p -S eh a c ee lb u c l em i e n t r a ss ec u m p l al ac o n d i c i n . V ( I ): =0 ;
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 52/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

I: =I+1 ; e n dl o o p ;

Otras sentencias de control (goto, exit, return, abort)


Sentencia goto
Antes de nada, decir que la utilizacin de sentencias goto se desaconseja totalmente. Ada posee estructuras de control adecuadas para evitar su uso. Si se soporta su utilizacin es por si se quiere traducir de otro lenguaje a Ada automticamente. Se especifica una etiqueta entre los smbolos < <y > > , por ejemplo, < < S a l t o > > . Se realiza el salto a dicha etiqueta con la sentencia g o t oS a l t o ;que transferira el control a la siguiente sentencia despus de la etiqueta. No puede usarse para transferir control fuera de un subprograma.

Sentencia exit
Termina el bucle nombrado en la sentencia o, si no aparece, el bucle ms prximo que la contiene. Su notacin sintctica es:
s e n t e n c i a _ e x i t: : =e x i t[n o m b r e _ b u c l e][w h e nc o n d i c i n];

Sentencia return
Termina la ejecucin del subprograma ms prximo que la contiene, tanto en procedimientos como en funciones donde, adems, se utiliza para devolver el resultado de dicha funcin. Su notacin sintctica es:
s e n t e n c i a _ r e t u r n: : =r e t u r n[e x p r e s i n];

Sentencia abort
Se utiliza slo para tareas. Implica la terminacin incondicional de las tareas que se especifiquen. Su notacin sintctica es:
s e n t e n c i a _ a b o r t: : =a b o r tn o m b r e _ t a r e a{,n o m b r e _ t a r e a};

Manual de referencia de Ada


Section 5: Statements (http://www.adaic.com/standards/95lrm/html/RM-5.html)

Subprogramas
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 53/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

En Ada, los subprogramas se dividen en dos categoras: procedimientos y funciones. Los procedimientos son llamados como sentencias y no devuelven resultado, mientras que las funciones son llamadas como componentes de expresiones y devuelven un resultado.

Procedimientos
La llamada a un procedimiento en Ada constituye por s misma una sentencia. Su especificacin se puede describir de la siguiente manera:
e s p e c i f i c a c i n _ p r o c e d i m i e n t o: : = p r o c e d u r ei d e n t i f i c a d o r [(e s p e c i f i c a c i n _ p a r m e t r o{;e s p e c i f i c a c i n _ p a r m e t r o})] e s p e c i f i c a c i n _ p a r m e t r o: : =i d e n t i f i c a d o r{,i d e n t i f i c a d o r}:[m o d o]t i p o [: =e x p r e s i n] m o d o: : =i n|o u t|i no u t

El cuerpo del procedimiento sera:


c u e r p o _ p r o c e d i m i e n t o: : = e s p e c i f i c a c i n _ p r o c e d i m i e n t oi s [p a r t e _ d e c l a r a t i v a] b e g i n s e c u e n c i a _ d e _ s e n t e n c i a s [e x c e p t i o n m a n e j a d o r _ d e _ e x c e p c i n{m a n e j a d o r _ d e _ e x c e p c i n}] e n d[i d e n t i f i c a d o r];

Los parmetros que se le pueden pasar a un procedimiento pueden ser de tres modos diferentes:
i n : el parmetro

formal es una constante y permite slo la lectura del valor del parmetro real asociado. formal es una variable y permite la lectura y modificacin del valor del parmetro

i no u t : el parmetro

real asociado.
o u t : el parmetro

formal es una variable y permite nicamente la modificacin del valor del parmetro

real asociado. Ninguno de estos modos implica el uso de un paso de parmetro por valor o por referencia. El compilador es libre de elegir el paso ms adecuado de acuerdo al tamao del parmetro y otras consideraciones. Como excepcin, los tipos etiquetados se pasan siempre por referencia. Por ejemplo:
p r o c e d u r eU n a _ P r u e b a( A ,B :i nI n t e g e r ;C :o u tI n t e g e r )i s b e g i n C : =A+B ; e n dU n a _ P r u e b a ;

Cuando se llame al procedimiento con la sentencia Una_Prueba (5 + P, 48, Q); se evalan las expresiones 5 + P y 48 (slo se permiten expresiones en el modo in), despus se asignan a los parmetros formales A y B, que se comportan como constantes. A continuacin, se asigna el valor A + B a la variable formal C. Obsrvese que
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 54/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

especificando el modo out no se puede conocer el valor del parmetro real (Q). En este caso, el parmetro formal C es una nueva variable cuyo valor se asignar al parmetro real (Q) cuando finalice el procedimiento. Si se hubiera querido obtener el valor de Q, adems de poder modificarlo, se debera haber empleado C :i n o u tI n t e g e r . Indicar tambin que dentro de un procedimiento, se puede hacer uso de la sentencia return sin argumentos que finalizara la ejecucin del procedimiento y pasara el control a la sentencia desde la que se llam a dicho procedimiento. Por ejemplo, para resolver una ecuacin del tipo :
w i t hA d a . N u m e r i c s . E l e m e n t a r y _ F u n c t i o n s ;u s eA d a . N u m e r i c s . E l e m e n t a r y _ F u n c t i o n s ; p r o c e d u r eE c u a c i n _ C u a d r t i c a ( A ,B ,C:F l o a t ; -P o rd e f e c t oe si n . R 1 ,R 2 :o u t F l o a t ; V l i d a :o u tB o o l e a n )i s Z :F l o a t ; b e g i n Z: =B*B-4 . 0*A*C ; i fZ>0 . 0o rA=0 . 0t h e n V l i d a: =F a l s e ; -A ls e rd es a l i d a ,s et i e n e nq u em o d i f i c a ra lm e n o su n av e z . R 1: =0 . 0 ; R 2: =0 . 0 ; e l s e V l i d a: =T r u e ; R 1: =( B+S Q R T( Z ) )/( 2 . 0 * A ) ; R 2: =( B-S Q R T( Z ) )/( 2 . 0 * A ) ; e n di f ; e n dE c u a c i n _ C u a d r t i c a ;

Siendo SQRT la funcin de Ada.Numerics.Elementary_Functions que calcula la raz cuadrada del parmetro pasado. Si las races son reales, se devuelven en R1 y R2, pero si son complejas o la ecuacin degenera (A = 0), finaliza la ejecucin del procedimiento despus de asignar a la variable Vlida el valor False, para que se controle despus de la llamada al procedimiento. Ntese que los parmetros out tienen que modificarse, al menos, una vez y que si no se especifica un modo, se sobreentiende que es in.

Funciones
Una funcin es una forma de subprograma a la que se puede invocar como parte de una expresin. Su especificacin se puede describir de la siguiente manera:
e s p e c i f i c a c i n _ f u n c i n: : = f u n c t i o n(i d e n t i f i c a d o r|s m b o l o _ o p e r a d o r) [(e s p e c i f i c a c i n _ p a r m e t r o{;e s p e c i f i c a c i np a r m e t r o})] r e t u r nt i p o e s p e c i f i c a c i n _ p a r m e t r o: : =i d e n t i f i c a d o r{,i d e n t i f i c a d o r}:[i n]t i p o [: =e x p r e s i n]

Ntese que, al contrario que los procedimientos, no se pueden pasar parmetros a la funcin de otro modo que no sea de entrada (in) ya que no se puede especificar otro modo (el de entrada es por defecto y obligatorio). En este sentido las funciones de Ada se parecen ms a las funciones matemticas que las funciones de otros lenguajes. La especificacin de la funcin es necesaria para mostrar al exterior toda la informacin necesaria para poder invocarla.
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 55/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

El cuerpo de la funcin sera:


c u e r p o _ f u n c i n: : = e s p e c i f i c a c i n _ f u n c i ni s [p a r t e _ d e c l a r a t i v a] b e g i n s e c u e n c i a _ d e _ s e n t e n c i a s [e x c e p t i o n m a n e j a d o r _ d e _ e x c e p c i n{m a n e j a d o r _ d e _ e x c e p c i n}] e n d[i d e n t i f i c a d o r|s m b o l o _ o p e r a d o r];

Un ejemplo de cuerpo de funcin puede ser:


f u n c t i o nM n i m o( A ,B :I n t e g e r )r e t u r nI n t e g e ri s b e g i n i fA>Bt h e nr e t u r nB ; e l s er e t u r nA ; e n di f ; e n dM n i m o ;

Los parmetros formales de una funcin se comportan como constantes locales cuyos valores son proporcionados por los parmetros reales correspondientes. La sentencia return se utiliza para indicar el valor devuelto por la llamada a la funcin y para devolver el control a la expresin que llam a la funcin. La expresin de la sentencia return es de complejidad arbitraria y debe ser del mismo tipo que se declara en la especificacin de la funcin. Si se utiliza un tipo incompatible, el compilador da error. Si no se cumplen las restriccines de un subtipo, como un rango, se eleva la excepcin Constraint_Error. El cuerpo de la funcin puede contener varias sentencias return y la ejecucin de cualquiera de ellas terminar la funcin devolviendo el control a la sentencia que la haba invocado. Si el flujo del programa sigue varios caminos dentro de la funcin hay que asegurarse de que se termine siempre con una sentencia return en cada uno de ellos. Si en tiempo de ejecucin se llega al final de una funcin sin haber salido por un return, se levanta la excepcin Program_Error. As pues, el cuerpo de una funcin deber tener al menos una sentencia return obligatoriamente. Toda llamada a una funcin produce una nueva copia de cualquier objeto declarado dentro de ella, incluyendo los parmetros. Cuando la funcin finaliza, desaparecen sus objetos. Por tanto, es posible utilizar llamadas recursivas a una misma funcin, como ejemplo, se muestra una posible implementacin de la funcin factorial:
f u n c t i o nF a c t o r i a l( N :P o s i t i v e )r e t u r nP o s i t i v ei s b e g i n i fN=1t h e n r e t u r n1 ; e l s e r e t u r n( N*F a c t o r i a l( N-1 ) ) ; e n di f ; e n dF a c t o r i a l ;

Si se intenta evaluar la expresin Factorial (4); se llamar a la funcin con el parmetro 4 y dentro de la funcin se intentar evaluar la expresin N * Factorial (3) con lo que se volvera a llamar a la funcin, pero en este caso el parmetro N sera 3 (por cada llamada se realiza una copia de los parmetros) y as sucesivamente hasta que se evale N con valor 1 que finalizar la funcin y se empezarn a completarse las expresiones en sentido inverso.
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 56/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Un parmetro formal de una funcin puede ser de cualquier tipo, incluyendo vectores o registros. Sin embargo, no puede ser un tipo annimo, es decir, debe declararse antes, por ejemplo:
t y p eT V e c t o ri sa r r a y( P o s i t i v er a n g e< > )o fF l o a t ; f u n c t i o nS u m a _ C o m p o n e n t e s( V :T V e c t o r )r e t u r nF l o a ti s R e s u l t a d o :F l o a t: =0 . 0 ; b e g i n f o rIi nV ' R a n g el o o p R e s u l t a d o: =R e s u l t a d o+V ( I ) ; e n dl o o p ; r e t u r nR e s u l t a d o ; e n dS u m a _ C o m p o n e n t e s ;

En este ejemplo, se puede utilizar la misma funcin para cualquier vector de una dimensin, no importa el nmero de componentes del vector. As pues, no hay lmites estticos en los parmetros pasados a las funciones. Por ejemplo, se puede utilizar de la siguiente forma:
V 4 :T V e c t o r ( 1 . . 4 ): =( 1 . 2 ,3 . 4 ,5 . 6 ,7 . 8 ) ; S u m a :F l o a t ; S u m a: =S u m a _ C o m p o n e n t e s( V 4 ) ;

De igual manera, una funcin tambin puede devolver un tipo del que no se conocen a priori sus lmites. Por ejemplo:
f u n c t i o nI n v i e r t e _ C o m p o n e n t e s( V :T V e c t o r )r e t u r nT V e c t o ri s R e s u l t a d o :T V e c t o r ( V ' R a n g e ) ; -F i j ae ll m i t ed e lv e c t o rad e v o l v e r . b e g i n f o rIi nV ' R a n g el o o p R e s u l t a d o ( I ): =V ( V ' F i r s t+V ' L a s t-I ) ; e n dl o o p ; r e t u r nR e s u l t a d o ; e n dI n v i e r t e _ C o m p o n e n t e s ;

La variable Resultado tiene los mismo lmites que V, con lo que siempre se devuelve un vector de la misma dimensin que el pasado como parmetro. Indicar tambin que una funcin devuelve un valor que puede utilizarse sin necesidad de realizar una asignacin a una variable, con lo que se puede hacer referencia directamente, por ejemplo, a Invierte_Componentes(V4) (1), con lo que se obtendra el primer componente del vector devuelto por la funcin (en este caso 7.8).

Parmetros nombrados
Destacar, que tanto en procedimientos como en funciones, se puede alterar el orden de los parmetros en la llamada utilizando la notacin nombrada, es decir, se especifica en la llamada el nombre del parmetro real seguido del smbolo => y despus el parmetro formal. Por ejemplo:
E c u a c i n _ C u a d r t i c a( V l i d a= >O K ,A= >1 . 0 ,B= >2 . 0 ,C= >3 . 0 , R 1= >P ,R 2= >Q ) ; F: =F a c t o r i a l( N= >( 3+I ) ) ;

Esto implica conocer el nombre de los parmetros formales que, en principio, bastara con mirar la especificacin del paquete. Como se asigna uno a uno el parmetro formal al real, no hay ningn problema de ambigedad. Conviene recordar que el parmetro formal va a la izquierda del smbolo =>, por si se da la
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 57/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

situacin de que la variable utilizada como parmetro real se llame de igual manera que el formal (no habra ambigedad ya que estn en distinto mbito).

Parmetros por defecto


Por otra parte, se pueden establecer parmetros formales, tanto en procedimientos como en funciones, que tengan valores por defecto y, por tanto, se pueden obviar en la llamada al subprograma. Por ejemplo:
p r o c e d u r eP r u e b a _ P o r _ D e f e c t o( A:i nI n t e g e r: =0 ;B :i nI n t e g e r: =0 ) ;

Se puede llamar de estas formas:


P r u e b a _ P o r _ D e f e c t o( 5 ,7 ) ; -A=5 ,B=7 P r u e b a _ P o r _ D e f e c t o( 5 ) ; -A=5 ,B=0 P r u e b a _ P o r _ D e f e c t o ; -A=0 ,B=0 P r u e b a _ P o r _ D e f e c t o( B= >3 ) ; -A=0 ,B=3 P r u e b a _ P o r _ D e f e c t o( 1 ,B= >2 ) ; -A=1 ,B=2

En la primera sentencia, se utiliza una llamada "normal" (con notacin posicional), en la segunda, se utiliza posicional y por defecto, la tercera utiliza todos los parmetros por defecto, en la cuarta nombrada y por defecto, y, por ltimo, la quinta utiliza notacin posicional y nombrada.

Manual de referencia de Ada


Section 6: Subprograms (http://www.adaic.com/standards/95lrm/html/RM-6.html)

Sobrecarga
En Ada se puede utilizar un identificador con ms de un significado. Esto es lo que se conoce como sobrecarga. Los identificadores que se pueden sobrecargar son: Literales enumeracin. Operadores. Subprogramas.

Sobrecarga de literales de enumeracin


Se pueden emplear identificadores iguales en distintos tipos enumeracin, por ejemplo:
d e c l a r e t y p eT C o l o ri s( R O J O ,V E R D E ,A Z U L ) ; t y p eT L u zi s( R O J O ,A M A R I L L O ,V E R D E ) ; P i x e l :T C o l o r ; I n d i c a d o r :T L u z: =V E R D E ; b e g i n -S ee m p l e ac a l i f i c a d o rp a r ad i s t i n g u i r . P i x e l: =T C o l o r ' ( V E R D E ) ; e n d ;
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 58/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Sobrecarga de operadores
Tambin se puede utilizar una funcin para definir una operacin y sobrecargar cualquiera de los operadores ya establecidos excepto /= (que toma su valor a partir del operador =, pero que puede redefinirse si el valor de retorno no es de tipo Boolean). Por ejemplo, se puede hacer una funcin "*" que multiplique escalarmente dos vectores:
f u n c t i o n" * "( A ,B :V e c t o r )r e t u r nF l o a ti s R e s u l t a d o :F l o a t: =0 . 0 ; b e g i n f o rIi nA ' r a n g el o o p R e s u l t a d o: =R e s u l t a d o+A ( I )*B ( I ) ; e n dl o o p ; r e t u r nR e s u l t a d o ; e n d" * " ;

Las reglas a cumplir a la hora de sobrecargar un operador son: No cambiar la sintaxis. No cambiar el nmero de parmetros de un operador (recurdese que + y - pueden ser unarios o binarios). La precedencia se mantiene. Por otro lado, una recomendacin muy importante es no definir un operador para un nuevo tipo dndole un significado distinto al del operador predefinido. Es decir, + siempre ha de representar conceptos relacionados con la adicin; *, multiplicacin; a n d , conjuncin, etc.

Sobrecarga de subprogramas
Un subprograma sobrecargar un significado ya existente siempre que su especificacin sea suficientemente diferente, es decir, pueden existir dos subprogramas con el mismo identificador siempre que se distingan por el nmero o tipo de sus parmetros. Por ejemplo:
d e c l a r e t y p eT A l i m e n t oi s( P A N ,L E C H E ,A C E I T E ) ; t y p eT P r o d u c t o _ A u t o m v i li s( A C E I T E ,B U J A ) ; p r o c e d u r eC o m p r a r( P r o d A l i m :T A l i m e n t o )i s -. . . p r o c e d u r eC o m p r a r( P r o d A u t o m :T P r o d u c t o _ A u t o m v i l )i s -. . . b e g i n C o m p r a r( A C E I T E ) ; -A m b i g e d a d . C o m p r a r( T A l i m e n t o ' ( A C E I T E ) ) ; -S es u p e r al aa m b i g e d a d . C o m p r a r( P r o d A l i m= >A C E I T E ) ; -T a m b i ns es u p e r al aa m b i g e d a d . e n d ;

Manual de referencia de Ada


6.6 Overloading of Operators (http://www.adaic.com/standards/95lrm/html/RM-6-6.html) 8.6 The Context of Overload Resolution (http://www.adaic.com/standards/95lrm/html/RM-8-6.html)

Entrada/salida
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 59/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Ada tiene cinco bibliotecas predefinidas independientes para operaciones de entrada/salida. Por tanto, la leccin ms importante a aprender es elegir la ms adecuada en cada caso.

Direct I/O
Direct I/O se usa para acceso directo a archivos que contienen nicamente elementos del mismo tipo. Con Direct_IO el cursor del archivo se puede situar en cualquier elemento de ese tipo (el concepto conocido en ingls como random access). El tipo de los elementos ha de ser un subtipo definitivo (definite subtype), es decir, un subtipo cuyos objetos tienen un tamao definido.

Sequential I/O
Sequential I/O se usa para el acceso secuencial a archivos que nicamente contienen elementos de un tipo especificado. Con Sequential I/O es posible elegir entre tipos definitivos y no definitivos, pero los elementos se han de leer uno tras otro.

Storage I/O
Storage I/O nos permite almacenar un nico elemento en un buffer de memoria. El elemento ha de ser de un subtipo definitivo. Storage I/O se usa en la programacin concurrente para trasladar elementos de una tarea a otra.

Stream I/O
Stream I/O es el paquete de entrada/salida ms potente de Ada. Stream I/O permite mezclar objetos de diferentes tipos en un archivo secuencial. Para leer/escribir de/en un stream (un flujo de datos) cada tipo provee un atributo 'Read y otro 'Write. Estos atributos estn definidos por el compilador para cada tipo que declaremos. Estos atributos tratan los elementos como datos sin interpretar. Son ideales tanto para entrada/salida de bajo nivel como para interoperar con otros lenguajes de programacin. Los atributos 'Input y 'Output aaden informacin de control adicional al archivo, tal como el atributo 'First y el 'Last de un array. En programacin orientada a objetos es posible usar los atributos 'Class'Input y 'Class'Output para almacenar y recuperar correctamente un tipo concreto de la misma clase. Stream I/O es tambin el paquete de entrada/salida ms flexible. Todos los atributos de E/S pueden sobrescribirse con subprogramas definidos por el usuario y es posible definir nuestros propios tipos de Stream I/O usando tcnicas avanzadas de orientacin a objetos.

Text I/O
Text I/O probablemente sea el tipo de entrada/salida ms usada. Todos los datos del archivo se representan en formato de texto legible. Text I/O provee la posibilidad de definir el layout de lneas y pginas, pero el estndar
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 60/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

es texto de forma libre.

Biblioteca predefinida
Existen varios paquetes predefinidos para la entrada/salida en Ada: Paquete Ada.Direct_IO Paquete Ada.Sequential_IO Paquete Ada.Storage_IO Paquete Ada.Streams Paquete Ada.Streams.Stream_IO Paquete Ada.Text_IO, con sus paquetes genricos anidados: Complex_IO, Decimal_IO, Enumeration_IO, Fixed_IO, Float_IO, Integer_IO y Modular_IO. Paquete Ada.Text_IO.Editing Paquete Ada.Float_Text_IO Paquete Ada.Integer_Text_IO

Manual de referencia de Ada


13.13 Streams (http://www.adaic.org/standards/95lrm/html/RM-13-13.html) A.8.1 The Generic Package Sequential_IO (http://www.adaic.org/standards/95lrm/html/RM-A-8-1.html) A.8.4 The Generic Package Direct_IO (http://www.adaic.org/standards/95lrm/html/RM-A-8-4.html) A.10.1 The Package Text_IO (http://www.adaic.org/standards/95lrm/html/RM-A-10-1.html) A.12.1 The Package Streams.Stream_IO (http://www.adaic.org/standards/95lrm/html/RM-A-12-1.html)

Interfaz con otros lenguajes


En el mercado existen miles de bibliotecas de programacin escritas en C C++. Tambin es bastante comn tener que reutilizar una parte de nuestros programas escritos en otro lenguaje. Para este propsito existen en Ada los pragmas (directivas de compilacin) de interfaz con otros lenguajes, definidos en el Annex B: Interface to Other Languages (http://www.adaic.com/standards/95lrm/html/RM-B.html) . El estndar define interfaces con los lenguajes C, COBOL y Fortran, y tambin con ensamblador. Las implementaciones pueden definir interfaces con otros lenguajes siguiendo el mismo esquema. As, por ejemplo, GNAT proporciona interfaz con C++ (aunque el name mangling suele dificultar esta tarea). Para importar desde nuestro programa Ada una funcin definida en otro lenguaje se utiliza el pragma Import. sta es la base de los conocidos bindings que nos permiten utilizar una librera escrita en otro lenguaje desde Ada. Para hacer que un subprograma escrito en Ada pueda ser llamado desde otro lenguaje, se utiliza el pragma Export. Tambin se pueden importar y exportar variables o constantes. A la hora de enlazar (link ) el programa completo tenemos que especificar a nuestro compilador con qu bibliotecas externas ha de enlazar para encontrar los subprogramas u objetos importados. Para esto tambin puede ser de ayuda el pragma Linker_Options, con el cual se pueden especificar los argumentos para el linker. La biblioteca predefinida tiene varios paquetes, todos ellos hijos de Interfaces destinados a facilitar la interfaz con otros lenguajes, definiendo tipos y subprogramas para ello:
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 61/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Paquete Interfaces Paquete Interfaces.C Paquete Interfaces.Cobol Paquete Interfaces.Fortran

Ejemplo de importacin desde C


-E j e m p l op a r al i m p i a rl ap a n t a l l a w i t hI n t e r f a c e s . C ; p r o c e d u r eC l si s p a c k a g eCr e n a m e sI n t e r f a c e s . C ; f u n c t i o nS y s t e m( C o m m a n d:C . C h a r _ A r r a y )r e t u r nC . I n t ; p r a g m aI m p o r t ( C ,S y s t e m ," s y s t e m " ) ; R c:C . I n t ; b e g i n R c: =S y s t e m( C . T o _ C( " c l s " ) ) ;-C o m a n d os i n t a x i sM S D O S .E nU n i xs e r ac l e a r e n dC l s ;

Este ejemplo compilara perfectamente usando GNAT con:


g n a t m a k ec l s . a d b

Sin embargo si en vez de importar funciones de las libreras estndar de C tenemos que importar nuestras propias funciones, primero tendramos que definirlas en su correspondiente archivo .c, compilarlas y luego pasrselas al compilador de Ada. Por ejemplo si nuestras funciones estn definidas en el archivo mis_funciones.c y si usamos el compilador gcc:
g c ccm i s _ f u n c i o n e s . c

Con esto se obtiene un mis_funciones.o que se ha de pasar al gnatmake para que enlace con las funciones:
g n a t m a k ee j e m p l o . a d bl a r g sm i s _ f u n c i o n e s . o

Si no lo hacemos as fallar la fase de enlace del programa porque existen referencias a funciones externas no encontradas.

Manual de Referencia de Ada


Annex B: Interface to Other Languages (http://www.adaic.com/standards/95lrm/html/RM-B.html)

Clusulas de representacin
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 62/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Una de las caractersticas de Ada que facilitan la programacin de bajo nivel es la posibilidad de definir a nivel de bit la representacin de nuestros tipos. Es posible definir el tamao y los valores internos de los tipos enumerados, por ejemplo:

t y p eE s t a d o _ Ti s( D e s c o n e c t a d o ,C o n e c t a d o ,D e s c o n o c i d o ) ; -E s p e c i f i c a m o sq u ee lc o m p i l a d o rh ad eu s a rd o sb i t s f o rE s t a d o _ T ' S i z eu s e2 ; -E s p e c i f i c a m o sl o sv a l o r e sq u es eu s a r ne nm e m o r i ap a r ac a d av a l o r f o rE s t a d o _ Tu s e( D e s c o n e c t a d o= >0 ,C o n e c t a d o= >1 ,D e s c o n o c i d o= >3 ) ;

Tambin es posible definir la estructura en memoria de los registros:

t y p eE s t r u c t u r a _ E s t a d o _ Ti s r e c o r d E s t a d o :E s t a d o _ T ; N u m e r o _ R e i n t e n t o s:I n t e g e r ; e n dr e c o r d ; f o rE s t r u c t u r a _ E s t a d o _ Tu s e r e c o r d E s t a d o a t0r a n g e0. .2 ;-P r i m e ry2 b i td el a1 p a l a b r a N u m e r o _ R e i n t e n t o sa t1r a n g e0. .3 1 ;-3 2b i t se nl a2 p a l a b r a e n dr e c o r d ;

Otra manera de controlar la representacin es con el pragma Pack, que indica al compilador que use la mnima representacin para los componentes de un array o de un registro, sin dejar espacios vacos entre los elementos.

t y p eA r r a y _ B i t s _ Ti sa r r a y( P o s i t i v er a n g e< > )o fB o o l e a n ; -I n d i c a m o sq u es eu s eu n n i c ob i tp a r ae lt i p oB o o l e a n( d o sv a l o r e s ,u n -b i te ss u f i c i e n t e )yd ee s t em o d ot e n e m o su na r r a yd eb i t ss o b r ee l -q u ep o d e m o sa p l i c a ro p e r a d o r e sb o o l e a n o s : p r a g m aP a c k( A r r a y _ B i t s _ T ) ;

Manual de Referencia de Ada


Section 13: Representation Issues (http://www.adaic.com/standards/95lrm/html/RM-13.html)

Diseo y programacin de sistemas grandes


Los sistemas empotrados suelen ser grandes y complejos, formados por subsistemas relacionados, pero relativamente independientes. Algunos lenguajes ignoran el hecho de que los programas se construyen por partes, cada una de ellas compilada por separado y todas ellas enlazadas en una aplicacin final. El resultado se convierte en aplicaciones monolticas difciles de mantener. Otros lenguajes, en contraste, parten del concepto de mdulo y proporcionan mecanismos de encapsulamiento y abstraccin que ayudan a programar sistemas
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 63/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

grandes, ya que el trabajo del equipo de programacin y posterior mantenimiento del sistema se ve facilitado. Uno de estos lenguajes es Ada, que est fuertemente fundamentado en la disciplina de la ingeniera del software por lo que es el lenguaje ms apropiado en la programacin de sistemas empotrados industriales grandes. Ada asume la necesidad de la compilacin separada y proporciona dos mecanismos para realizarla, uno ascendente y otro descendente: El mecanismo descendente (descomposicin): consiste en dividir un sistema complejo en componentes ms sencillos. Es apropiado para el desarrollo de grandes programas coherentes que, son divididos en varias subunidades que pueden compilarse por separado. Las subunidades se compilan despus que la unidad de la que forman parte. El mecanismo ascendente (abstraccin): consiste en la especificacin de los aspectos esenciales de un componente, posponiendo su diseo detallado. Es apropiado para la creacin de bibliotecas de programa en las que las unidades se escriben para uso general y, consecuentemente, se escriben antes que los programas que las vayan a utilizar. El diseo de sistemas mediante mdulos permite encapsular partes del sistema mediante interfaces bien definidas y permiten utilizar tcnicas que facilitan el desarrollo de sistemas grandes como: Ocultacin de informacin. Tipos abstractos de datos. Compilacin separada. Las unidades de programa en Ada son las siguientes: Subprograma: que define los algoritmos ejecutables. Los procedimientos y las funciones son subprogramas. Paquete : define una coleccin de entidades. Los paquetes son el principal mecanismo de agrupacin de Ada. Tarea: define una computacin que puede llevarse a cabo en paralelo con otras computaciones. Unidades genricas : ayudan a realizar cdigo reutilizable. Pueden ser subprogramas o paquetes. Unidad protegida: puede coordinar el acceso a datos compartidos en el procesamiento paralelo. Aparece en el estndar Ada 95. En Ada, las unidades de compilacin pueden ser: Especificaciones de subprogramas Especificaciones de paquetes Cuerpos de subprogramas o paquetes Algunos compiladores pueden establecer ciertos requisitos para las unidades de compilacin. Por ejemplo, GNAT en su configuracin predefinida exige que cada unidad est definida en un fichero, con el nombre de la unidad y la extensin .ads para especificaciones y .adb para cuerpos. El guin "-" se ha de utilizar en sustitucin del punto "." para unidades hijas y subunidades.

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

64/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Paquetes
Los paquetes exportan mediante una interfaz bien definida tipos, objetos y operaciones y permiten ocultar su implementacin, lo que proporciona al programador tipos abstractos de datos y subprogramas de manera transparente. Los paquetes de Ada proporcionan: Abstraccin de datos. Encapsulamiento. Compilacin separada y dependiente.

Especificacin y cuerpo
El paquete consta de especificacin (parte visible) y cuerpo (implementacin que se oculta) y pueden compilarse por separado. La sintaxis de su especificacin es la siguiente:
e s p e c i f i c a c i n _ p a q u e t e: : = p a c k a g e[i d e n t i f i c a d o r _ u n i d a d _ p a d r e.]i d e n t i f i c a d o ri s {d e c l a r a c i n _ b s i c a} [p r i v a t e {d e c l a r a c i n _ b s i c a}] e n d[[i d e n t i f i c a d o r _ u n i d a d _ p a d r e.]i d e n t i f i c a d o r];

La sintaxis del cuerpo de un paquete es la siguiente:


c u e r p o _ p a q u e t e: : = p a c k a g eb o d y[i d e n t i f i c a d o r _ u n i d a d _ p a d r e.]i d e n t i f i c a d o ri s [p a r t e _ d e c l a r a t i v a] [b e g i n s e c u e n c i a _ d e _ s e n t e n c i a s [e x c e p t i o n m a n e j a d o r _ d e _ e x c e p c i n {m a n e j a d o r _ d e _ e x c e p c i n}]] e n d[[i d e n t i f i c a d o r _ u n i d a d _ p a d r e.]i d e n t i f i c a d o r];

Un paquete permite agrupar declaraciones y subprogramas relacionados.

Ejemplos
Por ejemplo, para implementar una pila de enteros:
p a c k a g eP i l a _ E n t e r o si s -E s p e c i f i c a c i n . p r o c e d u r eP o n e r( E l e m :I n t e g e r ) ; -I n t e r f a z . f u n c t i o nQ u i t a rr e t u r nI n t e g e r ; -I n t e r f a z . e n dP i l a _ E n t e r o s ;

p a c k a g eb o d yP i l a _ E n t e r o si s -C u e r p o . M a x:c o n s t a n t: =1 0 0 ; -S eo c u l t a nl a sv a r i a b l e sl o c a l e s . P i l a :a r r a y( 1 . . M a x )o fI n t e g e r ; -S eo c u l t a nl a sv a r i a b l e sl o c a l e s .
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 65/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

C i m a :I n t e g e rr a n g e0 . . M a x ;

-S eo c u l t a nl a sv a r i a b l e sl o c a l e s .

p r o c e d u r eP o n e r( E l e m :I n t e g e r )i s -I m p l e m e n t a c i n . b e g i n C i m a: =C i m a+1 ; P i l a( C i m a ): =E l e m ; e n dP o n e r ; f u n c t i o nQ u i t a rr e t u r nI n t e g e ri s -I m p l e m e n t a c i n . b e g i n C i m a: =C i m a-1 ; r e t u r nP i l a ( C i m a+1 ) ; e n dQ u i t a r ; b e g i n C i m a: =0 ; -I n i c i a l i z a c i n . e n dP i l a _ E n t e r o s ;

En este caso, se tiene una interfaz que proporciona acceso a dos subprogramas para manejar la pila, aunque tambin se podran haber exportado tanto tipos como objetos, constantes, tareas e incluso otros paquetes. Por ejemplo:
p a c k a g eS o b r e _ D i a si s t y p eT D i ai s( L U N ,M A R ,M I E ,J U E ,V I E ,S A B ,D O M ) ; s u b t y p eT D i a L a b o r a b l ei sT D i ar a n g eL U N . . V I E ; S i g u e n t e D i a :c o n s t a n ta r r a y( T D i a )o fT D i a: = ( M A R ,M I E ,J U E ,V I E ,S A B ,D O M ,L U N ) ; e n dS o b r e _ D a s ;

En este caso, el paquete no necesitara cuerpo. Todos los elementos definidos en el paquete son accesibles, por lo que podramos utilizar S o b r e _ D i a s . T D i a ,S o b r e _ D i a s . S A B ,S o b r e _ D i a s . J U Eo S o b r e _ D i a s . T D i a L a b o r a b l e .

Dependencia entre especificacin y cuerpo


La especificacin del paquete y el cuerpo pueden compilarse por separado. Mediante este encapsulamiento, ahora no es posible desde fuera modificar, por ejemplo, el valor de la cima de la pila, pues este objeto no es visible. As se evita un mal empleo de la pila por alguien que pueda no conocer su implementacin. Si la especificacin de un paquete contiene la especificacin de un subprograma, entonces, el cuerpo del paquete debe contener el correspondiente cuerpo del subprograma. Sin embargo, pueden existir subprogramas dentro del cuerpo del paquete que no se declaren en su especificacin, seran, por tanto, internos. Destacar que dentro del cuerpo del paquete se inicializa el valor de la cima de la pila (despus de begin). Esto sucede cuando se elabora el paquete. Si no necesita ninguna sentencia, se puede omitir el begin.

Declaracin y visibilidad
Los paquetes se pueden declarar en cualquier parte declarativa, es decir, en un bloque, subprograma o dentro de otro paquete. En el caso del ejemplo, para utilizar la pila de nmeros enteros, se podra hacer as:
d e c l a r e N :I n t e g e r ; p a c k a g eP i l a _ E n t e r o si s -. . . e n dP i l a _ E n t e r o s ;
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 66/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

b e g i n P i l a _ E n t e r o s . P o n e r( 1 5 ) ; N: =P i l a _ E n t e r o s . Q u i t a r ; e n d ;

Dentro del paquete se puede llamar a Poner o a Pila_Enteros.Poner, pero fuera del paquete nicamente se puede llamar a dicho procedimiento de la forma Pila_Enteros.Poner. Adems, las variables Max, Pila y Cima no son visibles.

Importacin de paquetes
Para la utilizacin de los paquetes desde otras unidades de compilacin, se definen estas dos clusulas: Clusula use Clusula with

Manual de referencia de Ada


Section 7: Packages (http://www.adaic.com/standards/95lrm/html/RM-7.html)

Clusula use
Definicin
Si no se desea tener que escribir siempre Pila_Enteros.Poner para llamar a dicho procedimiento desde fuera del paquete, se puede utilizar la clusula use, cuya sintaxis es la siguiente:
c l u s u l a _ u s e _ p a q u e t e: : =u s ei d e n t i f i c a d o r{,i d e n t i f i c a d o r};

As pues, siguiendo con el ejemplo de la seccin anterior, se podra escribir:


-. . . d e c l a r e u s eP i l a _ E n t e r o s ; N :I n t e g e r ; b e g i n P o n e r( 1 5 ) ; N: =Q u i t a r ; e n d ;

Dicha clusula use es semejante a una declaracin y su mbito llega al final del bloque. Incluso podra existir otra clusula use ms interna que se refiera al mismo paquete. En el caso de existir varios paquete anidados, se puede utilizar la notacin punto para distinguirlos, por ejemplo:
p a c k a g eP 1i s p a c k a g eP 2i s -. . .
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 67/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

e n dP 2 ; -. . . e n dP 2 ;

u s eP 1 ,P 1 . P 2 ; -I l e g a ls e r a" u s eP 2 ; "

Para utilizar el paquete Standard, que contiene todas las entidades predefinidas, no se necesita clusula use.

Desventajas
Muchos proyectos prohben el uso de esta clusula porque dificulta la comprensin del cdigo y la localizacin de los tipos o subprogramas importados. Si deseas usarla lo ms recomendable es usar un nico use por cada unidad y hacindolo slo de los paquetes ms conocidos o de los predefinidos.

Vase tambin
Clusula with

Clusula with
Si una unidad se compila aparte (mtodo usual si se va a utilizar en ms programas), se puede hacer referencia a dicha unidad (cuya especificacin y cuerpo pueden estar en ficheros distintos) mediante la clusula with, cuya sintaxis es la siguiente:
c l u s u l a _ w i t h: : =w i t hi d e n t i f i c a d o r{,i d e n t i f i c a d o r};

As, se podra utilizar el paquete Pila_Enteros del ejemplo anterior de esta manera:
w i t hP i l a _ E n t e r o s ; -S eh a c ev i s i b l ee lp a q u e t ep a r at o d oe lp r o g r a m a . p r o c e d u r eP r u e b a _ P i l a _ E n t e r o si s u s eP i l a _ E n t e r o s ; -P a r an ou s a rn o m b r ed e lp a q u e t ee nl a sl l a m a d a s . N :I n t e g e r ; b e g i n P o n e r( 1 5 ) ; N: =Q u i t a r ; e n dP r u e b a _ P i l a _ E n t e r o s ;

La clusula with tiene que ir antes de la unidad (no puede ir dentro de un mbito ms interno), de este modo, se ve claramente la dependencia entre las unidades. Si la clusula use se coloca inmediatamente despus de la clusula with correspondiente, se podr utilizar los nombres de las entidades de los paquetes sin hacer referencia cada vez al nombre del paquete, en toda la unidad. Si el paquete P usa los servicios del paquete Q y ste a su vez utiliza los servicios de R, a no ser que P utilice directamente los servicios de R, se debera utilizar nicamente la clusula w i t hQ ;dentro de P. El programador de Q no tiene porqu conocer el paquete R.
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 68/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Destacar que las especificaciones de unidades utilizadas con with deben compilarse antes que la unidad que contiene dichas clusulas with, aunque de esto se suelen encargar automticamente los compiladores. Tambin hay que tener en cuenta, que las dependencias que sean nicamente del cuerpo no deben darse en la especificacin a no ser que se exporte algo que necesite de dicho paquete. Hay un paquete que no es necesario que se mencione en la clusula with, el paquete Standard.

Manual de referencia de Ada


10.1.2 Context Clauses - With Clauses (http://www.adaic.com/standards/95lrm/html/RM-10-1-2.html)

Declaraciones
Una declaracin es una construccin del lenguaje que asocia un nombre con una entidad. Ada distingue cuidadosamente entre declaraciones (que introducen nuevos identificadores) y sentencias (que utilizan dichos identificadores). Hay dos clases de declaraciones: Implcitas : que ocurren como consecuencia de la semntica de otra construccin. Explcitas : aparecen en el texto del programa y pueden ser: Declaraciones de tipo, subtipos, variables y constantes (objetos), excepciones, especificaciones de subprogramas o paquetes, clusulas de representacin o clusulas use. Los cuerpos de los subprogramas, paquetes y tareas.

Declaraciones de subprogramas
En ocasiones es necesario utilizar declaraciones de subprogramas, por ejemplo, si se va a utilizar la recursividad entre dos procedimientos:
p r o c e d u r eP ; -D e c l a r a c i nd eP ,n e c e s a r i ap a r au t i l i z a r ae nQ . p r o c e d u r eQi s -C u e r p od eQ . b e g i n P ; -. . . e n dQ ; p r o c e d u r ePi s -R e p i t ee s p e c i f i c a c i np a r ad e c l a r a re lc u e r p o . b e g i n Q ; -. . . e n dP ;

Tambin puede resultar til declarar las especificaciones de los subprogramas en el comienzo del programa a modo de ndice, sobre todo si hay muchos cuerpos.

Vista de una entidad


Todas las declaraciones contienen una definicin de vista de una entidad. Una vista consiste en:

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

69/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Un identificador de la identidad. Caractersticas especficas de la vista que afectan al uso de la entidad a travs de dicha vista. En la mayora de los casos, una declaracin contiene la definicin de la vista y de la entidad misma, pero una declaracin de renombrado, sin embargo, no define una entidad nueva, sino que define una nueva vista de una entidad.

Parte declarativa
Una secuencia de declaraciones constituye una parte declarativa. Las siguientes construcciones de Ada tienen asociada una parte declarativa: Bloque. Cuerpo de un subprograma. Cuerpo de un paquete. Cuerpo de una tarea. Cuerpo de una entrada a un objeto protegido. Por ejemplo, en un procedimiento, la parte declarativa comprendera las sentencias entre procedure y begin. El cuerpo de un procedimiento puede contener en su parte declarativa el cuerpo de otro procedimiento. Por tanto, los procedimientos pueden ser declarados sin lmite de niveles de anidamiento sucesivos. En ocasiones, las declaraciones requieren una segunda parte (se dice que requieren una terminacin). La declaracin y su terminacin deben tener el mismo nombre y deben ocurrir en la misma regin declarativa. Por ejemplo, un paquete necesita un cuerpo (que sera la terminacin) si en su parte declarativa contiene alguna declaracin que requiere una terminacin que no se encuentre en dicha declaracin.

Regin declarativa de una declaracin


Hay que distinguir entre regin declarativa de una declaracin y parte declarativa. En el supuesto de una declaracin de una variable (por ejemplo I :I n t e g e r: =0 ; ) se extiende por una regin de texto que abarca slo una lnea, sin embargo, otras declaraciones ms complejas como procedimientos y paquetes constituyen muchas ms lneas de texto. En Ada, existen las siguientes construcciones que tienen asociada una regin declarativa: Cualquier declaracin que no sea terminacin de otra. Bloque Bucle Construccin accept. Manejador de excepcin. La regin declarativa de cada una de estas construcciones comprende: El texto de la construccin misma. Texto adicional, determinado de esta manera: Si una declaracin est incluida en la regin, tambin lo est su terminacin. Si una unidad de biblioteca est incluida en la regin, tambin lo estn sus unidades hijas. Si est incluido el requerimiento de compilacin separada, tambin lo est su subunidad correspondiente.
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 70/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

As, se pueden extraer las siguientes conclusiones: La especificacin de un paquete y su cuerpo forman parte de la misma regin declarativa porque el cuerpo es la terminacin de la especificacin, por lo que no se puede declarar la misma variable en la especificacin y en el cuerpo. Ya que la declaracin y el cuerpo de un paquete pueden estar en compilaciones distintas, la regin declarativa de una declaracin de paquete puede abarcar porciones de texto en varias unidades de compilacin distintas. Todas las unidades de biblioteca son hijas de Standard, luego toda unidad de biblioteca pertenece a su regin declarativa.

Manual de referencia de Ada


3.1 Declarations (http://www.adaic.org/standards/95lrm/html/RM-3-1.html)

mbito
Cada declaracin tiene asociada una porcin del texto del programa que se denomina mbito de la declaracin. En dicha porcin es el nico lugar donde se puede hacer referencia a dicha declaracin. El mbito de una declaracin consiste en: Si la declaracin es una unidad de biblioteca, todos sus dependientes semnticos. Si la declaracin no es una unidad de biblioteca, una porcin de la regin declarativa que la encierra inmediatamente. Dicha porcin se extiende desde el comienzo de la declaracin hasta el final de su regin declarativa. Resumiendo, como ejemplo:
p r o c e d u r ePi s -/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /P a r t ed e c l a r a t i v ad eP . -. . . -- m b i t od eA . A :F l o a t ; -- m b i t od eQ . -/ / / / / / / / / / / / / /R e g i nd e c l a r a t i v ad eIyR . p r o c e d u r eQi s -/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /P a r t ed e c l a r a t i v ad eQ . -- m b i t od eI . I :I n t e g e r: =0 ; -. . . -/ / / / / / / /R e g i nd e c l a r a t i v ad eJ . p a c k a g eRi s -/ / / / / / / / /P a r t ed e c l a r a t i v ap b l i c ad eR . -- m b i t od eJ . J :I n t e g e r: =I ; -. . . -/ / / / /F i np a r t ed e c l a r a t i v ap b l i c ad eR . e n dR ; p a c k a g eb o d yRi s -/ / / / / / / / /P a r t ed e c l a r a t i v ap r i v a d ad eR .
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 71/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

-- m b i t od eK K :I n t e g e r: =I+J ; -. . . -/ / / / /F i np a r t ed e c l a r a t i v ap r i v a d ad eR . b e g i n -. . . e n dR ; --F i n m b i t od eK --F i n m b i t od eJ . -/ / / /F i nr e g i nd e c l a r a t i v ad eJ . -/ / / / / / / / / / / / / / / / / / / / / / / / / / /F i np a r t ed e c l a r a t i v ad eQ . b e g i n -. . . e n dQ ; -. . . --F i n m b i t od eI . -/ / / / / / / / / /F i nr e g i nd e c l a r a t i v ad eIyR . -/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /F i np a r t ed e c l a r a t i v ad eP . b e g i n -. . . e n dP ; --F i n m b i t od eA . --F i n m b i t od eQ .

Para la clusula with tambin se define un mbito, que consiste en la regin declarativa de su declaracin si aparece delante de la declaracin de una unidad de biblioteca y en el cuerpo si aparece delante de un cuerpo. Para la clusula use: si acta como una declaracin, su mbito es la porcin de la regin declarativa que empieza justo despus de la clusula y finaliza junto con dicha regin declarativa; si acta como clusula de contexto, su mbito es el mismo que el de la clusula with.

Manual de referencia de Ada


8.2 Scope of Declarations (http://www.adaic.com/standards/95lrm/html/RM-8-2.html)

Visibilidad
Una entidad es visible en un punto dado si se puede utilizar su identificador para referirse a ella en dicho punto. La diferencia con el mbito es que ste es la regin de texto donde una determinada entidad es visible. En el caso de una declaracin de una variable, no se puede utilizar el identificador hasta que no se haya terminado su declaracin (por ejemplo, sera ilegal la declaracin I :I n t e g e r: =I+ 1 ; ) ya que no es visible hasta que no se haya terminado de declarar. Como ejemplo, en el caso de un bloque:
d e c l a r e - m b i t od eIe x t e r n a . I ,J :I n t e g e r ; -V i s i b i l i d a dd eIe x t e r n a . b e g i n -. . . d e c l a r e - m b i t od eIi n t e r n a . I :I n t e g e r: =0 ;
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 72/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

-V i s i b i l i d a dd eIi n t e r n a ,o c u l t al av i s i b i l i d a dd eIe x t e r n a . b e g i n -. . . e n d ; -F i nv i s i b i l i d a dd eIi n t e r n a ,o c u l t al av i s i b i l i d a dd eIe x t e r n a . -F i n m b i t od eIi n t e r n a . e n d ; -F i nv i s i b i l i d a dd eIe x t e r n a . -F i n m b i t od eIe x t e r n a .

En este caso, la visibilidad de la I externa se ve ocultada cuando se hace visible a la I interna. Sin embargo, si se dota de nombre al bloque, se puede hacer referencia a una variable supuestamente ocultada con la notacin punto:
E x t e r n o :d e c l a r e I ,J :I n t e g e r ; -Ie x t e r n a . b e g i n -. . . d e c l a r e I ,K :I n t e g e r ; -Ii n t e r n a . b e g i n K: =J+E x t e r n o . I ; -S eh a c er e f e r e n c i aal aIe x t e r n a . e n d ; e n dE x t e r n o ;

Igualmente se puede hacer con bucles y, por supuesto, con subprogramas y paquetes, pues deben poseer un identificador. En el caso de una entidad declarada en la parte no privada de la especificacin de un paquete, se aplican las mismas reglas dentro del paquete pero, fuera del mismo, la entidad no es visible a menos que se escriba el nombre del paquete mediante la notacin punto o, alternativamente, se escriba una clusula use.

Reglas de visibilidad
Una declaracin es directamente visible en un lugar determinado cuando su nombre, si notacin punto, es suficiente para referenciarla. La visibilidad puede ser inmediata o mediante una clusula use. Los identificadores visibles en un punto son aquellos visibles antes de considerar ninguna clusula use ms aquellos que se hacen visibles debido a las clusulas use. La regla bsica es que un identificador de un paquete se hace visible mediante una clusula use si el mismo identificador no est tambin en otro paquete con otra clusula use, por supuesto, siempre que el identificador no sea ya visible. Si no se cumple, hay que recurrir a la notacin punto. Se aplica una regla ligeramente diferente cuando todos los identificadores son subprogramas o literales enumeracin. En este caso, un identificador que se hace visible mediante una clusula use no puede ocultar nunca otro identificador, aunque s puede sobrecargarlo.

Manual de referencia de Ada


8.3 Visibility (http://www.adaic.com/standards/95lrm/html/RM-8-3.html)

Renombrado
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 73/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

El renombrado o redenominacin se utiliza para dar a una entidad un identificador ms conveniente en una determinada porcin del programa. Se suele emplear para resolver ambigedades y para evitar el uso de la notacin punto. Para ello se emplea la palabra reservada r e n a m e s . Por ejemplo:
f u n c t i o n" * "( X ,Y :T V e c t o r )r e t u r nF l o a tr e n a m e sP r o d u c t o E s c a l a r ;

Con ello se consigue utilizar indistintamente tanto "*" como ProductoEscalar (definido con anterioridad) para referirse a la misma funcin. Tambin se puede evitar la notacin punto sin tener que importar todos los identificadores con la clusula use:
p r o c e d u r eP o n e r( E l e m :I n t e g e r )r e n a m e sP i l a E n t e r o s . P o n e r ;

El renombrado se puede utilizar con objetos (variables y constantes), excepciones, subprogramas, y paquetes. No se aplica a tipos, aunque un subtipo que no aade restricciones es equivalente a un renombrado.
F :T F e c h ar e n a m e sA g e n d a ( I ) . F e c h a N a c i m i e n t o ; p a c k a g ePr e n a m e sP l a n t i l l a _ P i l a ;

Resear que el renombrado no corresponde a una sustitucin de texto. La identidad del objeto se determina cuando se realiza el renombrado.

Manual de referencia de Ada


8.5 Renaming Declarations (http://www.adaic.com/standards/95lrm/html/RM-8-5.html)

La biblioteca
La biblioteca Ada (unidades y subunidades)
La biblioteca Ada es la piedra angular de este lenguaje en la construccin de sistemas grandes, pero fiables. Los programas grandes deben ser descompuestos en subsistemas, cada uno de ellos con su propia estructura interna. La respuesta a este requerimiento en Ada es la biblioteca Ada y tiene las siguientes caractersticas: Integrado en el lenguaje. Facilita la creacin y mantenimiento de un subsistema, actuando como repositorio estructurado de todos sus componentes. Ofrece a los programas que hacen uso de un subsistema un interfaz fcil de utilizar y que es selectivo a componentes internos. Los compiladores de Ada toman el cdigo fuente y la biblioteca referenciada y producen un cdigo objeto y,
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 74/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

adems, una biblioteca actualizada con dicho cdigo objeto. Es como si la biblioteca Ada "recordara" las compilaciones que se realizan en el sistema. A diferencia de los compiladores de otros lenguajes, que nicamente generan el cdigo objeto sin incorporarlo a ninguna biblioteca. El concepto de incorporacin a la biblioteca no est definido por el lenguaje Ada, sino por el propio compilador. Por ejemplo, en la implementacin de Ada de GNU denominada GNAT, la biblioteca se implementa sobre un sistema de ficheros. La compilacin de un fichero que contiene, por ejemplo, un procedimiento, produce un fichero objeto y una coleccin de enlaces al resto de la biblioteca (fichero con la extensin .ali de Ada Library Information), dentro del mismo directorio. El compilador puede tener ahora dos "vistas" diferentes de la biblioteca Ada, una con el procedimiento incorporado y otra sin l. La estructura formal de un programa Ada es la siguiente: Un programa es un conjunto de compilaciones. El concepto de compilacin no est especificado por el lenguaje Ada, pero suele ser un fichero fuente. Una compilacin es una secuencia de unidades de compilacin. Por ejemplo, una compilacin con seis unidades de compilacin puede ser un fichero con cuatro procedimientos y dos paquetes. El nmero de unidades de compilacin en una compilacin puede estar limitado por la implementacin. Por ejemplo, el compilador GNAT nicamente permite una unidad de compilacin por cada compilacin. Una unidad de compilacin puede ser bien una unidad de biblioteca o bien una subunidad. Una unidad de biblioteca es la declaracin o cuerpo de un procedimiento o de un paquete. Una subunidad es una parte de una unidad de biblioteca que se desea separar y compilar por separado. La biblioteca se alimenta de los programas, que no son ms que un conjunto de unidades de compilacin que se suman a la biblioteca cuando se compila el programa. Cuando un programa est correctamente construido, se incorpora a la biblioteca. Los programas nuevos utilizan el material compilado ya disponible en la propia biblioteca. Hay que tener presente que los programas se escriben por partes que son compiladas por separado y luego se enlazan para dar el resultado final. Ada proporciona dos mecanismos para ello: Unidades de biblioteca: mecanismo ascendente. Subunidades: mecanismo descendente.

Subsecciones
1. 2. 3. 4. Unidades de biblioteca Unidades hijas Subunidades Compilacin separada y dependiente

Unidades de biblioteca
Una unidad de biblioteca puede ser una especificacin de subprograma o una especificacin de paquete; a los cuerpos correspondientes se les denomina unidades secundarias. Se puede compilar especificacin y cuerpo
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 75/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

juntos, pero es conveniente hacerlo separadamente con el fin de mejorar la accesibilidad y el mantenimiento de los programas. Cuando se compila una unidad, sta se almacena dentro de la biblioteca de programas. Una vez que se incluye en la biblioteca, una unidad puede ser usada por cualquier otra unidad que se compile a continuacin, esta dependencia se indica con la clusula with. Si el cuerpo de un subprograma es por s mismo suficiente para definir un subprograma completo. Es entonces cuando se le clasifica como una unidad de biblioteca, en vez de tratarlo como una subunidad. Si la especificacin y el cuerpo se compilan por separado, entonces, el cuerpo debe compilarse despus de la especificacin, es decir, el cuerpo es dependiente de la especificacin. Sin embargo, toda unidad que utilice el paquete es dependiente nicamente de la especificacin, aspecto destacable de Ada. Con ello, aunque cambie el cuerpo del paquete, si no se cambia la especificacin (interfaz con el exterior), no es necesario volver a recompilar las unidades que estaban utilizando dicho paquete. Se puede apreciar que la compilacin separada de especificacin y cuerpo simplifica el mantenimiento de los programas. Como es obvio, las unidades de biblioteca no pueden sobrecargarse ni pueden ser operadores.

Manual de referencia de Ada


10.1.1 Compilation Units - Library Units (http://www.adaic.com/standards/95lrm/html/RM-10-1-1.html)

Unidades hijas
El empleo de unidades hijas surge ante la necesidad de poder referenciar a un gran nmero de unidades de biblioteca con distintos nombres. Al igual que un sistema de archivos jerarquizado mediante directorios y subdirectorios, la biblioteca Ada contiene una jerarqua en su organizacin. Las unidades hijas son un paso ms all respecto a las subunidades, pues permiten extender la funcionalidad de un paquete sin modificar el paquete en cuestin. El padre de todas las unidades de biblioteca es el paquete Standard. De este modo, las unidades de biblioteca creadas se agregan como hijas de Standard y se les denomina unidades de biblioteca raz. Estas unidades seran hermanas de los paquetes predefinidos Standard.Ada, Standard.System y Standard.Interfaces. Y cada una de ellas puede a su vez contener unidades hijas.

Espacio de nombres
Las unidades hijas forman tambin un espacio de nombres, desde dentro de la jerarqua es posible referirse a las entidades definidas en el paquete padre como si estuviesen en la propia unidad. Igualmente al referirse a unidades hermanas. Por ejemplo:
p a c k a g eS e r v i d o ri s t y p eP e t i c i n _ Ti sp r i v a t e ; -. . . e n dS e r v i d o r ;

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

76/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

p a c k a g eS e r v i d o r . S e s i ni s t y p eS e s i n _ Ti s r e c o r d P e t i c i n:P e t i c i n _ T ;-E q u i v a l e n t eaS e r v i d o r . P e t i c i n _ T -. . . e n dr e c o r d ; -. . . e n dS e r v i d o r . S e s i n ;

Los paquetes se pueden encontrar en cualquier punto de la jerarqua, y los subprogramas slo en las hojas del rbol.

Visibilidad
La parte privada de un paquete hijo y su cuerpo pueden referenciar las entidades definidas en la parte privada del paquete padre.

Manual de referencia de Ada


10.1.1 Compilation Units - Library Units (http://www.adaic.com/standards/95lrm/html/RM-10-1-1.html)

Subunidades
El cuerpo de un paquete, subprograma o tarea puede ser "extrado" de la unidad o subunidad de biblioteca que lo engloba y compilarse por separado en lo que viene a denominarse subunidad. En la unidad que lo engloba, el cuerpo "extrado" se sustituye por un "resguardo" del cuerpo. Cualquier unidad de compilacin puede tener subunidades. En un ejemplo anterior, se construa un paquete de una pila de nmeros enteros con dos procedimientos Poner y Quitar, que interesa compilar por separado, luego se escribira:
p a c k a g eb o d yP i l a _ E n t e r o si s -C u e r p o . M a x:c o n s t a n t: =1 0 0 ; P i l a :a r r a y ( 1 . . M a x )o fI n t e g e r ; C i m a :I n t e g e rr a n g e0 . . M a x ; p r o c e d u r eP o n e r( E l e m :I n t e g e r )i ss e p a r a t e ; -S ec o m p i l aa p a r t e . f u n c t i o nQ u i t a rr e t u r nI n t e g e ri ss e p a r a t e ; -S ec o m p i l aa p a r t e . b e g i n C i m a: =0 ; -I n i c i a l i z a c i n . e n dP i l a _ E n t e r o s ;

A los subprogramas que se van a compilar aparte (Poner y Quitar) se les denomina subunidades. Su cuerpo deber implementarse en otro fichero de esta forma:
s e p a r a t e( P i l a _ e n t e r o s ) -I n d i c al au n i d a dd el aq u es ee x t r a j o . p r o c e d u r eP o n e r( E l e m :I n t e g e r )i s b e g i n C i m a: =C i m a+1 ; P i l a( C i m a ): =E l e m ; e n dP o n e r ;

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

77/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Y de manera anloga se procedera con Quitar. En el caso de que R sea subunidad de Q y sta a su vez de P, que es una unidad de biblioteca, entonces la implementacin de R debe comenzar con separate (P.Q). Una subunidad depende de la unidad de la que fue separada y, por tanto debe compilarse despus de ella. La visibilidad dentro de la subunidad es exactamente igual que si no hubiera sido separada, es decir, por ejemplo, una clusula with en la unidad principal se aplica a todas sus subunidades. Si se necesita de una unidad nicamente dentro de una subunidad, a fin de no complicar las dependencias de compilacin, se deber incluir la clusula with justo antes de la declaracin subunidad, es decir, delante de s e p a r a t e( P i l a _ E n t e r o s ) .

Manual de referencia de Ada


10.1.3 Subunits of Compilation Units (http://www.adaic.com/standards/95lrm/html/RM-10-1-3.html)

Compilacin separada y dependiente


Ada realiza una compilacin separada y dependiente . Una compilacin separada significa que el programa principal y un subprograma pueden escribirse por separado en ficheros distintos. Una compilacin dependiente significa que el compilador va a llevar a cabo la comprobacin de que los tipos y el nmero de parmetros de la invocacin en el subprograma invocante concuerdan con los tipos y el nmero de parmetros del subprograma invocado. En otros lenguajes en los que se realiza una compilacin independiente (por ejemplo el lenguaje C), no se advierte que los parmetros de llamada se corresponden y compila correctamente. Esta situacin en un sistema de control es intolerable. El fallo no se detecta en la compilacin y puede que tampoco en las pruebas. En Ada, cuando desde una unidad de biblioteca se utiliza un tipo o un subprograma de otra unidad, se puede entender que depende semnticamente de ella. Cuando una unidad ha sido compilada con xito, se incorpora a la biblioteca del lenguaje. As, cuando el compilador encuentra una llamada a un subprograma, contrasta el nmero y el tipo de los parmetros de la llamada contra la declaracin del subprograma invocado, declaracin que debe haber sido previamente compilada y que, en consecuencia, debe estar ya en la biblioteca. Por lo tanto, se puede decir que es la biblioteca Ada la que implementa la dependencia. Ada permite incluso escribir y compilar la subrutina invocante antes que la subrutina invocada de forma consistente. Esto se consigue compilando nicamente la especificacin, dejando la compilacin del cuerpo para ms tarde. En dicha especificacin se deja detallado el nombre, el nmero y los tipos de los parmetros, adems de indicar si son de entrada, salida o ambos. Esta es toda la informacin que necesita el compilador para compilar una llamada a un subprograma. Cuando, posteriormente, se compile el cuerpo del subprograma, se comprobar que es consistente con la especificacin. La forma de expresar que una unidad depende de otra se realiza mediante la clusula with. Cuando el
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 78/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

compilador encuentra dicha clusula, extrae de la biblioteca el interfaz de la unidad que acompaa a with. El orden de compilacin es el siguiente: una unidad slo se incorpora a la biblioteca despus de que todas las unidades de las que depende se han incorporado tambin a la biblioteca. Ello implica que: Si especificacin y cuerpo de una unidad se compilan por separado, es preciso compilar antes la especificacin. Si la especificacin de una unidad es cambiada y, por lo tanto, es recompilada de nuevo, todas las unidades que dependen de ella deben ser recompiladas. Si el cuerpo de una unidad se cambia de una forma consistente con su especificacin, las unidades que dependen de esta unidad no necesitan ser recompiladas. El lenguaje Ada viene con varios paquetes predefinidos como Text_IO. Estos paquetes ya han sido incorporados a la biblioteca del lenguaje. Hay, sin embargo, una excepcin que es el paquete Standard, que no necesita la clusula with. Finalmente, todas las unidades incorporadas a la biblioteca Ada deben tener nombres diferentes. En otro caso, se produce el reemplazamiento de la unidad residente por la nueva unidad con el mismo nombre. Notese que cuando se dice que una unidad se ha de compilar antes que otra no quiere decir que el programador se tenga que preocupar de estos temas, pues los entornos de desarrollo de Ada vienen acompaados de herramientas de compilacin que se encargan de recompilar todas las unidades necesarias y slo las que han quedado obsoletas por un cambio en el cdigo fuente. Por ejemplo, con el compilador GNAT, esta herramienta es gnatmake.

Manual de referencia de Ada


Section 10: Program Structure and Compilation Issues (http://www.adaic.com/standards/95lrm/html/RM10.html)

Tipos abstractos de datos


Tipos abstractos de datos (tipos privados)
Una de las principales contribuciones de los lenguajes de alto nivel es que el programador no tiene que preocuparse de cmo se representan fsicamente los datos en el computador. De esta idea surge el concepto de tipo de datos. Una extensin del mismo es el tipo abstracto de datos. Su implementacin es de nuevo desconocida para el programador, esta vez no porque desconozca la arquitectura del computador subyacente, sino porque es encapsulado en un mdulo que no permite el acceso directo a los detalles de su implementacin. En su lugar, se proporciona al programador operaciones sobre el tipo que son invocaciones a entradas del mdulo que lo encapsula. Por ejemplo, consideremos la utilizacin de un tipo abstracto de datos que represente a un nmero complejo:
p a c k a g eN m e r o s _ c o m p l e j o si s t y p eT C o m p l e j oi s r e c o r d
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 79/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

R e a l ,I m a g :F l o a t ; e n dr e c o r d ; I :c o n s t a n tT C o m p l e j o: =( 0 . 0 ,1 . 0 ) ; f u n c t i o n" + "( X ,Y :T C o m p l e j o )r e t u r nT C o m p l e j o ; f u n c t i o n" "( X ,Y :T C o m p l e j o )r e t u r nT C o m p l e j o ; f u n c t i o n" * "( X ,Y :T C o m p l e j o )r e t u r nT C o m p l e j o ; f u n c t i o n" / "( X ,Y :T C o m p l e j o )r e t u r nT C o m p l e j o ; e n dN m e r o s _ c o m p l e j o s ;

De este modo, el usuario debe conocer los detalles de la implementacin y sabe que se utiliza una representacin cartesiana. Adems, el usuario est obligado a hacer uso de la representacin. Para impedir el uso del conocimiento de la representacin con vistas, por ejemplo, a poder cambiar sta posteriormente, se puede hacer uso de los tipos privados definindolos mediante la palabra reservada p r i v a t e :
p a c k a g eN m e r o s _ c o m p l e j o si s -P a r t ev i s i b l e . t y p eT C o m p l e j oi sp r i v a t e ; -T i p op r i v a d o . I :c o n s t a n tT C o m p l e j o ; -N os ep u e d ea s i g n a rv a l o rt o d a v a . f u n c t i o n" + "( X ,Y :T C o m p l e j o )r e t u r nT C o m p l e j o ; f u n c t i o n" "( X ,Y :T C o m p l e j o )r e t u r nT C o m p l e j o ; f u n c t i o n" * "( X ,Y :T C o m p l e j o )r e t u r nT C o m p l e j o ; f u n c t i o n" / "( X ,Y :T C o m p l e j o )r e t u r nT C o m p l e j o ; f u n c t i o nC o n s t r u i r _ c o m p l e j o( R ,I :F l o a t )r e t u r nT C o m p l e j o ; f u n c t i o nP a r t e _ i m a g i n a r i a( X :T C o m p l e j o )r e t u r nF l o a t ; f u n c t i o nP a r t e _ r e a l( X :T C o m p l e j o )r e t u r nF l o a t ; p r i v a t e -P a r t eo c u l t a . t y p eT C o m p l e j oi s r e c o r d R e a l ,I m a g :F l o a t ; e n dr e c o r d ; I :c o n s t a n tT C o m p l e j o: =( 0 . 0 ,1 . 0 ) ; e n dN m e r o s _ c o m p l e j o s ;

Ahora, se ha definido TComplejo como tipo privado y se resguardan los detalles de su implementacin en la parte no visible del paquete despus de la palabra reservada p r i v a t ey hasta el fin de la especificacin del paquete. En la parte visible (desde el comienzo de la especificacin hasta private), se da la informacin disponible fuera del paquete. Las nicas operaciones disponibles son la asignacin, la igualdad y la desigualdad, aparte de las aadidas en el paquete. Ntese que el valor de I no se puede dar pues no se conocen todava los detalles de la implementacin, se declara como constante y se le asigna despus un valor en la parte privada. Las funciones Construir_complejo, Parte_imaginaria y Parte_real son ahora necesarias pues el usuario ya no conoce la estructura del tipo TComplejo y se necesita realizar dicha interfaz para poder manejar objetos del tipo privado. El cuerpo se podra implementar de la siguiente manera:
p a c k a g eb o d yN m e r o s _ c o m p l e j o si s f u n c t i o n" + "( X ,Y :T c o m p l e j o )r e t u r nT C o m p l e j oi s b e g i n r e t u r n( X . R e a l+Y . R e a l ,X . I m a g+Y . I m a g ) ; e n d" + " ; -. . ." " ," *y" / "s i m i l a r m e n t e . f u n c t i o nC o n s t r u i r _ c o m p l e j o( R ,I :F l o a t )r e t u r nT C o m p l e j oi s
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 80/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

b e g i n r e t u r n( R ,I ) ; e n dC o n s t r u i r _ c o m p l e j o ; f u n c t i o nP a r t e _ r e a l( X :T C o m p l e j o )r e t u r nF l o a ti s b e g i n r e t u r nX . R e a l ; e n dP a r t e _ r e a l ; -. . .P a r t e _ i m a g i n a r i aa n l o g a m e n t e . e n dN m e r o s _ c o m p l e j o s ;

Y podra ser utilizado transparentemente, por ejemplo, dentro de un bloque como:


d e c l a r e u s eN m e r o s _ c o m p l e j o s ; C 1 ,C 2 :T C o m p l e j o ; R 1 ,R 2 :F l o a t ; b e g i n C 1: =C o n s t r u i r _ c o m p l e j o( 1 . 5 ,6 . 0 ) ; C 2: =C 1+I ; R: =P a r t e _ r e a l( C 2 )+8 . 0 ; e n d ;

Si ahora se quisiera cambiar la implementacin del tipo TComplejo y representarlo en forma polar, no sera necesario cambiar la parte visible de la especificacin, por lo que todas las unidades que utilicen dicho paquete no tienen la necesidad de actualizarse. La interfaz exportada no ha cambiado y, por tanto, los programas que la utilizarn pueden seguir hacindolo. Por ejemplo, ahora se podra representar en la parte privada de la especificacin del paquete como:
-. . . p r i v a t e P i :c o n s t a n t: =3 . 1 4 1 6 ; t y p eT C o m p l e j oi s r e c o r d R :F l o a t ; T h e t a :F l o a tr a n g e0 . 0. .2 * P i ; e n dr e c o d ; I :c o n s t a n tT C o m p l e j o: =( 1 . 0 ,0 . 5 * P i ) ; e n dN m e r o s _ c o m p l e j o s ;

Lo nico que se necesitara sera reescribir el cuerpo del paquete y recompilarlo.

Enlaces externos
Ejemplos de TADs (http://jaca.cps.unizar.es/gnat/ejemplos_TADs)

Manual de referencia de Ada


7.3 Private Types and Private Extensions (http://www.adaic.com/standards/95lrm/html/RM-7-3.html)

Tipos limitados
Tipos privados limitados
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 81/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Cuando se define un tipo privado, se predefinen inherentemente las operaciones de asignacin, igualdad y desigualdad. Si no se quiere que exista ninguna operacin, sino nicamente las definidas en el paquete, se debe emplear el tipo privado limitado. Como consecuencia de no tener operador de asignacin, la declaracin de un objeto de dicho tipo no puede incluir un valor inicial. Esto tambin tiene la consecuencia de que no pueden existir constantes de un tipo privado limitado. La ventaja es que el programador de la unidad que contenga un tipo privado limitado se asegura el control absoluto sobre los objetos de dicho tipo. Para indicarlo, se define el tipo como l i m i t e dp r i v a t e . Por ejemplo, implementado un tipo abstracto de datos pila:
p a c k a g eP i l a si s t y p eT P i l ai sl i m i t e dp r i v a t e ; -T i p op r i v a d ol i m i t a d o . p r o c e d u r eP o n e r( P :i no u tT P i l a ;X :i nI n t e g e r ) ; p r o c e d u r eQ u i t a r( P :i no u tT P i l a ;X :o u tI n t e g e r ) ; f u n c t i o n" = "( P 1 ,P 2 :T P i l a )r e t u r nB o o l e a n ; p r i v a t e M a x :c o n s t a n t: =1 0 0 ; t y p eT V e c t o r E n t e r o si sa r r a y( I n t e g e rr a n g e< > )o fI n t e g e r ; t y p eT P i l ai s r e c o r d P :T V e c t o r E n t e r o s ( 1 . . M a x ) ; C i m a ;I n t e g e rr a n g e0 . . M a x: =0 ; e n dr e c o r d ; e n dP i l a s ;

La funcin "=" se implementa para comprobar que dos pilas tienen el mismo nmero de elementos y cada uno de ellos en el mismo orden deber ser iguales. Por eso, se ha optado por un tipo privado limitado.

Manual de referencia de Ada


7.5 Limited Types (http://www.adaic.com/standards/95lrm/html/RM-7-5.html)

Unidades genricas
Polimorfismo paramtrico
La idea de reutilizacin de cdigo surge ante la necesidad de construir programas en base a componentes bien establecidos que pueden ser combinados para formar un sistema ms amplio y complejo. La reutilizacin de componentes mejora la productividad y la calidad del software. El lenguaje Ada soporta esta caracterstica mediante las unidades genricas. Una unidad genrica es aquella en la que se manipulan tipos que posteriormente instanciar el usuario, es decir, se utiliza a modo de plantilla. Se pueden hacer unidades genricas de subprogramas y paquetes. Sintcticamente se podra describir como:
u n i d a d _ g e n r i c a: : =
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 82/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

g e n e r i c {l i s t a _ p a r m e t r o s _ g e n r i c o s} (e s p e c i f i c a c i n _ s u b p r o g r a m a|e s p e c f i c i c a c i n _ p a q u e t e) l i s t a _ p a r m e t r o s _ g e n r i c o s: : = i d e n t i f i c a d o r{,i d e n t i f i c a d o r}[i n[o u t]]t i p o[: =e x p r e s i n]; |t y p ei d e n t i f i c a d o ri s (( < > )|r a n g e< >|d i g i t s< >|d e l t a< > |d e f i n i c i n _ v e c t o r|d e f i n i c i n _ p u n t e r o) |d e c l a r a c i n _ p r i v a d a _ d e _ t i p o |d e c l a r a c i n _ f o r m a l _ p r o c e d i m i e n t o |d e c l a r a c i n _ f o r m a l _ p a q u e t e

Por ejemplo, para reutilizar un procedimiento de intercambio de variables:


g e n e r i c t y p eT E l e m e n t oi sp r i v a t e ; -P a r m e t r ot i p of o r m a lg e n r i c o . p r o c e d u r eI n t e r c a m b i a r( X ,Y :i no u tT E l e m e n t o ) ;

p r o c e d u r eI n t e r c a m b i a r( X ,Y :i no u tT E l e m e n t o )i s T e m p o r a l:T E l e m e n t o ; b e g i n T e m p o r a l: =X ; X: =Y ; Y: =T e m p o r a l ; e n dI n t e r c a m b i a r ;

La especificacin del subprograma va precedida por la parte formal genrica, que consta de la palabra reservada generic seguida por una lista de parmetros formales genricos que puede ser vaca. El subprograma Intercambiar es genrico y se comporta como una plantilla. Hay que destacar que las entidades declaradas como genricas no son locales, por ello es necesario instanciarlas. Por ello, para poder utilizar la unidad del ejemplo es necesario crear una instancia suya para el tipo que se quiera usar, su sintaxis sera:
i n s t a n c i a c i n _ u n i d a d _ g e n r i c a: : = (p a c k a g e|p r o c e d u r e|f u n c t i o n)i d e n t i f i c a d o ri sn e w i d e n t i f i c a d o r[(p a r m e t r o _ i n s t a n c i a d o{,p a r m e t r o _ i n s t a n c i a d o})];

Por ejemplo:
p r o c e d u r eI n t e r c a m b i a r _ e n t e r o si sn e wI n t e r c a m b i a r( I n t e g e r ) ;

Con ello, se puede utilizar el procedimiento para tipos Integer, si se quiere utilizar para cualquier otro tipo basta con volver a instanciarlo para el nuevo tipo con otro nombre o, si se utiliza el mismo identificador en la instanciacin, se sobrecarga el procedimiento y puede ser utilizado para distintos tipos:
p r o c e d u r eI n t e ri sn e wI n t e r c a m b i a r( F l o a t ) ; p r o c e d u r eI n t e ri sn e wI n t e r c a m b i a r( T D a ) ; p r o c e d u r eI n t e ri sn e wI n t e r c a m b i a r( T E l e m e n t o= >T P i l a ) ;

De igual modo, se pueden emplear paquetes genricos, por ejemplo, para implementar una plantilla del tipo abstracto de datos pila:
g e n e r i c -E s p e c i f i c a c i nu n i d a dg e n r i c a . M a x :P o s i t i v e ; -P a r m e t r ob j e t of o r m a lg e n r i c o . t y p eT E l e m e n t oi sp r i v a t e ; -P a r m e t r ot i p of o r m a lg e n r i c o .
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 83/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

p a c k a g eP l a n t i l l a _ p i l ai s p r o c e d u r eP o n e r( E :T E l e m e n t o ) ; f u n c t i o nQ u i t a rr e t u r nT E l e m e n t o ; e n dP l a n t i l l a _ p i l a ;

p a c k a g eb o d yP l a n t i l l a _ p i l ai s -C u e r p ou n i d a dg e n r i c a . P i l a :a r r a y ( 1 . . M a x )o fT E l e m e n t o ; C i m a :I n t e g e rr a n g e0 . . M a x ; -. . . e n dP l a n t i l l a _ p i l a ;

Ahora se podra utilizar una pila de un tamao y tipo determinados, para ello, habra que crear un ejemplar, por ejemplo, de esta manera:
d e c l a r e p a c k a g eP i l a _ r e a l e s _ d e _ 1 0 0i sn e wP l a n t i l l a _ p i l a( 1 0 0 ,F l o a t ) ; u s eP i l a _ r e a l e s _ d e _ 1 0 0 ; b e g i n P o n e r( 4 5 . 8 ) ; -. . . e n d ;

En la segunda lnea del cdigo anterior se ha creado una instancia del paquete P l a n t i l l a _ p i l aque se llama P i l a _ r e a l e s _ d e _ 1 0 0 . A partir de ese momento se pueden acceder a los miembros del paquete, ya que la creacin de la instancia implica su visibilidad (igual que si se ejecutara la sentencia w i t h P i l a _ r e a l e s _ d e _ 1 0 0 ; ).

Parmetros de unidades genricas


Resaltar que los objetos declarados como parmetros formales son de modo i npor defecto y pueden ser i no i no u t , pero nunca o u t . En el caso de que sea i n , se comportar como una constante cuyo valor lo proporciona el parmetro real correspondiente. Como resulta obvio, un parmetro genrico i nno puede ser de un tipo limitado, pues no se permite la asignacin y el parmetro formal toma su valor mediante asignacin. En el caso de que el parmetro genrico sea de modo i no u t , se comporta como una variable que renombra al parmetro real correspondiente; en este caso, el parmetro real debe ser el nombre de una variable y su determinacin se realiza en el momento de la creacin del ejemplar. Adems de parmetros genricos de tipo y objetos, se pueden incluir parmetros formales de subprogramas o paquetes, por ejemplo:
g e n e r i c t y p eT E l e mi sp r i v a t e ; w i t hf u n c t i o n" * "( X ,Y :T E l e m )r e t u r nT E l e m ; f u n c t i o nc u a d r a d o( X:T E l e m )r e t u r nT E l e m ;

f u n c t i o nc u a d r a d o( X :T E l e m )r e t u r nT E l e mi s b e g i n r e t u r nX*X ; -E lo p e r a d o r" * "f o r m a l . e n dc u a d r a d o ;

Se utilizara, por ejemplo, con matrices (teniendo previamente definida la operacin de multiplicacin de matrices), de la siguiente manera:
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 84/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

w i t hC u a d r a d o ; w i t hM a t r i c e s ; p r o c e d u r eP r u e b a _ o p e r a c i o n e si s f u n c t i o nC u a d r a d o _ m a t r i zi sn e wC u a d r a d o ( T E l e m= >M a t r i c e s . T M a t r i z ," * "= >M a t r i c e s . P r o d u c t o _ m a t r i c e s ) ; A :T M a t r i z: =T M a t r i z . I d e n t i d a d ; b e g i n A: =C u a d r a d o _ m a t r i z( A ) ; e n dP r u e b a _ o p e r a c i o n e s ;

Los tipos formales de un genrico se pueden especificar para que pertenezcan a una determinada clase de tipos. Tipo formal
t y p eTi sp r i v a t e ; t y p eT( D:T D )i s l i m i t e dp r i v a t e ; t y p eT( < > )i sp r i v a t e ; t y p eTi sl i m i t e d p r i v a t e ; t y p eTi s( < > ) ; t y p eTi sr a n g e< > ; t y p eTi sd e l t a< > ; t y p eTi sd i g i t s< > ; t y p eTi sa r r a y( I )o f E ; t y p eTi sa c c e s sO ;

Instanciable con Cualquier tipo con operador de igualdad y asignacin definidos Cualquier tipo con discriminante de tipo TD Cualquier tipo con cualquier discriminante Cualquier tipo (sea limitado o no) Cualquier tipo discreto Cualquier tipo entero con signo Cualquier tipo de coma fija Cualquier tipo de coma flotante Cualquier tipo array con ndice I y tipo de elementos E (I y E podran ser a su vez otros parmetros formales) Cualquier tipo puntero que apunte a objetos de tipo O (O podra ser a su vez otro parmetro formal)

En el cuerpo slo podemos hacer uso de las propiedades de la clase de tipo del parmetro real. Es decir, a diferencia de las plantillas de C++, la especificacin del genrico es un contrato que ha de cumplir la implementacin.

Ver tambin
Polimorfismo en Wikipedia Generic programming en Wikipedia en ingls

Manual de referencia de Ada


Section 12: Generic Units (http://www.adaic.com/standards/95lrm/html/RM-12.html)

Excepciones
En Ada, cuando se produce algn error durante la ejecucin de un programa, se eleva una excepcin. Dicha
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 85/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

excepcin puede provocar la terminacin abrupta del programa, pero se puede controlar y realizar las acciones pertinentes. Tambin se pueden definir nuevas excepciones que indiquen distintos tipos de error.

Excepciones predefinidas
En Ada, dentro del paquete Standard, existen unas excepciones predefinidas, stas son: Constraint_Error cuando se intenta violar una restriccin impuesta en una declaracin, tal como indexar ms all de los lmites de un array o asignar a una variable un valor fuera del rango de su subtipo. Program_Error se produce cuando se intenta violar la estructura de control, como cuando una funcin termina sin devolver un valor. Storage_Error es elevada cuando se requiere ms memoria de la disponible. Tasking_Error cuando hay errores en la comunicacin y manejo de tareas. Numeric_Error en Ada 83 se poda presentar cuando ocurra un error aritmtico. A partir del estndar Ada 95, desaparece por motivos de portabilidad y pasa a ser un renombrado de Constraint_Error. Por ejemplo, en Ada 83 al dividir entre cero poda saltar Constraint_Error o Numeric_Error (dependiendo del compilador). En Ada 95 este error siempre levanta Constraint_Error. Name_Error se produce cuando se intenta abrir un fichero que no existe.

Manejador de excepciones
Cuando se espere que pueda presentarse alguna excepcin en parte del cdigo del programa, se puede escribir un manejador de excepciones en las construcciones que lo permitan (bloques o cuerpos de subprogramas, paquetes o tareas), aunque siempre est el recurso de incluir un bloque en cualquier lugar del cdigo. Su sintaxis sera:
m a n e j a d o r _ e x c e p c i n: : = w h e n[i d e n t i f i c a d o r:]e l e c c i n _ e x c e p c i n{|e l e c c i n _ e x c e p c i n}= > s e c u e n c i a _ s e n t e n c i a s e l e c c i n _ e x c e p c i n: : =i d e n t i f i c a d o r|o t h e r s

A la sentencia que comienza por w h e n , se le denomina manejador de excepcin. La palabra reservada o t h e r sindica cualquier otra excepcin y debe ser la nica y ltima opcin. Por ejemplo, en un bloque:
b e g i n -. . . e x c e p t i o n
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 86/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

w h e nC o n s t r a i n t _ E r r o r= > P u t( " E r r o rd er a n g o . " ) ; w h e nP r o g r a m _ E r r o r|T a s k i n g _ E r r o r= > P u t( " E r r o rd ef l u j o . " ) ; w h e no t h e r s= > P u t( " O t r oe r r o r . " ) ; e n d ;

En el momento en el que se produzca la elevacin de C o n s t r a i n t _ E r r o rdurante la ejecucin de la secuencia de sentencias entre b e g i ny e x c e p t i o n , el flujo de control se interrumpe y se transfiere a la secuencia de sentencias que siguen a la palabra reservada = >del manejador correspondiente. Otro ejemplo con una funcin:
f u n c t i o nM a a n a( H o y :T D a )r e t u r nT D ai s b e g i n r e t u r nT D a ' S u c c ( H o y ) ; e x c e p t i o n w h e nC o n s t r a i n t _ E r r o r= > r e t u r nT D a ' F i r s t ; e n dM a a n a ;

Ntese que no se puede devolver nunca el control a la unidad donde se elev la excepcin. Cuando se termina la secuencia de sentencias del manejador, termina tambin la ejecucin de dicha unidad. Si no se controla una excepcin, sta se propaga dinmicamente por las sucesivas unidades invocantes hasta que se maneje en otra o directamente termina la ejecucin del programa proporcionando un mensaje con la excepcin provocada por pantalla.

Declaracin y elevacin de excepciones


Normalmente, es probable prever una situacin de error que no se encuentra entre las excepciones predefinidas, por ello, se puede declarar excepciones. Por ejemplo:
E r r o r :e x c e p t i o n ;

Con lo que se puede elevar dicha excepcin en el momento pertinente mediante la sentencia raise, cuya sintaxis es:
e l e v a c i n _ e x c e p c i n: : =r a i s e[i d e n t i f i c a d o r];

Por ejemplo, en un paquete de manejo de una pila esttica de nmeros enteros:


p a c k a g eP i l a _ e n t e r o si s E r r o r P i l a E n t e r o s :e x c e p t i o n ; p r o c e d u r eP o n e r( X :I n t e g e r ) ; f u n c t i o nQ u i t a rr e t u r nI n t e g e r ; e n dP i l a _ e n t e r o s ; p a c k a g eb o d yP i l a _ e n t e r o si s M a x :c o n s t a n t: =1 0 0 ; P i l a :a r r a y( 1 . . M a x )o fI n t e g e r ; C i m a :I n t e g e rr a n g e0 . . M a x ;

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

87/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

p r o c e d u r eP o n e r( X :I n t e g e r )i s b e g i n i fC i m a=M a xt h e n r a i s eE r r o r P i l a E n t e r o s ; -S ee l e v al ae x c e p c i n . e n di f ; C i m a: =C i m a+1 ; P ( C i m a ): =X ; e n dP o n e r ; f u n c t i o nQ u i t a rr e t u r nI n t e g e ri s b e g i n i fC i m a=0t h e n r a i s eE r r o r P i l a E n t e r o s ; -S ee l e v al ae x c e p c i n . e n di f ; C i m a: =C i m a-1 ; r e t u r nP i l a ( C i m a + 1 ) ; e n dQ u i t a r ; b e g i n C i m a: =0 ; e n dP i l a _ e n t e r o s ;

Obsrvese que no hace falta else en la sentencias if, pues al elevar la excepcin, finaliza la ejecucin del subprograma. Ahora se podra escribir:
d e c l a r e u s eP i l a _ e n t e r o s ; b e g i n P o n e r( 5 ) ; -. . . e x c e p t i o n w h e nE r r o r P i l a E n t e r o s= > -. . .M a n i p u l a c i ni n c o r r e c t ad el ap i l a . w h e no t h e r s= > -. . . e n d ;

Si se quiere que dicha excepcin no se propague ms all de la unidad en la que se elev pero no se quiere manejar, se puede emplear una nica sentencia vaca (null) dentro de su manejador correspondiente:
p r o c e d u r eV a c i a r _ p i l a _ e n t e r o si s B a s u r a :I n t e g e r ; u s eP i l a _ e n t e r o s ; b e g i n l o o p B a s u r a: =Q u i t a r ; e n dl o o p ; e x c e p t i o n w h e nE r r o r P i l a E n t e r o s= > n u l l ; e n dV a c i a r _ p i l a _ e n t e r o s ;

Aunque esto no evitara que se terminara la ejecucin de la unidad. En el caso en el que se quiera propagar una excepcin despus de haber ejecutado las sentencias pertinentes, se incluira una sentencia raise dentro del manejador:
-. . .
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 88/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

e x c e p t i o n w h e nE r r o r P i l a E n t e r o s= > P u t( " P i l au t i l i z a d ai n c o r r e c t a m e n t e . " ) ; V a c i a r _ p i l a _ e n t e r o s ; r a i s eE r r o r P r o c e s a m i e t o ; -S ep r o p a g ao t r ae x c e p c i n . e n d ;

En este caso se propaga otra excepcin, pero podra haber sido la misma simplemente con raise, sin crear una nueva ocurrencia de la excepcin, por ejemplo:
-. . . e x c e p t i o n w h e nF a l l o E n V l v u l a= > P u t( " S eh ap r o d u c i d ou nf a l l oe nl av l v u l a . " ) ; r a i s e ; -S ep r o p a g al am i s m ae x c e p c i nd e lm a n e j a d o r . e n d ;

As, se puede realizar un manejo de la excepcin en varias capas, realizando sucesivas acciones en cada una de ellas. Dicha sentencia raise sin argumentos debe ser invocada directamente en el manejador, no es posible invocarla en un procedimiento llamado por el manejador.

Informacin de la excepcin
Ada proporciona informacin sobre una determinada excepcin haciendo uso del paquete predefinido Ada.Exceptions y tras obtener la ocurrencia de la excepcin mediante esta notacin:
w h e nO c u r r e n c i a:E r r o r S e n s o r= > P u t _ L i n e( A d a . E x c e p t i o n s . E x c e p t i o n _ I n f o r m a t i o n( O c u r r e n c i a ) ) ;

Manual de referencia de Ada


Section 11: Exceptions (http://www.adaic.com/standards/95lrm/html/RM-11.html)

Enlaces externos
Excepciones (http://www.gui.uva.es/~laertes/nuke/index.php? option=com_content&task=view&id=48&Itemid=41) : artculo de la Universidad de Valladolid. Ejemplos en Ada y Eiffel.

Concurrencia
Concurrencia
La concurrencia es la simultaneidad de hechos. Un programa concurrente es aquel en el que ciertas unidades de ejecucin internamente secuenciales (procesos o threads), se ejecutan paralela o simultneamente.
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 89/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Existen 3 formas bsicas de interaccin entre procesos concurrentes: Sincronizacin (p.e. las citas o paso de mensajes). Sealizacin (p.e. los semforos). Comunicacin (p.e. uso de memoria compartida). La concurrencia o procesamiento paralelo se ha implementado en leguajes de programacin de distinta manera: Programacin concurrente clsica: se basa en la utilizacin de variables compartidas. Es el caso de Modula-2 o Concurrent Pascal. Para ello, se emplean herramientas como semforos, regiones crticas y monitores. Programacin concurrente distribuida: se basa en la transferencia de mensajes entre los procesos o threads. Es el caso de C/POSIX, Occam o Ada. Se emplean herramientas como canales, buzones y llamadas a procedimiento remoto. En Ada se emplea una programacin concurrente distribuida y la principal forma de sincronizar las unidades de ejecucin, conocidas como tareas, son los puntos de entrada a la tarea o citas.

Subsecciones
1. Tareas 2. Sincronizacin de tareas mediante puntos de entrada o citas (entry) 1. Aceptacin de citas (accept) 2. Seleccin de citas (select) 3. Llamadas a punto de entrada complejas 3. Tareas dinmicas: creacin dinmica de tareas (tipos tareas) 1. Dependencia de tareas

Tareas
Definicin de tareas
En Ada, a la unidad de proceso secuencial que puede ser ejecutada paralelamente se le denomina task . Es la representacin explcita de un proceso (o tarea). Como en otras construcciones, la tarea de Ada presenta una especificacin (interfaz con el exterior) y un cuerpo (descripcin del comportamiento dinmico). La sintaxis de la especificacin de una tarea es:
e s p e c i f i c a c i n _ t a r e a: : = t a s ki d e n t i f i c a d o r[i s {p u n t o _ e n t r a d a _ t a r e a|c l u s u l a _ r e p r e s e n t a c i n} [p r i v a t e{p u n t o _ e n t r a d a _ t a r e a|c l u s u l a _ r e p r e s e n t a c i n}] e n d[i d e n t i f i c a d o r]]; p u n t o _ e n t r a d a _ t a r e a: : =
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 90/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

e n t r yi d e n t i f i c a d o r[(t i p o|r a n g o)][(p a r m e t r o{,p a r m e t r o})];

La sintaxis del cuerpo de una tarea es:


c u e r p o _ t a r e a: : = t a s kb o d yi d e n t i f i c a d o ri s [p a r t e _ d e c l a r a t i v a] b e g i n s e c u e n c i a _ d e _ s e n t e n c i a s e n d[i d e n t i f i c a d o r];

Por ejemplo, dos procesos que escriben un texto por pantalla:


p r o c e d u r eT a r e a s _ t o n t a s t a s kT a r e a 1 ; t a s kT a r e a 2 ; t a s kb o d yT a r e a 1i s b e g i n l o o p P u t( " S o yl at a r e a1 . " ) ; e n dl o o p ; e n dT a r e a 1 ; t a s kb o d yT a r e a 2i s b e g i n l o o p P u t( " S o yl at a r e a2 . " ) ; e n dl o o p ; e n dT a r e a 2 ; b e g i n -E ne s t em o m e n t oc o m i e n z a nae j e c u t a r s ea m b a st a r e a s . P u t( " S o ye lp r o c e d i m i e n t op r i n c i p a l . " ) ; e n dT a r e a s _ t o n t a s ;

En este caso, el orden de los mensajes que aparecen en pantalla es totalmente impredecible, depende del sistema en el que se ejecuten. Ni siquiera es predecible si las frases que vayan apareciendo sern completas o sern truncadas, esto es debido a que el sistema puede decidir suspender la ejecucin de alguna tarea en cualquier instante de tiempo y la sentencia Put no es atmica. Ambas tareas comenzarn su ejecucin simultneamente (al menos lgicamente) justo despus del begin del procedimiento.

Ciclo de vida y tipos


Hay dos tipos de tareas, segn su ciclo de vida: Tareas estticas : Dependen del bloque donde se declaran. Se activan justo antes de que se ejecuten las instrucciones del bloque donde fueron declaradas. Terminan cuando todas sus tareas hijas terminen y llegue a su ltima instruccin. Tareas dinmicas (mediante punteros): Dependen del bloque donde se define el tipo puntero. Se activan con la sentencia n e w . Las tareas hijas pueden seguir existiendo cuando se termine su progenitora.
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 91/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Existen atributos asociados a las tareas, entre otros: Tarea'Callable indica falso si la tarea est completada o terminada, en otro caso (ejecutndose o suspendida), verdadero. Tarea'Terminated indica verdadero si la tarea ha terminado. Indicar tan slo, que una tarea se puede terminar abruptamente mediante la sentencia a b o r ty para redirigir una llamada a un punto de entrada que est encolada hacia otra cola, se emplea la sentencia r e q u e u e .

Ejemplo
Para un sistema de control de presin y temperatura, se puede realizar el control de ambas magnitudes simultneamente:
w i t hP a q u e t e _ c o n t r o l _ t e m p e r a t u r a ;u s eP a q u e t e _ c o n t r o l _ t e m p e r a t u r a ; w i t hP a q u e t e _ c o n t r o l _ p r e s i n ;u s eP a q u e t e _ c o n t r o l _ p r e s i n ; p r o c e d u r eC o n t r o l _ t e m p e r a t u r a _ y _ p r e s i n t a s kC o n t r o l _ t e m p e r a t u r a ; t a s kC o n t r o l _ p r e s i n ; t a s kb o d yC o n t r o l _ t e m p e r a t u r ai s T e m p e r a t u r a :T T e m p e r a t u r a ; T e m p e r a t u r a _ r e f e r e n c i a :T T e m p e r a t u r a: =5 5 ; A c c i n C a l e f a c t o r :T A c c i n C a l e f a c t o r ; b e g i n l o o p T e m p e r a t u r a: =L e e r ; A c c c i n C a l e f a c t o r: =C o n t r o l( T e m p e r a t u r a ,T e m p _ r e f e r e n c i a ) ; E s c r i b i r( A c c i n C a l e f a c t o r ) ; d e l a y( 2 . 0 ) ; e n dl o o p ; e n dC o n t r o l _ t e m p e r a t u r a ; t a s kb o d yC o n t r o l _ p r e s i ni s P r e s i n :T P r e s i n ; P r e s i n _ r e f e r e n c i a :T P r e s i n: =3 1 5 ; P o s i c i n V a l v u l a :T P o s i c i n V l v u l a ; Una tarea Ada puede cambiar de estado cuando se b e g i n l o o p cumplen ciertas condiciones que dependen de si es P r e s i n: =L e e r ; esttica o dinmica. P o s i c i n V l v u l a: =C o n t r o l( P r e s i n ,P r e s i n _ r e f e r e n c i a ) ; E s c r i b i r( P o s i c i n V l v u l a ) ; d e l a y( 3 . 0 ) ; e n dl o o p ; e n dC o n t r o l _ p r e s i n ; b e g i n -C o m i e n z a nae j e c u t a r s eC o n t r o l _ t e m p e r a t u r ayC o n t r o l _ p r e s i n ; n u l l ;-U nc u e r p od ep r o c e d i m i e n t on op u e d ee s t a rv a c o . e n dC o n t r o l _ t e m p e r a t u r a _ y _ p r e s i n ;

En el preciso instante en el que comienza a ejecutarse el procedimiento, hay tres procesos ejecutndose simultneamente, el procedimiento y las dos tareas.

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

92/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Manual de referencia de Ada


Section 9: Tasks and Synchronization (http://www.adaic.com/standards/95lrm/html/RM-9.html)

Sincronizacin mediante citas


Sincronizacin de tareas mediante puntos de entrada o citas (entry)
Frecuentemente, las tareas interaccionan entre s y necesitan un mecanismo para comunicarse y sincronizarse, este mecanismo que ofrece Ada se conoce como la cita (rendezvous) o punto de entrada a la tarea.La cita entre dos tareas se produce como consecuencia de la llamada de una tarea a un punto de entrada declarado en otra tarea. Los puntos de entrada se declaran en la especificacin de la tarea, por ejemplo:
t a s kT a r e ai s e n t r yE n t r a d a( N :I n t e g e r ) ; e n dT a r e a ;

Un punto de entrada se asemeja a un procedimiento. Los parmetros que admiten son de modo in, out o in out, por defecto, se sobreentiende in. Para invocar a un punto de entrada, se procede de igual manera que en un procedimiento, por ejemplo:
T :T a r e a ; -. . . T . E n t r a d a( 8 ) ;

Ntese que se debe emplear la notacin punto siempre que se realice la llamada fuera de la misma tarea pues una tarea no puede aparecer en una clusula use. Realizar una llamada a un punto de entrada propio desde la misma tarea est permitido sintcticamente, pero resulta ilgico, pues producira un interbloqueo consigo misma. Tambin se pueden definir varios puntos de entrada simultneamente, por ejemplo:
t y p eT N i v e li sI n t e g e rr a n g e1 . . 1 0 ; t a s kC o n t r o l a d o ri s -S ed e f i n eu np u n t od ee n t r a d ap o rc a d an i v e l . e n t r yA v i s o( T N i v e l )( E l e m :T E l e m e n t o ) ; e n dC o n t r o l a d o r ;

Y se podra llamar a un punto de entrada de los 10 definidos como, por ejemplo:


P r o c e s o C o l t r o l :C o n t r o l a d o r ; -. . . P r o c e s o C o n t r o l . A v i s o( 3 )( 1 7 7 3 ) ;

Con ello, se llama al punto de entrada Aviso con el nivel 3 y parmetro 1173.

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

93/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Las acciones que se llevan a cabo al aceptar una cita se especifican mediante la sentencia a c c e p t , tal y como se explica en el apartado siguiente.

Manual de referencia de Ada


9.5.2 Entries and Accept Statements (http://www.adaic.com/standards/95lrm/html/RM-9-5-2.html)

Aceptacin de citas
Aceptacin de citas (accept)
La forma de aceptar una cita y ejecutar las sentencias que se deseen es mediante la sentencia a c c e p t , dentro del cuerpo de la tarea que acepta la cita. Cada sentencia e n t r ydebe corresponderse con una sentencia a c c e p t . La sintaxis de a c c e p tes:
a c c e p t a c i n _ c i t a: : = a c c e p ti d e n t i f i c a d o r[(e x p r e s i n)] [(e s p e c i f i c a c i n _ p a r m e t r o{;e s p e c i f i c a c i np a r m e t r o})][d o s e c u e n c i a _ d e _ s e n t e n c i a s e n d[i d e n t i f i c a d o r]];

Por ejemplo:
a c c e p tE n t r a d a( N :I n t e g e r )d o -. . .S e c u e n c i ad es e n t e n c i a s . e n dE n t r a d a ;

Se deben repetir los parmetros formales declarados en el punto de entrada de la especificacin de la tarea. La diferencias fundamentales entre los puntos de entrada y los procedimientos son: El cdigo existente dentro en la sentencia accept es ejecutado por la tarea propietaria y no por la parte invocante, como en los procedimientos. Adems, hasta que la tarea no llegue a la ejecucin de dicha sentencia a c c e p t , no puede ser invocado el punto de entrada. De igual manera, la parte invocante queda suspendida hasta que termine la ejecucin de la sentencia a c c e p t . ste es el fundamento de la cita. La forma ms simple de sincronizar una tarea que dependa de la terminacin de otro cdigo es por ejemplo:
t a s kS i m p l ei s e n t r yC o n t i n u a r ; e n dS i m p l e ; t a s kb o d yS i m p l ei s b e g i n -. . .
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 94/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

a c c e p tC o n t i n u a r ; -S eq u e d ab l o q u e a d oh a s t aq u es ec i t e . -. . . e n dS i m p l e ;

Como otro ejemplo, si se quiere implementar una tarea que realice un control de escritura y lectura sobre un buffer de un nico elemento:
t a s kB u f f e r 1i s e n t r yE s c r i b i r( E l e m :T E l e m e n t o ) ; e n t r yL e e r( E l e m :o u tT E l e m e n t o ) ; e n dB u f f e r 1 ; t a s kb o d yB u f f e r 1i s E l e m L o c a l :T E l e m e n t o ; b e g i n l o o p a c c e p tE s c r i b i r( E l e m :T E l e m e n t o )d o E l e m L o c a l : =E l e m ; -G u a r d ae le l e m e n t o . e n dE s c r i b i r ; A d a . T e x t _ I O . P u t _ L i n e ( " E l e m e n t oe s c r i t o ,v o yai n t e n t a rL E E R ! " ) ; a c c e p tL e e r( E l e m :o u tT E l e m e n t o )d o E l e m: =E l e m L o c a l ; -D e v u e l v ee le l e m e n t o . e n dE s c r i b i r ; A d a . T e x t _ I O . P u t _ L i n e ( " E l e m e n t ol e i d o ,v u e l v oai n t e n t a rE S C R I B I R " ) ; e n dl o o p ; e n dB u f f e r 1 ;

Se aceptan llamadas B u f f e r 1 . E s c r i b i r ( )y B u f f e r 1 . L e e r ( )de forma consecutiva, sin posibilidad de escribir o leer dos o ms veces seguidas. Varias tareas diferentes pueden invocar a los puntos de entrada y, por tanto, pueden quedar encoladas. Cada punto de entrada tiene una cola de tareas que esperan llamar a dicho punto de entrada. El atributo E s c r i b i r ' C o u n tcontiene el nmero de tareas que se encuentran encoladas a la espera de que se ejecute el punto de entrada E s c r i b i r , pero slo se puede utilizar dentro de la tarea que contiene el punto de entrada. Con la ejecucin de la sentencia a c c e p tse extraera la primera tarea de la cola (la primera que lleg). Por tanto, el ejemplo anterior funciona de la siguiente manera: la tarea B u f f e r 1llega al a c c e p tde E s c r i b i ry se queda bloqueada all hasta que otra tarea realice una llamada B u f f e r 1 . E s c r i b i r ( ) . En ese momento, la tarea B u f f e r 1ejecuta E s c r i b i ry llega al a c c e p tde L e e r , donde se queda bloqueada hasta que otra tarea realice una llamada B u f f e r 1 . L e e r ( ) . Se ejecuta L e e ry la tarea B u f f e r 1vuelve al a c c e p tde E s c r i b i r , y as constantemente. Evidentemente, si hay tareas encoladas en los puntos de entrada de E s c r i b i ro de L e e r , la tarea B u f f e r 1no se queda bloqueada, sino que atiende a la primera tarea llamante de la cola. Se puede introducir cdigo entre dos bloques de a c c e p t , tal y como se ve en el ejemplo anterior: cuando se acaba el primer bloque a c c e p t(E s c r i b i r ) se ejecuta dicho cdigo y despus se entra en la cola de espera del segundo bloque a c c e p t(L e e r ). Si hay definidos varios puntos de entrada simultneamente, se puede aceptar uno de ellos, por ejemplo, como:
a c c e p tA v i s o( 3 )( E l e m :T e l e m e n t o )d o -. . . e n dA v i s o ;

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

95/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Manual de referencia de Ada


9.5.2 Entries and Accept Statements (http://www.adaic.com/standards/95lrm/html/RM-9-5-2.html)

Seleccin de citas
Seleccin de citas (select) Uno de los usos de la sentencia select es permitir a una tarea seleccionar entre varias posibles citas; en este caso, se permite su uso nicamente dentro del cuerpo de una tarea. Su sintaxis es la siguiente:
s e l e c c c i n _ a c e p t a c i n _ c i t a: : = s e l e c t [w h e nc o n d i c i n= >] (a c c e p t a c i n _ c i t a|(d e l a y[u n t i l]e x p r e s i n) [s e c u e n c i a _ d e _ s e n t e n c i a s]) |(t e r m i n a t e;)) {o r [w h e nc o n d i c i n= >] (a c c e p t a c i n _ c i t a|(d e l a y[u n t i l]e x p r e s i n) [s e c u e n c i a _ d e _ s e n t e n c i a s]) |(t e r m i n a t e;))} [e l s e s e q u e n c i a _ s e n t e n c i a s] e n ds e l e c t;

Esta alternativa de sentencia s e l e c tpermite una combinacin de espera y seleccin entre varias aceptaciones de puntos de entrada a la tarea alternativas. Adems, la seleccin puede depender de condiciones asociadas a cada alternativa. La sentencia d e l a ysirve para indicar que, si en un determinado intervalo de tiempo no se produce ninguna llamada que corresponda con las selecciones anteriores, se ejecuten las sentencias posteriores. La sentencia t e r m i n a t ese elige en la sentencia s e l e c tsi la unidad de la que la tarea depende ha llegado al final y todas las tareas hermanas y dependientes han terminado. Es una terminacin controlada. Esta alternativa no puede aparecer si hay una alternativa d e l a yo e l s e . Por ejemplo:
t a s kS e r v i d o ri s e n t r yT r a b a j a r ; e n t r yC e r r a r ; e n d ; t a s kb o d yS e r v i d o ri s b e g i n l o o p s e l e c t a c c e p tT r a b a j a rd o -S ea c e p t al al l a m a d aat r a b a j a r . T r a b a j a n d o: =T r u e ; -V a r i a b l eg l o b a l . e n d ; T r a b a j o _ s e r v i d o r ; -T r a b a j a . o r a c c e p tC e r r a r ; -S ec i e r r ae ls e r v i d o r .
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 96/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

e x i t ; o r d e l a y( 6 0 . 0 ) ; - S eh a no l v i d a d od e ls e r v i d o r ? P u t( " E s t o ye s p e r a n d ot r a b a j a r . " ) ; -O t r ao p c i ne nv e zd ed e l a y : -o r T e r m i n a c i nn o r m a lc u a n d os ed e s t r u y ae lo b j e t ot a r e a . -t e r m i n a t e ; e n ds e l e c t ; e n dl o o p ; e n dS e r v i d o r ;

Como otro ejemplo, para garantizar la exclusin mutua a una variable (acceso seguro a memoria compartida), se podra implementar con tareas de la siguiente manera:
t a s kV a r i a b l e _ p r o t e g i d ai s e n t r yL e e r( E l e m :o u tT E l e m e n t o ) ; e n t r yE s c r i b i r( E l e m :T E l e m e n t o ) ; e n d ; t a s kb o d yV a r i a b l e _ p r o t e g i d ai s E l e m L o c a l :T E l e m e n t o ; b e g i n a c c e p tE s c r i b i r( E l e m :T E l e m e n t o )d o E l e m L o c a l: =E l e m ; e n dE s c r i b i r ; l o o p s e l e c t a c c e p tE s c r i b i r( E l e m :T E l e m e n t o )d o E l e m L o c a l: =E l e m ; e n dE s c r i b i r ; o r a c c e p tL e e r( E l e m :o u tT E l e m e n t o )d o E l e m: =E l e m L o c a l ; e n dL e e r ; e n ds e l e c t ; e n dl o o p ; e n dV a r i a b l e _ p r o t e g i d a ;

La primera sentencia de la tarea es un a c c e p tde Escribir, con lo que se asegura que la primera llamada le de un valor a la variable local. En el supuesto de que se realizara una llamada a Leer, sta quedara encolada hasta que se produjera la aceptacin de Escribir. Despus, la tarea entra en el bucle infinito que contiene una sentencia s e l e c t . Es ah donde se acepta tanto llamadas a Escribir como a Leer de la siguiente manera: Si no se llama ni a Leer ni a Escribir, entonces la tarea se queda suspendida hasta que se llame a algn punto de entrada, en ese momento se ejecutar la sentencia a c c e p tcorrespondiente. Si hay una o ms llamadas en la cola de Leer, pero no hay llamadas en la de Escribir, se acepta la primera llamada a Leer, y viceversa. Si hay llamadas tanto en la cola de Leer como en la de Escribir, se hace una eleccin arbitraria. Es una tarea que sirve a dos colas de clientes que esperan servicios diferentes. Sin embargo, se impide el acceso mltiple a la variable local.

Manual de referencia de Ada


9.7 Select Statements (http://www.adaic.com/standards/95lrm/html/RM-9-7.html)
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 97/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Llamadas a punto de entrada complejas


Llamadas a punto de entrada complejas
A veces, interesa que una llamada a un punto de entrada de una tarea cumpla unos requisitos. Esto es debido a que se puede bloquear el proceso que realiza la llamada y puede ser interesante disponer de mtodos para desbloquearlo si no se cumplen unas determinadas condiciones. La sentencia select, adems de servir como seleccin de aceptaciones de puntos de entrada dentro del cuerpo de la tarea que los contiene, tambin proporciona mecanismos para seleccionar el comportamiento de las llamadas a puntos de entrada. Su sintaxis es la siguiente:
l l a m a d a _ a _ p u n t o _ d e _ e n t r a d a _ c o m p l e j a: : = l l a m a d a _ a _ p u n t o _ d e _ e n t r a d a _ c o n _ t i e m p o _ l m i t e |l l a m a d a _ a _ p u n t o _ d e _ e n t r a d a _ c o n d i c i o n a l |l l a m a d a _ a _ p u n t o _ d e _ e n t r a d a _ a s n c r o n a l l a m a d a _ a _ p u n t o _ d e _ e n t r a d a _ c o n _ t i e m p o _ l m i t e: : = s e l e c t i d e n t i f _ p _ e n t r a d a[(t i p o|r a n g o)][(p a r m e t r o{,p a r m e t r o})]; [s e c u e n c i a _ d e _ s e n t e n c i a s] o r d e l a y[u n t i l]e x p r e s i n; [s e c u e n c i a _ d e _ s e n t e n c i a s] e n ds e l e c t; l l a m a d a _ a _ p u n t o _ d e _ e n t r a d a _ c o n d i c i o n a l: : = s e l e c t i d e n t i f _ p _ e n t r a d a[(t i p o|r a n g o)][(p a r m e t r o{,p a r m e t r o})]; [s e c u e n c i a _ d e _ s e n t e n c i a s] e l s e s e c u e n c i a _ d e _ s e n t e n c i a s e n ds e l e c t; l l a m a d a _ a _ p u n t o _ d e _ e n t r a d a _ a s n c r o n a: : = s e l e c t (i d e n t i f _ p _ e n t r a d a[(t i p o|r a n g o)][(p a r m e t r o{,p a r m e t r o})];) |(d e l a y[u n t i l]e x p r e s i n;) [s e c u e n c i a _ d e _ s e n t e n c i a s] t h e na b o r t s e c u e n c i a _ d e _ s e n t e n c i a s e n ds e l e c t;

Tipos de punto de entrada


Como puede apreciarse, hay tres posibles llamadas a puntos de entrada a parte de la simple, stas son: llamada con tiempo lmite, llamada condicional y transferencia asncrona.

Llamada con tiempo lmite


Llama a un punto de entrada que es cancelado si no se produce la aceptacin antes de que finalice un plazo de tiempo. Ejemplo:
s e l e c t
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 98/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

C o n t r o l a d o r . P e t i c i n( M e d i o )( E l e m ) ; o r d e l a y5 0 . 0 ; P u t( " C o n t r o l a d o rd e m a s i a d oo c u p a d o . " ) ; e n ds e l e c t ;

Llamada condicional
Llama a un punto de entrada que es cancelada si no es aceptada inmediatamente, es decir, tiene un tiempo lmite nulo. Ejemplo:
s e l e c t P r o c e s a d o . A v i s o ; e l s e r a i s eE r r o r ; e n ds e l e c t ;

Transferencia asncrona
Proporciona la transferencia asncrona de control cuando se acepte la llamada a un punto de entrada o se cumpla un plazo de tiempo, mientras se est ejecutando una secuencia de sentencias. Es decir, si se acepta la llamada al punto de entrada o cumple el plazo, se abortan las sentencias que se estuvieran ejecutando. Ejemplo:
s e l e c t d e l a y5 . 0 ; r a i s eF u n c i n N o C o n v e r g e ; t h e na b o r t F u n c i n _ r e c u r s i v a( X ,Y ) ; e n ds e l e c t ;

Manual de referencia de Ada


9.7.2 Timed Entry Calls (http://www.adaic.com/standards/95lrm/html/RM-9-7-2.html) 9.7.3 Conditional Entry Calls (http://www.adaic.com/standards/95lrm/html/RM-9-7-3.html) 9.7.4 Asynchronous Transfer of Control (http://www.adaic.com/standards/95lrm/html/RM-9-7-4.html)

Tareas dinmicas
Creacin dinmica de tareas (tipos tareas)
Adems de poder declarar tareas como un simple objeto, se pueden declarar un tipo como tipo tarea. Con ello se consigue poder utilizar otros objetos que utilicen dicho tipo tarea como por ejemplo, un vector de tareas o un puntero a tarea (con lo que se consigue crear tareas dinmicamente). La sintaxis de los tipos tarea es la siguiente:
d e c l a r a c i n _ t i p o _ t a r e a: : = t a s kt y p ei d e n t i f i c a d o r[(d i s c r i m i n a n t e{;d i s c r i m i n a n t e})][i s
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 99/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

{p u n t o _ e n t r a d a _ t a r e a|c l u s u l a _ r e p r e s e n t a c i n} [p r i v a t e{p u n t o _ e n t r a d a _ t a r e a|c l u s u l a _ r e p r e s e n t a c i n}] e n d[i d e n t i f i c a d o r]]; d i s c r i m i n a n t e: : = i d e n t i f i c a d o r{,i d e n t i f i c a d o r}:[a c c e s s]s u b t i p o[: =e x p r e s i n]

Con ello, se define un nuevo tipo. Esta definicin necesita una terminacin, es decir, faltara declarar el cuerpo de la tarea, que se realiza de igual manera que si se hubiera declarado la tarea simplemente. Los tipos tarea son privados limitados. Es decir, un objeto declarado de tipo tarea no es una variable, se comporta como una constante. Por tanto, no se permite la asignacin, igualdad y desigualdad para los tipos tarea. Segn la sintaxis descrita, se puede definir una tarea como un tipo, por ejemplo, de esta manera:
d e c l a r e t a s kt y p eT T a r e a A ; t a s kt y p eT T a r e a B ; t a s kt y p eT T a r e a s M l t i p l e s ; t y p eT V e c t o r T a r e a si sa r r a y( 1 . . 1 0 )o fT T a r e a s M l t i p l e s ; A :T T a r e a A ; B :T T a r e a B ; V :T V e c t o r T a r e a s ; t a s kb o d yT T a r e a Ai s -. . . e n d ; t a s kb o d yT T a r e a Bi s -. . . e n d ; t a s kb o d yT T a r e a s M l t i p l e si s -. . . e n d ; b e g i n -Ap a r t i rd ea q u s ee j e c u t a nl a s1 2t a r e a sc o n c u r r e n t e m e n t e . -. . . e n d ;

En el momento en el que d comienzo la ejecucin del bloque, justo despus de b e g i n , dar comienzo la ejecucin simultnea de las tareas definidas en las distintas variables del tipo t a s k . En este caso TTareaA, TTareaB y 10 TTareasMltiples. Pero esta situacin es esttica, no se pueden lanzar tareas en un determinado instante; para ello, se pueden emplear punteros como, por ejemplo:
p r o c e d u r eE j e m p l o _ t a r e a s _ d i n m i c a si s t a s kt y p eT T a r e a ; t y p eP T T a r e ai sa c c e s sT T a r e a ; T 1 :P T T a r e a ; T 2 :P T T a r e a: =n e wT T a r e a ; -S ec r e al at a r e aT 2 . a l l . b e g i n T 1: =n e wT T a r e a ; -S ec r e al at a r e aT 1 . a l l . T 1: =n u l l ; -S ep i e r d el ar e f e r e n c i a ,p e r os es i g u ee j e c u t a n d o . -. . . e n dE j e m p l o _ t a r e a s _ d i n m i c a s ;

Las tareas creadas con n e wsiguen unas reglas de activacin y dependencia ligeramente diferentes. Estas tareas inician su activacin inmediatamente despus de la evaluacin del asignador de la sentencia n e w . Adems, estas tareas no dependen de la unidad donde se crearon, sino que dependen del bloque, cuerpo de subprograma o cuerpo de tarea que contenga la declaracin del tipo a c c e s sen s. Para referenciar a tareas dinmicas se emplea el nombre de la variable puntero seguido de .a l l , por ejemplo, T1.a l l . Si se quiere que termine una
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 100/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

tarea creada dinmicamente se debe utilizar la sentencia a b o r t . Por ejemplo, a b o r tT1.a l l . Tambin se pueden crear varios ejemplares de un mismo tipo dependiendo de un parmetro denominado discriminante. Por ejemplo:
t a s kt y p eT M a n e j a d o r T e c l a d o( I D :T I D e n t i f T e c l a d o: =I D P o r D e f e c t o )i s e n t r yL e e r( C :o u tC h a r a c t e r ) ; e n t r yE s c r i b i r( C :i n C h a r a c t e r ) ; e n dT M a n e j a d o r T e c l a d o ; t y p eP T M a n e j a d o r T e c l a d oi sa c c e s sT M a n e j a d o r T e c l a d o ; T e r m i n a l :P T M a n e j a d o r T e c l a d o: =n e wT M a n e j a d o r T e c l a d o( 1 0 4 ) ;

Manual de referencia de Ada


9.1 Task Units and Task Objects (http://www.adaic.com/standards/95lrm/html/RM-9-1.html)

Dependencia de tareas
Dependencia de tareas
Las reglas de dependencia de las tareas son: Si la tarea es creada por la elaboracin de una declaracin de objeto, depende de la unidad que incluya dicha elaboracin. Si la tarea es creada por la evaluacin de una sentencia n e wpara un tipo puntero dado, depende de cada unidad que incluya la elaboracin de la declaracin de dicho tipo puntero. Por ejemplo:
d e c l a r e t a s kt y p eT T a r e a ; t y p eP T T a r e a G l o b a li sa c c e s sT T a r e a ; T 1 ,T 2 :T T a r e a ; P u n t e r o T a r e a G l o b a l 1 :P T T a r e a G l o b a l ; b e g i n -S ea c t i v a nT 1yT 2 . d e c l a r e t y p eP T T a r e a L o c a li sa c c e s sT T a r e a ; P u n t e r o T a r e a G l o b a l 2 :P T T a r e a G l o b a l: =n e wT T a r e a ; -S ea c t i v aP u n t e r o T a r e a G l o b a l 2 . a l ld e s p u sd el aa s i g n a c i nn e w . P u n t e r o T a r e a L o c a l :P T T a r e a L o c a l: =n e wT T a r e a ; -S ea c t i v aP u n t e r o T a r e a L o c a l . a l ld e s p u sd el aa s i g n a c i nn e w . T 3 :T T a r e a ; b e g i n -S ea c t i v aT 3 . -. . . e n d ; -S ee s p e r al at e r m i n a c i nd eT 3yP u n t e r o T a r e a L o c a l . a l l . -C o n t i n al ae j e c u c i nd eP u n t e r o T a r e a G l o b a l 2 . a l l . -. . . e n d ; -S ee s p e r al at e r m i n a c i nd eT 1 ,T 2 ,P u n t e r o T a r e a G l o b a l 1 . a l l -yP u n t e r o T a r e a G l o b a l 2 . a l l .

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

101/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Manual de referencia de Ada


9.3 Task Dependence - Termination of Tasks (http://www.adaic.com/standards/95lrm/html/RM-93.html)

Ejemplos de tareas
Ejemplos completos de tareas
Semforos
Una posible implementacin del tipo abstracto semforo es con tareas Ada. Pero este ejemplo no se ha de tomar muy en serio, puesto que es un tpico caso de inversin de la abstraccin, es decir, se hace uso de un mecanismo de alto nivel, las tareas, para implementar uno de bajo nivel, los semforos. En Ada 95 la mejor manera de implementar un semforo es un objeto protegido. Sin embargo a efectos didcticos es un buen ejemplo.

g e n e r i c V a l o r I n i c i a l :N a t u r a l: =1 ; -P a r m .g e n r i c oc o nv a l o rp o rd e f e c t o . p a c k a g eS e m a f o r o si s t y p eT S e m a f o r oi sl i m i t e dp r i v a t e ; p r o c e d u r eW a i t( S e m :i no u tT S e m a f o r o ) ; p r o c e d u r eS i g n a l( S e m :i no u tT S e m a f o r o ) ; p r i v a t e t a s kt y p eT S e m a f o r oi s e n t r yW a i t ; e n t r yS i g n a l ; e n dT S e m a f o r o ; e n dS e m a f o r o s ;

p a c k a g eb o d yS e m a f o r o si s p r o c e d u r eW a i t( S e m :i no u tT S e m a f o r o )i s b e g i n S e m . W a i t ; -L l a m a d aap u n t od ee n t r a d ad el at a r e a . e n dW a i t ; p r o c e d u r eS i g n a l( S e m :i no u tT S e m a f o r o )i s b e g i n S e m . S i g n a l ; -L l a m a d aap u n t od ee n t r a d ad el at a r e a . e n dS i g n a l ; t a s kb o d yT S e m a f o r oi s S :N a t u r a l: =V a l o r I n i c i a l ; -E se lc o n t a d o rd e ls e m f o r o . b e g i n l o o p s e l e c t w h e nS>0= > a c c e p tW a i t ; S: =S-1 ; o r a c c e p tS i g n a l ; S: =S+1 ; o r t e r m i n a t e ; e n ds e l e c t ; e n dl o o p ; e n dT S e m a f o r o ; e n dS e m a f o r o s ;


es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 102/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

w i t hS e m a f o r o s ; p r o c e d u r eP r u e b a _ S e m a f o r o si s p a c k a g eP a q u e t e _ S e m a f o r o si sn e wS e m a f o r o s ; u s eP a q u e t e _ S e m a f o r o s ; S e m a f o r o :T S e m a f o r o ; b e g i n -A q u s ei n i c i al at a r e ad et i p oT S e m a f o r o( o b j e t oS e m a f o r o ) . -. . . W a i t( S e m a f o r o ) ; -. . . S i g n a l( S e m a f o r o ) ; -. . . e n dP r u e b a _ S e m a f o r o s ;

Simulacin de trenes
Problema: Escribe un programa que realice una simulacin de trenes circulando por estaciones. Cada tren espera a que la estacin siguiente est libre para avanzar, es decir, hasta que un tren no ha abandonado una estacin, el tren de la estacin anterior no puede avanzar. Para ello puedes usar los semforos definidos en el ejemplo anterior.

Solucin: Solucin propuesta:

w i t hA d a . T e x t _ I O ;u s eA d a . T e x t _ I O ; w i t hA d a . N u m e r i c s . F l o a t _ R a n d o m ; w i t hS e m a f o r o s ; p r o c e d u r eS i m u l a d o r _ T r e n e si s N u m _ E s t a c i o n e s:c o n s t a n t: =5 ; N u m _ T r e n e s:c o n s t a n t: =3 ; t y p eN u m _ E s t a c i ni sr a n g e1. .N u m _ E s t a c i o n e s ; t y p eN u m _ T r e ni sr a n g e1. .N u m _ T r e n e s ; p a c k a g eN u m _ E s t a c i n _ I Oi sn e wA d a . T e x t _ I O . I n t e g e r _ I O( N u m _ E s t a c i n ) ; u s eN u m _ E s t a c i n _ I O ; p a c k a g eN u m _ T r e n _ I Oi sn e wA d a . T e x t _ I O . I n t e g e r _ I O( N u m _ T r e n ) ; u s eN u m _ T r e n _ I O ; p a c k a g eS e m a f o r o s _ I n i c i a l _ 1i sn e w S e m a f o r o s( V a l o r i n i c i a l= >1 ) ; u s eS e m a f o r o s _ I n i c i a l _ 1 ; S e m a f o r o s _ E s t a c i o n e s:a r r a y( N u m _ E s t a c i n )o fT S e m a f o r o ; t a s kt y p eT r e ni s e n t r yC o m e n z a r( T u _ N u m:i nN u m _ T r e n ) ; e n dT r e n ; L i s t a _ T r e n e s:a r r a y( N u m _ T r e n )o fT r e n ; t a s kb o d yT r e ni s M i _ N u m :N u m _ T r e n ;


es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 103/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

p r o c e d u r eP o n _ N o m b r ei s b e g i n P u t( " T r e nn " ) ;P u t( M i _ N u m ) ;P u t( " :" ) ; e n dP o n _ N o m b r e ; E s p e r a _ E n _ E s t a c i n :c o n s t a n tD u r a t i o n: =5 . 0 ; D u r a c i n _ M n i m a :c o n s t a n tD u r a t i o n: =2 . 0 ; F a c t o r _ D u r a c i n :c o n s t a n tD u r a t i o n: =1 0 . 0 ; A z a r _ G e n :A d a . N u m e r i c s . F l o a t _ R a n d o m . G e n e r a t o r ; A c t u a l ,S i g u i e n t e :N u m _ E s t a c i n ; b e g i n A d a . N u m e r i c s . F l o a t _ R a n d o m . R e s e t( A z a r _ G e n ) ; a c c e p tC o m e n z a r( T u _ N u m:i nN u m _ T r e n )d o M i _ N u m: =T u _ N u m ; e n dC o m e n z a r ; P o n _ N o m b r e ; P u t _ L i n e( " C o m i e n z oe lt r a y e c t o " ) ; A c t u a l: =1 ; l o o p P o n _ N o m b r e ;P u t( " E ne s t a c i n" ) ;P u t( A c t u a l ) ;N e w _ L i n e ; d e l a yE s p e r a _ E n _ E s t a c i n ; i fA c t u a l=N u m _ E s t a c i o n e st h e n S i g u i e n t e: =1 ; e l s e S i g u i e n t e: =A c t u a l+1 ; e n di f ; W a i t( S e m a f o r o s _ E s t a c i o n e s( S i g u i e n t e ) ) ; P o n _ N o m b r e ; P u t( " T r a y e c t oh a c i ae s t a c i n" ) ; P u t( S i g u i e n t e ) ; N e w _ L i n e ; S i g n a l( S e m a f o r o s _ E s t a c i o n e s( A c t u a l ) ) ; d e l a yD u r a t i o n( A d a . N u m e r i c s . F l o a t _ R a n d o m . R a n d o m( A z a r _ G e n ) ) *F a c t o r _ D u r a c i n+D u r a c i n _ M n i m a ; A c t u a l: =S i g u i e n t e ; e n dl o o p ; e n dT r e n ; b e g i n f o rIi nL i s t a _ T r e n e s ' R a n g el o o p L i s t a _ T r e n e s( I ) . C o m e n z a r( T u _ N u m= >I ) ; e n dl o o p ; e n dS i m u l a d o r _ T r e n e s ;

Buffer circular
Otro ejemplo, una posible implementacin de un buffer circular:

g e n e r i c t y p eT E l e m e n t oi sp r i v a t e ; T a m a o :P o s i t i v e: =3 2 ; p a c k a g eB u f f e r _ s e r v i d o ri s t y p eT B u f f e ri sl i m i t e dp r i v a t e ; p r o c e d u r eE s c r i b i r B u f( B :i no u tT B u f f e r ;E :T E l e m e n t o ) ; p r o c e d u r eL e e r B u f( B :i no u tT B u f f e r ;E :o u tT E l e m e n t o ) ;
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 104/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

p r i v a t e t a s kt y p eT B u f f e ri s e n t r yE s c r i b i r( E :T E l e m e n t o ) ; e n t r yL e e r( E :o u tT E l e m e n t o ) ; e n dT B u f f e r ; e n dB u f f e r _ s e r v i d o r ;

p a c k a g eb o d yB u f f e r _ s e r v i d o ri s t a s kb o d yT B u f f e ri s s u b t y p eT C a r d i n a l B u f f e ri sN a t u r a lr a n g e0. .T a m a o ; s u b t y p eT R a n g o B u f f e ri sT C a r d i n a l B u f f e rr a n g e0. .T a m a o-1 ; B u f :a r r a y( T R a n g o B u f f e r )o fT E l e m e n t o ; C i m a ,B a s e :T R a n g o B u f f e r: =0 ; N u m E l e m e n t o s :T C a r d i n a l B u f f e r: =0 ; b e g i n l o o p s e l e c t w h e nN u m E l e m e n t o s<T a m a o= > a c c e p tE s c r i b i r( E :T E l e m e n t o )d o B u f ( C i m a ): =E ; e n dE s c r i b i r ; C i m a: =T R a n g o B u f f e r ( I n t e g e r ( C i m a+1 )m o dT a m a o ) ; N u m E l e m e n t o s: =N u m E l e m e n t o s+1 ; o r w h e nN u m E l e m e n t o s>0= > a c c e p tL e e r( E :o u tT E l e m e n t o )d o E: =B u f ( B a s e ) ; e n dL e e r ; B a s e: =T R a n g o B u f f e r ( I n t e g e r ( B a s e+1 )m o dT a m a o ) ; N u m E l e m e n t o s: =N u m E l e m e n t o s-1 ; o r t e r m i n a t e ; e n ds e l e c t ; e n dl o o p ; e n dT B u f f e r ; p r o c e d u r eE s c r i b i r B u f( B :i no u tT B u f f e r ;E :T E l e m e n t o )i s b e g i n B . E s c r i b i r( E ) ; e n dE s c r i b i r B u f ; p r o c e d u r eL e e r B u f( B :i no u tT B u f f e r ;E :o u tT E l e m e n t o )i s b e g i n B . L e e r( E ) ; e n dL e e r B u f ; e n dB u f f e r _ s e r v i d o r ;

w i t hT e x t _ I O ,B u f f e r _ s e r v i d o r ; u s eT e x t _ I O ; p r o c e d u r eB u f f e ri s C l a v e _ S a l i d a:c o n s t a n tS t r i n g: =" S a l i r " ; t y p eT M e n s a j ei s r e c o r d N u m O r d e n :P o s i t i v e ; C o n t e n i d o :S t r i n g( 1 . . 2 0 ) ; e n dr e c o r d ; p a c k a g eC o l a _ m e n s a j e si sn e wB u f f e r _ s e r v i d o r( T E l e m e n t o= >T M e n s a j e ) ; u s eC o l a _ m e n s a j e s ; C o l a :T B u f f e r ; t a s kE m i s o r ; t a s kR e c e p t o r ; t a s kb o d yE m i s o ri s M :T M e n s a j e: =( N u m O r d e n= >1 ,C o n t e n i d o= >( o t h e r s= >'' ) ) ; l t i m o :N a t u r a l ; b e g i n l o o p P u t( " [ E m i s o r ]M e n s a j e :" ) ; G e t _ L i n e( M . C o n t e n i d o , l t i m o ) ; M . C o n t e n i d o( l t i m o+1. .M . C o n t e n i d o ' L a s t ): =( o t h e r s= >'' ) ; E s c r i b i r B u f( C o l a ,M ) ; M . N u m O r d e n: =M . N u m O r d e n+1 ; e x i tw h e nM . C o n t e n i d o ( C l a v e _ S a l i d a ' r a n g e )=C l a v e _ S a l i d a ;
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 105/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

e n dl o o p ; e n dE m i s o r ; t a s kb o d yR e c e p t o ri s p a c k a g eE n t _ I Oi sn e wT e x t _ I O . I n t e g e r _ I O ( I n t e g e r ) ; u s eE n t _ I O ; M :T M e n s a j e ; b e g i n l o o p L e e r B u f( C o l a ,M ) ; e x i tw h e nM . C o n t e n i d o ( C l a v e _ S a l i d a ' r a n g e )=C l a v e _ S a l i d a ; P u t( " [ R e c e p t o r ]M e n s a j en m e r o" ) ; P u t( M . N u m O r d e n ) ; P u t( " :" ) ; P u t( M . C o n t e n i d o ) ; N e w _ L i n e ; e n dl o o p ; e n dR e c e p t o r ; b e g i n n u l l ; e n dB u f f e r ;

Problema del barbero durmiente


Esta es una solucin al problema del barbero durmiente.

w i t hA d a . T e x t _ I O ;u s eA d a . T e x t _ I O ; w i t hA d a . N u m e r i c s . D i s c r e t e _ R a n d o m ; p r o c e d u r eB a r b e r i ai s t y p eR a n g o _ D e m o r ai sr a n g e1. .3 0 ; t y p eD u r a c i o n _ A f e i t a d oi sr a n g e5. .1 0 ; t y p eN o m b r e _ C l i e n t ei s( J o s e ,J u a n ,I a k i ,A n t o n i o ,C a m i l o ) ; p a c k a g eD e m o r a _ A l _ A z a ri sn e wA d a . N u m e r i c s . D i s c r e t e _ R a n d o m ( R a n g o _ D e m o r a ) ; p a c k a g eA f e i t a d o _ A l _ A z a ri sn e wA d a . N u m e r i c s . D i s c r e t e _ R a n d o m ( D u r a c i o n _ A f e i t a d o ) ; t a s kB a r b e r oi s e n t r yA f e i t a r( C l i e n t e:i nN o m b r e _ C l i e n t e ) ; e n dB a r b e r o ; t a s kt y p eC l i e n t ei s e n t r yC o m e n z a r( N o m b r e:i nN o m b r e _ C l i e n t e ) ; e n dC l i e n t e ; L i s t a _ C l i e n t e s:a r r a y( N o m b r e _ C l i e n t e )o fC l i e n t e ; t a s kb o d yB a r b e r oi s G e n e r a d o r:A f e i t a d o _ A l _ A z a r . G e n e r a t o r ; E s p e r a _ M x i m a _ P o r _ C l i e n t e:c o n s t a n tD u r a t i o n: =3 0 . 0 ; b e g i n A f e i t a d o _ A l _ A z a r . R e s e t( G e n e r a d o r ) ; P u t _ L i n e( " B a r b e r o :A b r ol ab a r b e r a . " ) ; l o o p P u t _ L i n e( " B a r b e r o :M i r os ih a yc l i e n t e . " ) ; s e l e c t a c c e p tA f e i t a r( C l i e n t e:i nN o m b r e _ C l i e n t e )d o P u t _ L i n e( " B a r b e r o :A f e i t a n d oa"&N o m b r e _ C l i e n t e ' I m a g e ( C l i e n t e ) ) ; d e l a yD u r a t i o n( A f e i t a d o _ A l _ A z a r . R a n d o m( G e n e r a d o r ) ) ; P u t _ L i n e( " B a r b e r o :T e r m i n oc o n"&N o m b r e _ C l i e n t e ' I m a g e ( C l i e n t e ) ) ; e n dA f e i t a r ; o r d e l a yE s p e r a _ M x i m a _ P o r _ C l i e n t e ; P u t _ L i n e( " B a r b e r o :P a r e c eq u ey an ov i e n en a d i e , " &"c i e r r ol ab a r b e r a . " ) ; e x i t ; e n ds e l e c t ;
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 106/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

e n dl o o p ; e n dB a r b e r o ; t a s kb o d yC l i e n t ei s G e n e r a d o r:D e m o r a _ A l _ A z a r . G e n e r a t o r ; M i _ N o m b r e:N o m b r e _ C l i e n t e ; b e g i n a c c e p tC o m e n z a r( N o m b r e:i nN o m b r e _ C l i e n t e )d o M i _ N o m b r e: =N o m b r e ; e n dC o m e n z a r ; D e m o r a _ A l _ A z a r . R e s e t( G e n = >G e n e r a d o r , I n i t i a t o r= >N o m b r e _ C l i e n t e ' P o s( M i _ N o m b r e ) ) ; d e l a yD u r a t i o n( D e m o r a _ A l _ A z a r . R a n d o m( G e n e r a d o r ) ) ; P u t _ L i n e( N o m b r e _ C l i e n t e ' I m a g e( M i _ N o m b r e )& " :E n t r oe nl ab a r b e r a . " ) ; B a r b e r o . A f e i t a r( C l i e n t e= >M i _ N o m b r e ) ; P u t _ L i n e( N o m b r e _ C l i e n t e ' I m a g e( M i _ N o m b r e )& " :E s t o ya f e i t a d o ,m em a r c h o . " ) ; e n dC l i e n t e ; b e g i n f o rIi nL i s t a _ C l i e n t e s ' R a n g el o o p L i s t a _ C l i e n t e s( I ) . C o m e n z a r( N o m b r e= >I ) ; e n dl o o p ; e n dB a r b e r i a ;

Problema de los filsofos cenando


Una solucin con tareas y objetos protegidos del conocido problema de los filsofos cenando.

p a c k a g eC u b i e r t o si s t y p eC u b i e r t oi sl i m i t e dp r i v a t e ; p r o c e d u r eC o g e r ( C :i no u tC u b i e r t o ) ; p r o c e d u r eS o l t a r ( C :i no u tC u b i e r t o ) ; p r i v a t e t y p eS t a t u si s( L I B R E ,O C U P A D O ) ; p r o t e c t e dt y p eC u b i e r t o ( E s t a d o _ C u b i e r t o :S t a t u s: =L I B R E )i s Ilustracin del problema e n t r yC o g e r ; filsofos cenando e n t r yS o l t a r ; p r i v a t e E s t a d o :S t a t u s: =E s t a d o _ C u b i e r t o ; e n dC u b i e r t o ; e n dC u b i e r t o s ;

de los

p a c k a g eb o d yC u b i e r t o si s p r o c e d u r eC o g e r( C :i no u tC u b i e r t o )i s b e g i n C . C o g e r ; e n dC o g e r ; p r o c e d u r eS o l t a r( C :i no u tC u b i e r t o )i s b e g i n C . S o l t a r ; e n dS o l t a r ;
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 107/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

p r o t e c t e db o d yC u b i e r t oi s e n t r yC o g e rw h e nE s t a d o=L I B R Ei s b e g i n E s t a d o: =O C U P A D O ; e n dC o g e r ; e n t r yS o l t a rw h e nE s t a d o=O C U P A D Oi s b e g i n E s t a d o: =L I B R E ; e n dS o l t a r ; e n dC u b i e r t o ; e n dC u b i e r t o s ;

w i t hA d a . T e x t _ I O ;u s eA d a . T e x t _ I O ; w i t hA d a . I n t e g e r _ T e x t _ I O ;u s eA d a . I n t e g e r _ T e x t _ I O ; w i t hC u b i e r t o s ;u s eC u b i e r t o s ; p r o c e d u r eP r o b l e m a _ F i l o s o f o si s t y p eP C u b i e r t oi sa c c e s sC u b i e r t o ; t a s kt y p eT F i l o s o f o ( I d :C h a r a c t e r ;C u b i e r t o 1 :P C u b i e r t o ;C u b i e r t o 2 :P C u b i e r t o ) ; t a s kb o d yT F i l o s o f oi s p r o c e d u r eC o m e ri s b e g i n C o g e r ( C u b i e r t o 1 . a l l ) ; C o g e r ( C u b i e r t o 2 . a l l ) ; f o rii n1 . . 1 0l o o p P u t ( I d&" c" ) ; d e l a y1 . 0 ; e n dl o o p ; S o l t a r ( C u b i e r t o 2 . a l l ) ; S o l t a r ( C u b i e r t o 1 . a l l ) ; e n dC o m e r ; P r o c e d u r eP e n s a ri s b e g i n f o rii n1 . . 1 0l o o p P u t ( I d&" p" ) ; d e l a y1 . 0 ; e n dl o o p ; e n dP e n s a r ; b e g i n l o o p C o m e r ; P e n s a r ; e n dl o o p ; e n dT F i l o s o f o ; N u m _ C u b i e r t o s :P o s i t i v e ; b e g i n P u t ( " I n t r o d u c ee ln u m e r od ec u b i e r t o s :" ) ;G e t ( N u m _ C u b i e r t o s ) ;N e w _ l i n e ; d e c l a r e t y p eP T F i l o s o f oi sa c c e s sT F i l o s o f o ; P :P T F i l o s o f o ; C :C h a r a c t e r: =' A ' ; C u b e r t e r i a :a r r a y( 1 . . N u m _ C u b i e r t o s )o fP C u b i e r t o ; b e g i n f o rii n1 . . N u m _ C u b i e r t o sl o o p C u b e r t e r i a ( i ): =n e wC u b i e r t o ; e n dl o o p ; f o rii n1 . . N u m _ C u b i e r t o s 1l o o p P: =n e wT F i l o s o f o ( C ,C u b e r t e r i a ( i ) ,C u b e r t e r i a ( i + 1 ) ) ; C: =C h a r a c t e r ' S u c c ( C ) ; e n dl o o p ; P: =n e wT F i l o s o f o ( C ,C u b e r t e r i a ( 1 ) ,C u b e r t e r i a ( N u m _ C u b i e r t o s ) ) ;
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 108/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

e n d ; e n dP r o b l e m a _ F i l o s o f o s ;

Para evitar el bloqueo mutuo es totalmente imprescindible que al ltimo filsofo se le asignen los cubiertos en ese orden. S se hiciese al contrario, el bloqueo no tardara en aparecer (sobre todo si se eliminan las instrucciones delay):

P: =n e wT F i l o s o f o ( C ,C u b e r t e r i a ( N u m _ C u b i e r t o s ) ,C u b e r t e r i a ( 1 ) ) ;

Chinos: una implementacin concurrente en Ada

-C h i n o s 2 :O t r ai m p l e m e n t a c i nc o n c u r r e n t ee nA d a -T o m sJ a v i e rR o b l e sP r a d o -t j a v i e r @ u s u a r i o s . r e t e c a l . e s -U s o :. / c h i n o s< n u m e r o _ j u g a d o r e s > -E lj u e g oc o n s i s t ee nj u g a rs u c e s i v a sp a r t i d a sal o sc h i n o s .S iu n - j u g a d o ra c i e r t a ,n op a g ayq u e d ae x c l u i d od el a ss i g u i e n t e s - r o n d a s .E l l t i m oq u eq u e d ep a g al o sv i n o s C o p y r i g h t( C )2 0 0 3T .J a v i e rR o b l e sP r a d o T h i sp r o g r a mi sf r e es o f t w a r e ;y o uc a nr e d i s t r i b u t ei ta n d / o rm o d i f y i tu n d e rt h et e r m so ft h eG N UG e n e r a lP u b l i cL i c e n s ea sp u b l i s h e db y t h eF r e eS o f t w a r eF o u n d a t i o n ;e i t h e rv e r s i o n2o ft h eL i c e n s e ,o r ( a ty o u ro p t i o n )a n yl a t e rv e r s i o n . T h i sp r o g r a mi sd i s t r i b u t e di nt h eh o p et h a ti tw i l lb eu s e f u l , b u tW I T H O U TA N YW A R R A N T Y ;w i t h o u te v e nt h ei m p l i e dw a r r a n t yo f M E R C H A N T A B I L I T Yo rF I T N E S SF O RAP A R T I C U L A RP U R P O S E .S e et h e G N UG e n e r a lP u b l i cL i c e n s ef o rm o r ed e t a i l s . Y o us h o u l dh a v er e c e i v e dac o p yo ft h eG N UG e n e r a lP u b l i cL i c e n s e a l o n gw i t ht h i sp r o g r a m ;i fn o t ,w r i t et ot h eF r e eS o f t w a r e F o u n d a t i o n ,I n c . ,5 9T e m p l eP l a c e ,S u i t e3 3 0 ,B o s t o n ,M A0 2 1 1 1 1 3 0 7U S A

w i t hA d a . T e x t _ I O ;u s eA d a . T e x t _ I O ; w i t hA d a . N u m e r i c s . D i s c r e t e _ R a n d o m ; w i t hA d a . C o m m a n d _ L i n e ; w i t hA d a . S t r i n g s . U n b o u n d e d ; w i t hA d a . E x c e p t i o n s ; p r o c e d u r eC h i n o si s -N m e r oM x i m oJ u g a d o r e sq u ep u e d e np a r t i c i p a r( a f o r om x i m od e lb a r ) M A X :c o n s t a n tN a t u r a l: =2 0 ; -P o s i b l e sm e n s a j e sq u er e c i b eu nj u g a d o rt r a su n ap a r t i d a t y p eE s t a d o si s( N O _ S I G U E S _ J U G A N D O ,S I G U E S _ J U G A N D O ,H A S _ P E R D I D O ) ; -S u b t i p oq u em o d e l ae ln m e r od ej u g a d o r e sp o s i b l e s s u b t y p eN u m M a x J u g a d o r e si sN a t u r a lr a n g e0 . . M A X ; -M o d e l al am x i m aa p u e s t aq u ep u e d ed a r s e s u b t y p eM A X _ A P U E S T Ai sN a t u r a lr a n g e0 . . 3 * M A X ; -N o m b r e sp o s i b l e sp a r al o sj u g a d o r e s .E l0s eu t i l i z a r p a r a
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 109/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

- c o n t r o l a re lc a s od eq u en oh a y ag a n a d o re nu n ap a r t i d a s u b t y p eT N o m b r ei sI n t e g e rr a n g e1 . . M A X ; -P a q u e t ep a r aN u m e r o sa l e a t o r i o s : p a c k a g eI n t e g e r _ R a n d o mi sn e wA d a . N u m e r i c s . D i s c r e t e _ R a n d o m ( M A X _ A P U E S T A ) ; -A p u e s t ad ec a d aJ u g a d o r S u b t y p eT A p u e s t ai s I n t e g e rr a n g e1 . . 3 * M A X ; -M a n od ec a d aj u g a d o r s u b t y p eT M a n oi sN a t u r a lr a n g e0 . . 3 ; -F i c h ad ec a d aj u g a d o rq u eg u a r d a r ae la r b i t r o t y p eT F i c h ai sr e c o r d N o m b r e :T N o m b r e ; A p u e s t a :T A p u e s t a: =1 ; M a n o :T M a n o ; S i g u e J u g a n d o:B o o l e a n ; e n dr e c o r d ; -A r r a yd eF i c h a s t y p eT T a b l o ni sa r r a y ( 1 . . M A X )o fT F i c h a ; -S ed e f i n ee lt i p oj u g a d o r t a s kt y p eJ u g a d o r ; t a s k A r b i t r oi s -E l r b i t r oc o n t r o l al a sp a r t i d a sys i n c r o n i z aal o sj u g a d o r e s e n t r yF i j a N u m e r o J u g a d o r e s( N u m:i nN u m M a x J u g a d o r e s ) ; -R e c o g ee la r g u m e n t od el al n e ad ec o m a n d o sp a r as a b e r - c u n t o sj u g a d o r e sv a nap a r t i c i p a r e n t r yA s i g n a N o m b r e( N o m b r e :o u tT N o m b r e ;N u m J u g :o u tN u m M a x J u g a d o r e s ) ; -A s i g n aN o m b r e s( d e1aN u m e r o s J u g a d o r e s )al o sj u g a d o r e sq u e - v a nap a r t i c i p a r .Al o sq u en o ,l e sa s i g n au n1c o m o - i n d i c a c i nd eq u ef i n a l i c e n . e n t r yS i g u e s J u g a n d o ( N o m b r e :i nT N o m b r e ; J u g a d o r S i g u e J u g a n d o:o u tE s t a d o s ; H u b o G a n a d o r:o u tb o o l e a n ) ; -M e n s a j eq u ee n v ae l r b i t r oac a d aj u g a d o rt r a su n a - p a r t i d a ,c o m u n i c n d o l es ih ag a n a d oyd e j ad ej u g a r ,s i - s i g u ej u g a n d oos ih ap e r d i d oyt i e n eq u ep a g a r e n t r yE n v i a A p u e s t a( N o m b r e :i nT N o m b r e;A p u e s t a :i nT A p u e s t a ) ; -E l r b i t r or e c i b el aa p u e s t ad eu nj u g a d o r e n t r yC o n f i r m a A p u e s t a( C o n f i r m a d a:o u tB o o l e a n ) ; -R e s p u e s t ad e l r b i t r os o b r es il aa p u e s t ae sv l i d a( n ol a - h ah e c h oo t r oa n t e s ) e n t r yR e E n v i a A p u e s t a( A p u e s t a :i nT A p u e s t a ) ; -S il aa p u e s t an oe sv l i d as er e e n v i ah a s t aq u el os e a e n t r yE n v i a M a n o( N o m b r e :i nT N o m b r e;M a n o :i nT M a n o ) ; -E lj u g a d o re n v ae ln m e r od em a n o sq u es a c aa l r b i t r o e n dA r b i t r o ;

t a s kb o d yA r b i t r oi s -F u n c i o n e syP r o c e d i m i e n t o s
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 110/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

f u n c t i o nN u m e r o J u g a d o r e sr e t u r nN u m M a x J u g a d o r e si s -D e v u e l v ee ln m e r od ej u g a d o r e s b e g i n r e t u r n5 ; e n dN u m e r o J u g a d o r e s ; f u n c t i o nE s A p u e s t a V a l i d a( A p u e s t a :i nT A p u e s t a ;T a b l o n :i nT T a b l o n ) r e t u r nB o o l e a ni s -D e v u e l v ev e r d a d e r os il aa p u e s t an oh as i d or e a l i z a d a - a n t e sp o ra l g no t r oj u g a d o r V a l i d a:B o o l e a n: =T r u e; I :T N o m b r e: =1 ; b e g i n f o rIi n1 . . M A Xl o o p i fT a b l o n ( I ) . S i g u e J u g a n d ot h e n i fT a b l o n ( I ) . A p u e s t a=A p u e s t a t h e n -Y ae s t d i c h a ,l aa p u e s t aN Oe sv l i d a V a l i d a: =F a l s e; e n di f ; e n di f ; e n dl o o p ; r e t u r nV a l i d a ; e n dE s A p u e s t a V a l i d a ; f u n c t i o nR e s u l t a d o G a n a d o r( T a b l o n :i nT T a b l o n )r e t u r nT A p u e s t ai s -D e v u e l v ee ln m e r od em o n e d a sq u es a c a r o nl o sj u g a d o r e s S u m a:T A p u e s t a: =0; b e g i n f o rIi n1 . . M A Xl o o p i fT a b l o n ( I ) . S i g u e J u g a n d ot h e n S u m a: =S u m a+T a b l o n ( I ) . M a n o; e n di f ; e n dl o o p ; r e t u r nS u m a ; e n dR e s u l t a d o G a n a d o r ; p r o c e d u r eI m p r i m e G a n a d o r( T a b l o n :i nT T a b l o n )i s -I m p r i m e re ln o m b r ed e lg a n a d o r I :T N o m b r e: =1; R e s u l t a d o:T A p u e s t a; T e r m i n a r :B o o l e a n: =F a l s e ; b e g i n R e s u l t a d o: =R e s u l t a d o G a n a d o r ( T a b l o n ) ; w h i l en o tT e r m i n a rl o o p i fT a b l o n ( I ) . A p u e s t a=R e s u l t a d oa n dT a b l o n ( I ) . S i g u e J u g a n d ot h e n P u t _ L i n e ( " H aG a n a d oe lJ u g a d o r"&I ' I m g ) ; T e r m i n a r: =T r u e; e l s e i fI=M A Xt h e n P u t _ L i n e ( " N oh ah a b i d oG a n a d o r " ) ; T e r m i n a r: =T r u e ; e l s e I: = I+1 ; e n di f ; e n di f ; e n dl o o p ; e n dI m p r i m e G a n a d o r ;

f u n c t i o nJ u g a d o r E l i m i n a d o( T a b l o n :i nT T a b l o n )r e t u r nN u m M a x J u g a d o r e si s -D e v u e l v ee lj u g a d o rq u ec u y aa p u e s t as e al ac o r r e c t a R e s u l t a d o:T A p u e s t a ;
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 111/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

G a n a d o r :N u m M a x J u g a d o r e s: =0 ; b e g i n R e s u l t a d o: =R e s u l t a d o G a n a d o r ( T a b l o n ) ; f o rIi n1 . . M A Xl o o p i fT a b l o n ( I ) . S i g u e J u g a n d ot h e n i fR e s u l t a d o= T a b l o n ( I ) . A p u e s t at h e n G a n a d o r: =I; e n di f ; e n di f ; e n dl o o p ; r e t u r nG a n a d o r ; e n dJ u g a d o r E l i m i n a d o ;

p r o c e d u r eI m p r i m e T a b l o n ( T a b l o n :i nT T a b l o n )i s -I m p r i m el a sa p u e s t a sym o n e d a sd el o sj u g a d o r e s b e g i n f o rIi n1 . . M A Xl o o p i fT a b l o n ( I ) . S i g u e J u g a n d ot h e n P u t _ L i n e ( " N o m b r e= "&T a b l o n ( I ) . N o m b r e ' I m g& "|A p u e s t a= "&T a b l o n ( I ) . A p u e s t a ' I m g& "|M a n o= "& T a b l o n ( I ) . M a n o ' I m g) ; e n di f ; e n dl o o p ; P u t _ L i n e ( " R e s u l t a d og a n a d o r :"&R e s u l t a d o G a n a d o r ( T a b l o n ) ' I m g ) ; e n dI m p r i m e T a b l o n ; p r o c e d u r eS e p a r a P a r t i d a s( N u m P a r: i nN a t u r a l ) i s -U ns i m p l es e p a r a d o rp a r aa u m e n t a rl ac l a r i d a d b e g i n N e w _ L i n e ; P u t _ L i n e ( " * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * " ) ; P u t _ L i n e ( " P a r t i d an m e r o"&N u m P a r ' I m g ) ; P u t _ L i n e ( " * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * " ) ; e n dS e p a r a P a r t i d a s ;

-V a r i a b l e s -N m e r od ej u g a d o r e sd el ap a r t i d a N:N u m M a x J u g a d o r e s ; P e r m i t i d o s:N u m M a x J u g a d o r e s ; -P a r t i d aA c t u a l P a r t i d a A c t u a l:N u m M a x J u g a d o r e s ; -T a b l n T a b l o n:T T a b l o n ; N o m b r e A c t u a l:N u m M a x J u g a d o r e s ; A p u e s t a V a l i d a:B o o l e a n ; G a n a d o r:N u m M a x J u g a d o r e s ; N u m e r o P a r t i d a: N a t u r a l ; b e g i n -A v e r i g u an m e r od ej u g a d o r e s a c c e p tF i j a N u m e r o J u g a d o r e s( N u m:i nN u m M a x J u g a d o r e s )d o N: =N u m ; e n dF i j a N u m e r o J u g a d o r e s ; -N o m b r as o l oaa q u e l l o sq u ev a y a naj u g a r ,al o sq u en o ,l o s
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 112/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

- n o m b r ac o m o1 P e r m i t i d o s: =N ; f o rIi n1 . . M A Xl o o p a c c e p tA s i g n a N o m b r e ( N o m b r e :o u tT N o m b r e;N u m J u g :o u tN u m M a x J u g a d o r e s )d o i fP e r m i t i d o s>0t h e n N o m b r e: =I ; N u m J u g: =N ; T a b l o n ( I ) . N o m b r e : =I; T a b l o n ( I ) . S i g u e J u g a n d o : =T r u e ; P e r m i t i d o s: =P e r m i t i d o s-1 ; e l s e N o m b r e: =1 ; T a b l o n ( I ) . N o m b r e: =1 ; T a b l o n ( I ) . S i g u e J u g a n d o: =F a l s e ; e n di f ; e n dA s i g n a N o m b r e ; e n dl o o p ; N u m e r o P a r t i d a: =1 ; w h i l eN/ =1l o o p -P a r as e p a r a rl a sd i f e r e n t e sp a r t i d a s S e p a r a P a r t i d a s ( N u m e r o P a r t i d a ) ; -R e c i b el a sa p u e s t a sd ec a d aj u g a d o r f o rIi n1 . . Nl o o p a c c e p tE n v i a A p u e s t a( N o m b r e :i nT N o m b r e ;A p u e s t a :i nT A p u e s t a )d o N o m b r e A c t u a l: =N o m b r e ; A p u e s t a V a l i d a: =E s A p u e s t a V a l i d a ( A p u e s t a , T a b l o n ) ; i fA p u e s t a V a l i d at h e n T a b l o n ( N o m b r e ) . A p u e s t a: =A p u e s t a; e n di f ; e n dE n v i a A p u e s t a ; -L aA p u e s t ae sV l i d a ,s ec o n f i r m ayao t r ac o s a i fA p u e s t a V a l i d at h e n a c c e p tC o n f i r m a A p u e s t a ( C o n f i r m a d a :o u tB o o l e a n )d o C o n f i r m a d a: =T r u e ; e n dC o n f i r m a A p u e s t a ; e l s e -L aa p u e s t an oe sv l i d a .S ec o m u n i c ae s t oa lj u g a d o rp a r a -q u ee n v eu n an u e v aa p u e s t a a c c e p tC o n f i r m a A p u e s t a ( C o n f i r m a d a :o u tB o o l e a n )d o C o n f i r m a d a: =F a l s e ; e n dC o n f i r m a A p u e s t a ; w h i l en o tA p u e s t a V a l i d al o o p -A c e p t a r d i f e r e n t e sa p u e s t a sh a s t aqs e av l i d a . a c c e p tR e E n v i a A p u e s t a( A p u e s t a :i nT A p u e s t a )d o i fE s A p u e s t a V a l i d a ( A p u e s t a , T a b l o n )t h e n A p u e s t a V a l i d a: =T r u e ; T a b l o n ( N o m b r e A c t u a l ) . A p u e s t a: =A p u e s t a; e n di f ; e n dR e E n v i a A p u e s t a ; a c c e p tC o n f i r m a A p u e s t a ( C o n f i r m a d a :o u tB o o l e a n )d o C o n f i r m a d a: =A p u e s t a V a l i d a ; e n dC o n f i r m a A p u e s t a ; e n dl o o p ; e n di f ; e n dl o o p ; -R e c i b el oqs a c ac a d aj u g a d o r
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 113/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

f o rIi n1 . . Nl o o p a c c e p tE n v i a M a n o ( N o m b r e :i nT N o m b r e ;M a n o :i nT M a n o )d o T a b l o n ( N o m b r e ) . M a n o: =M a n o; e n dE n v i a M a n o ; e n dl o o p ; -I m p r i m e R e s u l t a d o sd el ap a r t i d a I m p r i m e T a b l o n ( T a b l o n ) ; I m p r i m e G a n a d o r ( T a b l o n ) ; -E n v aac a d aj u g a d o rs un u e v oe s t a d o G a n a d o r : =J u g a d o r E l i m i n a d o( T a b l o n ) ; i fG a n a d o r=0t h e n -N a d i ea c e r t f o rIi n1 . . Nl o o p a c c e p tS i g u e s J u g a n d o ( N o m b r e :i nT N o m b r e ; J u g a d o r S i g u e J u g a n d o:o u tE s t a d o s ; H u b o G a n a d o r:o u tb o o l e a n )d o J u g a d o r S i g u e J u g a n d o: =S I G U E S _ J U G A N D O ; T a b l o n ( N o m b r e ) . S i g u e J u g a n d o: =T r u e ; H u b o G a n a d o r: =f a l s e; e n dS i g u e s J u g a n d o ; e n dl o o p ; e l s e -H a yg a n a d o r f o rIi n1 . . Nl o o p a c c e p tS i g u e s J u g a n d o ( N o m b r e :i nT N o m b r e ; J u g a d o r S i g u e J u g a n d o:o u tE s t a d o s ; H u b o G a n a d o r:o u tb o o l e a n )d o H u b o G a n a d o r: =t r u e ; i fN o m b r e=G a n a d o rt h e n J u g a d o r S i g u e J u g a n d o: =N O _ S I G U E S _ J U G A N D O ; T a b l o n ( N o m b r e ) . S i g u e J u g a n d o: =F a l s e ; e l s e i fN/ =2t h e n J u g a d o r S i g u e J u g a n d o: =S I G U E S _ J U G A N D O ; T a b l o n ( N o m b r e ) . S i g u e J u g a n d o: =T r u e ; e l s e J u g a d o r S i g u e J u g a n d o: =H A S _ P E R D I D O ; T a b l o n ( N o m b r e ) . S i g u e J u g a n d o: =F a l s e ; e n di f ; e n di f ; e n dS i g u e s J u g a n d o ; e n dl o o p ; e n di f ; N u m e r o P a r t i d a: =N u m e r o P a r t i d a+1 ; i fG a n a d o r/ =0t h e n N: =N-1 ; e n di f ; e n dl o o p ; e n dA r b i t r o ; t a s kb o d yJ u g a d o ri s M i N o m b r e:T N o m b r e ; N u m J u g :N u m M a x J u g a d o r e s ; A p u e s t a:T A p u e s t a ; A p u e s t a V a l i d a d a:B o o l e a n ; M a n o :T m a n o ; G:I n t e g e r _ R a n d o m . G e n e r a t o r ; Y o S i g o:E s t a d o s ; T e r m i n a r:B o o l e a n: =F a l s e ;
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 114/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

H u b o G a n a d o r:b o o l e a n ; b e g i n A r b i t r o . A s i g n a N o m b r e ( M i N o m b r e ,N u m J u g ) ; -S iM i N o m b r ee s1 ,e n t o n c e st e r m i n as ue j e c u c i n .S es i g u e - e s t em t o d op a r ac e i r n o sal o sj u g a d o r e sq u eq u i e r ee l - u s u a r i o i fM i N o m b r e/ =1t h e n -S e m i l l a sa l e a t o r i a s I n t e g e r _ R a n d o m . R e s e t ( G ) ; w h i l en o tT e r m i n a rl o o p -E n v i aA p u e s t a f o rIi n1 . . M i N o m b r el o o p A p u e s t a: =I n t e g e r _ R a n d o m . R a n d o m ( G )m o d( N u m J u g*3 ) ; e n dl o o p ; A r b i t r o . E n v i a A p u e s t a ( M i N o m b r e ,A p u e s t a ) ; -P r o c e s od ec o n f i r m a c i nd ea p u e s t a A p u e s t a V a l i d a d a: =F a l s e; w h i l en o tA p u e s t a V a l i d a d al o o p A r b i t r o . C o n f i r m a A p u e s t a ( A p u e s t a V a l i d a d a ) ; i fn o tA p u e s t a V a l i d a d at h e n -G e n e r aN u e v aa p u e s t a f o rIi n1 . . M i N o m b r el o o p A p u e s t a: =I n t e g e r _ R a n d o m . R a n d o m ( G )m o d( N u m J u g*3 ); e n dl o o p ; A r b i t r o . R e E n v i a A p u e s t a ( A p u e s t a ) ; e n di f ; e n dl o o p ;

-E n v aM a n o f o rIi n1 . . M i N o m b r el o o p M a n o: =I n t e g e r _ R a n d o m . R a n d o m ( G )m o d4 ; e n dl o o p ; A r b i t r o . E n v i a M a n o ( M i N o m b r e ,M a n o ) ; -C o m p r u e b as ue s t a d o ,s is i g u ej u g a n d o ,s ih ap e r d i d oo - s ih ag a n a d oyd e j ad ej u g a r A r b i t r o . S i g u e s J u g a n d o ( M i N o m b r e ,Y o S i g o ,H u b o G a n a d o r ) ; i fY o S i g o=S I G U E S _ J U G A N D Ot h e n T e r m i n a r: =F a l s e ; e l s e i fY o S i g o=N O _ S I G U E S _ J U G A N D Ot h e n T e r m i n a r: =T r u e ; e l s e -H ap e r d i d o P u t _ L i n e ( " J u g a d o r"&M i N o m b r e ' I m g& " :H ep e r d i d o ,t e n g oq u ep a g a r: _ ( " ) ; e n di f ; e n di f ; i fH u b o G a n a d o rt h e n N u m J u g: =N u m J u g-1 ; e n di f ; e n dl o o p ; e n di f ; e n dJ u g a d o r ; J u g a d o r e s:a r r a y( 1 . . M A X )o fJ u g a d o r ; N u m J u g:N a t u r a l ;
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 115/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

b e g i n i fA d a . C o m m a n d _ L i n e . A r g u m e n t _ C o u n t/ =1t h e n -N m e r oi n c o r r e c t od ep a r m e t r o s P u t _ L i n e ( " U s o :. / c h i n o s< n u m _ j u g a d o r e s > " ) ; N u m J u g: =1 ; e l s e N u m J u g: =I n t e g e r ' V a l u e ( A d a . C o m m a n d _ L i n e . A r g u m e n t ( 1 ) ) ; i fN u m J u g<2t h e n -N m e r om n i m od ej u g a d o r e s P u t _ L i n e ( " E ln m e r od ej u g a d o r e sh ad es e rm a y o rq u e1 . "& N u m J u g ' I m g&"n oe sm a y o rq u e1 " ) ; P u t _ L i n e ( " S e l e c c i o n eu nv a l o rm a y o roi g u a lq u e2 " ) ; N u m J u g: =1 ; e n di f ; i fN u m J u g>M A Xt h e n -N m e r om x i m od ej u g a d o r e s P u t _ L i n e ( N u m J u g ' I m g&"e sm a y o rq u e"&M A X ' I m g ) ; P u t _ L i n e ( " S e l e c c i o n eu nv a l o rm e n o roi g u a lq u e"& M A X ' I m g ) ; N u m J u g: =1 ; e n di f ; e n di f ; A r b i t r o . F i j a N u m e r o J u g a d o r e s ( N u m J u g ) ; -P o rs in o si n t e n t a nc o l a ra l g nv a l o rn ov l i d o e x c e p t i o n w h e nC o n s t r a i n t _ E r r o r= > N u m J u g: =1 ; A r b i t r o . F i j a N u m e r o J u g a d o r e s ( N u m J u g ) ; P u t _ L i n e ( " E lV a l o rI n t r o d u c i d on oe sc o r r e c t o . " ) ; P u t _ L i n e ( " U s o :. / c h i n o s< n u m _ j u g a d o r e s > " ) ; e n dC h i n o s ;

Manual de referencia de Ada


9.11 Example of Tasking and Synchronization (http://adaic.org/standards/95lrm/html/RM-9-11.html)

GLADE: programacin distribuida


Introduccin a GNAT-GLADE
En primer lugar hay que aclarar que el nombre de esta librera puede confundir a los usuarios y programadores de GTK+ y GNOME. Existe una aplicacin muy extendida para el diseo de interfaces grficas que se llama 'Glade'. Un gran nmero de lenguajes de programacin disponen de libreras para poder leer los ficheros de interfaces que genera Glade (C, C++, Ada, Python, Scheme, Ruby, Eiffel, etc). Pues bien, GNAT-GLADE no tiene nada que ver con esta (magnfica ;-) herramienta. GLADE (GNAT Library for Ada Distributed Environments) es una extensin para GNAT, el compilador libre (licenciado bajo GPL) de Ada 95, que permite desarrollar aplicaciones distribuidas basndose en el anexo
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 116/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

del manual de referencia de Ada: Annex E: Distributed Systems (http://www.adaic.com/standards/95lrm/html/RM-E.html) . La base de las aplicaciones distribuidas de Ada 95 son las particiones. Bsicamente una aplicacin distribuida se compone de al menos un par de particiones. Es posible utilizar GNAT-GLADE de dos formas diferentes: Con varias particiones sobre la misma mquina. Con varias particiones sobre diferentes mquinas que formen parte de una red de computadoras. Desde luego resulta mucho ms interesante la segunda de las opciones. Es ms, para desarrollar aplicaciones con varias particiones sobre una misma mquina hay muchos casos en que sera ms conveniente no utilizar GLADE y basarse nicamente en los mecanismos de concurrencia de Ada (las tareas): la aplicacin ser ms eficiente.

Cmo funciona GNAT-GLADE?


Cada una de las particiones de una aplicacin basada en GNAT-GLADE, a la hora de la compilacin se va a convertir en un ejecutable independiente. Cada uno de estos ejecutables sern los que se ejecuten por separado y se comuniquen entre ellos. Existe una herramienta que facilita todo este proceso: g n a t d i s t .
g n a t d i s tlee un fichero

de configuracin en el que se especifica cmo queremos distribuir la aplicacin y genera todos los ejecutables necesarios. De esta forma, es posible probar diferentes formas de distribuir una misma aplicacin simplemente con lanzar g n a t d i s tcon un fichero de configuracin distinto, sin necesidad de modificar el cdigo de la aplicacin.

Lenguaje de configuracin de g n a t d i s t
Las configuraciones de g n a t d i s tse escriben en un lenguaje muy parecido a Ada. Es importante que todas las configuraciones se guarden en ficheros con extensin ".cfg". Para lanzar la compilacin de una aplicacin distribuida con g n a t d i s tnicamente es necesario ejecutar esta herramienta dndole como parmetro el nombre del fichero de configuracin. Por ejemplo:
g n a t d i s tE j e m p l o _ C o n f i g u r a c i o n 1 . c f g

Cmo se escriben las configuraciones?


En cualquier punto de la configuracin es posible usar comentarios, que al igual que en Ada se comienzan con los caracteres -- . Los ficheros de configuracin han de contener un bloque "c o n f i g u r a t i o n ", cuyo nombre ha de coincidir, al igual que en el caso de los paquetes, con el nombre del fichero en el que se encuentra. Es decir:
c o n f i g u r a t i o nE j e m p l o _ C o n f i g u r a c i o n 1i s -C d i g od el ac o n f i g u r a c i n
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 117/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

e n dE j e m p l o _ C o n f i g u r a c i o n 1 ;

Primer ejemplo
El movimiento se aprende andando& as que, vamos a por el primer ejemplo. En este ejemplo vamos a crear una pequea aplicacin compuesta nicamente de dos particiones: La primera de ellas es un servidor de sumas y restas (al ms puro estilo RPC). En l se van a definir dos operaciones: suma y resta, que dados dos nmeros enteros, van a devolver el resultado de aplicar la operacin elegida sobre ambos. La segunda de ellas es un pequeo cliente que efectuar un par de operaciones para comprobar que efectivamente el servidor responde.

calculadora.ads
p a c k a g eC a l c u l a d o r ai s p r a g m aR e m o t e _ C a l l _ I n t e r f a c e ; f u n c t i o nS u m a r ( O p e r a n d o 1 ,O p e r a n d o 2:I n t e g e r )r e t u r nI n t e g e r ; f u n c t i o nR e s t a r( O p e r a n d o 1 ,O p e r a n d o 2:I n t e g e r )r e t u r nI n t e g e r ; e n dC a l c u l a d o r a ;

En esta definicin del paquete llama la atencin la instruccin 'pragma'. Un pragma es simplemente una directiva para el compilador. En concreto, en este ejemplo, el p r a g m aR e m o t e _ C a l l _ I n t e r f a c ehace que se exporte la interfaz del paquete para que otras particiones puedan realizar llamadas a sus funciones, es decir, bsicamente una llamada RPC.

calculadora.adb
p a c k a g eb o d yC a l c u l a d o r ai s f u n c t i o nS u m a r( O p e r a n d o 1 ,O p e r a n d o 2:I n t e g e r )r e t u r nI n t e g e ri s b e g i n r e t u r nO p e r a n d o 1+O p e r a n d o 2 ; e n dS u m a r ; f u n c t i o nR e s t a r( O p e r a n d o 1 ,O p e r a n d o 2:I n t e g e r )r e t u r nI n t e g e ri s b e g i n r e t u r nO p e r a n d o 1-O p e r a n d o 2 ; e n dR e s t a r ; e n dC a l c u l a d o r a ;

Este fichero es nicamente la implementacin de las funciones del paquete calculadora.

cliente.adb
w i t hA d a . T e x t _ I O ; w i t hC a l c u l a d o r a ; u s eA d a . T e x t _ I O ;

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

118/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

p r o c e d u r eC l i e n t ei s b e g i n P u t _ L i n e( " { { { 1 } } } "& I n t e g e r ' I m a g e( C a l c u l a d o r a . S u m a r( 3 2 1 , 1 2 3 ) ) ) ; P u t _ L i n e( " { { { 1 } } } "& I n t e g e r ' I m a g e( C a l c u l a d o r a . R e s t a r( 3 2 1 , 1 2 3 ) ) ) ; e n dC l i e n t e ;

Por ltimo, el cliente. Este programa hace un par de llamadas a los funciones exportadas por el proceso de calculadora. Como se puede ver el cdigo no tiene en cuenta si el proceso calculadora se encuentra corriendo en la misma mquina o en otra. Simplemente realiza llamadas a las funciones de la calculadora. De todo lo dems, que es mucho, ya se ha encargado g n a t d i s ty se encarga Ada.

ejemplo.cfg
c o n f i g u r a t i o ne j e m p l oi s p r a g m aS t a r t e r( A d a ) ; P a r t i c i o n 1:P a r t i t i o n: =( C a l c u l a d o r a ) ; P a r t i c i o n 2:P a r t i t i o n: =( C l i e n t e ) ; p r o c e d u r eC l i e n t ei si nP a r t i c i o n 2 ; e n de j e m p l o ;

Este es el fichero de configuracin/compilacin de g n a t d i s t . El p r a g m aS t a r t e rdescribe como queremos que gnatdist compile el proyecto. Existen tres posibilidades: A d a ,S h e l ly N o n e . En el primero de los casos ser uno de los ejecutables el que lance todos los dems. Mediante S h e l les un shell script el que lanzar los procesos. Con N o n etendremos que lanzarlos a mano o hacer nuestro propio script de arranque. A continuacin se definen las dos particiones que se han utilizado en este ejemplo: una para la calculadora y la segunda para el cliente que le realiza peticiones. Por ltimo se especifica cul es la parte principal (el main). Esta particin, lgicamente, ha de tener un body. Cuidado con los nombres de los ficheros: han de coincidir con el nombre del paquete y adems, han de estar en minsculas. De no ser as g n a t d i s tproducir un error.

Compilacin y ejecucin del programa


Para compilar la aplicacin, como ya hemos visto, simplemente hay que ejecutar g n a t d i s t :
g n a t d i s te j e m p l o . c f g

Si no ha habido ningn problema, se habr producido una salida como esta:


g n a t d i s t :c h e c k i n gc o n f i g u r a t i o nc o n s i s t e n c y -C o n f i g u r a t i o nr e p o r tes.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 119/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

C o n f i g u r a t i o n: N a m e :e j e m p l o M a i n :c l i e n t e S t a r t e r :A d ac o d e P a r t i t i o np a r t i c i o n 1 U n i t s : -c a l c u l a d o r a( r c i ) P a r t i t i o np a r t i c i o n 2 M a i n :c l i e n t e U n i t s : N a m e :e j e m p l o M a i n :c l i e n t e S t a r t e r :A d ac o d e P a r t i t i o np a r t i c i o n 1 U n i t s : -c a l c u l a d o r a( r c i ) P a r t i t i o np a r t i c i o n 2 M a i n :c l i e n t e U n i t s : -c l i e n t e( n o r m a l ) g n a t d i s t :b u i l d i n gc a l c u l a d o r ac a l l e rs t u b sf r o mc a l c u l a d o r a . a d s g n a t d i s t :b u i l d i n gc a l c u l a d o r ar e c e i v e rs t u b sf r o mc a l c u l a d o r a . a d b g n a t d i s t :b u i l d i n gp a r t i t i o np a r t i c i o n 1 g n a t d i s t :b u i l d i n gp a r t i t i o np a r t i c i o n 2 g n a t d i s t :g e n e r a t i n gs t a r t e rc l i e n t e

Nota: las siguientes copias de salidas de comandos son de un sistema GNU/Linux, pero en otro sistemas operativos existir un equivalente. En este momento ya tenemos construidos todos los ejecutables:
l r w x r w x r w x r w x r x r x r w x r x r x 1a l o 1a l o 1a l o a l o a l o a l o 1 0O c t 92 2 : 3 3c l i e n t e>p a r t i c i o n 2 3 6 6 3 8 0 2O c t 92 2 : 3 3p a r t i c i o n 1 3 7 2 3 1 9 3O c t 92 2 : 3 3p a r t i c i o n 2

Como podemos ver, al especificar el P r a g m aS t a r t e r( A d a )en el fichero de configuracin, g n a t d i s tha generado un enlace simblico al ejecutable que va a lanzar los dems. En esta prueba vamos a ejecutar los dos programas en la misma mquina, ms adelante se explicar cmo hacerlo en varias.
$. / c l i e n t e H o s tf o r" p a r t i c i o n 1 " :l o c a l h o s t -C a l c u l a d o r a , c u a n t oe s3 2 1 + 1 2 3 ?= 4 4 4 -C a l c u l a d o r a , c u a n t oe s3 2 1 1 2 3 ?= 1 9 8

Ahora bien, estamos seguros de que se ha ejecutado un programa paralelo? estamos seguros de que en realidad no se ha enlazado el paquete Calculadora en los dos ejecutables? Como podemos ver en los procesos, realmente se han ejecutado los dos programas:
[ . . ]
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 120/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

7 7 0 1p t s / 1 0 8 7 5 3p t s / 1 0 8 7 5 4p t s / 1 0 8 7 5 5p t s / 1 0 8 7 9 3p t s / 1 0 [ . . ] 8 7 8 8? 8 7 9 0? 8 7 9 1? 8 7 9 2? 8 7 9 4?

S S S S S

0 : 0 0 0 : 0 0 0 : 0 0 0 : 0 0 0 : 0 0

\ _b a s h | \ _. / c l i e n t e | \ _. / c l i e n t e | \ _. / c l i e n t e | \ _. / c l i e n t e

S R S S R

0 : 0 0/ h o m e / a l o / p r o g / g l a d e / 1 / p a r t i c i o n 1d e t a c hb o o t _ l o c a t i o nt c p : / / l o c a l h o s t : 0 : 0 0 \ _/ h o m e / a l o / p r o g / g l a d e / 1 / p a r t i c i o n 1d e t a c hb o o t _ l o c a t i o nt c p : / / l o c a l h 0 : 0 0 \ _/ h o m e / a l o / p r o g / g l a d e / 1 / p a r t i c i o n 1d e t a c hb o o t _ l o c a t i o nt c p : / / l o 0 : 0 0 \ _/ h o m e / a l o / p r o g / g l a d e / 1 / p a r t i c i o n 1d e t a c hb o o t _ l o c a t i o nt c p : / / l o 0 : 0 0 \ _/ h o m e / a l o / p r o g / g l a d e / 1 / p a r t i c i o n 1d e t a c hb o o t _ l o c a t i o nt c p : / / l o

Es ms, si examinamos los smbolos de los dos ejecutables podemos ver como la calculadora tiene enlazadas las funciones de suma y resta:
0 8 0 5 0 5 0 0g 0 8 0 5 0 4 f 0g F. t e x t F. t e x t 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 d c a l c u l a d o r a _ _ r e s t a r c a l c u l a d o r a _ _ s u m a r

y el cliente, adems, tiene las funciones que usa g n a t d i s tpara el acceso:


0 8 0 5 0 2 c 0l 0 8 0 5 0 2 e 0l 0 8 0 5 0 3 4 0l 0 8 0 5 0 4 d 0g 0 8 0 5 0 7 9 0l 0 8 0 5 0 7 b 0l 0 8 0 5 0 8 1 0l 0 8 0 5 0 9 a 0g F. t e x t F. t e x t F. t e x t F. t e x t F. t e x t F. t e x t F. t e x t F. t e x t 0 0 0 0 0 0 1 8 0 0 0 0 0 0 5 a 0 0 0 0 0 1 8 a 0 0 0 0 0 2 b f 0 0 0 0 0 0 1 8 0 0 0 0 0 0 5 a 0 0 0 0 0 1 8 a 0 0 0 0 0 2 b f c a l c u l a d o r a _ _ s u m a r _ _ _ c l e a n . 0 c a l c u l a d o r a _ _ s u m a r _ _ _ i n p u t 2 7 _ _ _ r e a d 3 0 . 2 c a l c u l a d o r a _ _ s u m a r _ _ _ i n p u t 2 7 . 1 c a l c u l a d o r a _ _ s u m a r c a l c u l a d o r a _ _ r e s t a r _ _ _ c l e a n . 3 c a l c u l a d o r a _ _ r e s t a r _ _ _ i n p u t 6 7 _ _ _ r e a d 7 0 . 5 c a l c u l a d o r a _ _ r e s t a r _ _ _ i n p u t 6 7 . 4 c a l c u l a d o r a _ _ r e s t a r

Instalacin bajo Debian GNU/Linux


Instalacin de GNAT (compilador de Ada 95) y GLADE para GNAT (extensin para soporte de programacin distribuida). Para realizar la instalacin en el sistema es imprescindible estar identificado como usuario root :
#a p t g e ti n s t a l lg n a tg n a t g l a d e

Instalacin de la documentacin de ambos paquetes. Estos paquetes son opcionales aunque muy recomendables.
#a p t g e ti n s t a l lg n a t g l a d e d o cg n a t d o c

Enlaces externos
Ada: Anexo de sistemas distribuidos. Alejandro Alonso. DIT/UPM. (http://polaris.dit.upm.es/~aalonso/sodt/glade.pdf) RT-GLADE: Implementacin Optimizada para Tiempo Real del Anexo de Sistemas Distribuidos de
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 121/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Ada 95. Universidad de Cantabria (http://www.ctr.unican.es/publications/jlc-jjg-mgh-2004b.pdf) Pgina oficial de la versin pblica de GLADE (http://libre.adacore.com/glade/) Pgina de AdaCore sobre la versin soportada de GLADE (http://www.adacore.com/addons_glade.php) GLADE User Guide (http://labsopa.dis.ulpgc.es/ada/doc_html/glade_ug.html)

Manual de referencia de Ada


Annex E: Distributed Systems (http://www.adaic.com/standards/95lrm/html/RM-E.html)

Autores
Artculo original de Alvaro Lpez Ortega que se puede encontrar en Programacin distribuida con Ada 95 bajo GNU/Linux (I) (http://es.tldp.org/Tutoriales/ADA-Glade/html/) . El autor ha aceptado publicarlo bajo licencia GFDL, ver la autorizacin. Copyright 2001 por Alvaro Lpez Ortega Copyright 2005 por los autores de esta versin. Consulte el historial (//es.wikibooks.org/w/index.php? title=Programaci%C3%B3n_en_Ada_/_GLADE&action=history) .

Unidades predefinidas
El estndar de Ada incluye una serie de unidades predefinidas tiles para muchas tareas comunes de programacin y que ha de proporcionar todo compilador de Ada. Algunas de estas unidades son: Paquete Standard Paquete System Paquete System.Address_To_Access_Conversions Paquete System.Machine_Code Paquete System.RPC Paquete System.Storage_Elements Paquete System.Storage_Pools Paquete Ada Paquete Ada.Command_Line Paquete Ada.Exceptions Paquete Ada.Numerics Paquete Ada.Numerics.Complex_Elementary_Functions - G.1.2 (http://www.adaic.com/standards/95lrm/html/RM-G-1-2.html) Paquete Ada.Numerics.Complex_Types - G.1.1 (http://www.adaic.com/standards/95lrm/html/RM-G-1-1.html) Paquete Ada.Numerics.Discrete_Random - A.5.2
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 122/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

(http://www.adaic.com/standards/95lrm/html/RM-A-5-2.html) Paquete Ada.Numerics.Elementary_Functions - A.5.1 (http://www.adaic.com/standards/95lrm/html/RM-A-5-1.html) Paquete Ada.Numerics.Float_Random - A.5.2 (http://www.adaic.com/standards/95lrm/html/RM-A-5-2.html) Paquete Ada.Numerics.Generic_Complex_Elementary_Functions - G.1.2 (http://www.adaic.com/standards/95lrm/html/RM-G-1-2.html) Paquete Ada.Numerics.Generic_Complex_Types - G.1.1 (http://www.adaic.com/standards/95lrm/html/RM-G-1-1.html) Paquete Ada.Numerics.Generic_Elementary_Functions - A.5.1 (http://www.adaic.com/standards/95lrm/html/RM-A-5-1.html) Paquete Ada.Real_Time Paquete Ada.Strings Paquete Ada.Strings.Fixed Paquete Ada.Strings.Bounded Paquete Ada.Strings.Unbounded Paquete Ada.Text_IO Paquete Ada.Text_IO.Editing Paquete Ada.Float_Text_IO Paquete Ada.Integer_Text_IO Paquete Ada.Sequential_IO Funcin genrica Ada.Unchecked_Conversion Procedimiento genrico Ada.Unchecked_Deallocation Paquete Interfaces Paquete Interfaces.C Paquete Interfaces.C.Strings Paquete Interfaces.C.Pointers Paquete Interfaces.COBOL Paquete Interfaces.Fortran

Manual de refencia de Ada


Annex A: Predefined Language Environment (http://www.adaic.com/standards/95lrm/html/RM-A.html)

Unidades predefinidas. Standard


Paquete Standard
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 123/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

La unidad Standard es un paquete especial que contiene las declaraciones de todos los tipos predefinidos tales como I n t e g e ro B o o l e a n . En trminos de compilacin es como si todas las unidades tuviesen escrito antes de nada:
w i t hS t a n d a r d ;u s eS t a n d a r d ;

Tambin posee un paquete anidado llamado A S C I I , que contiene las constantes que definen los caracteres tales como C R(retorno de carro) o L F(avance de lnea). Escribiendo u s eA S C I I ;se pueden referenciar simplemente como C R . Sin embargo el estndar de Ada 95 no nos recomienda usar el paquete A S C I I (caracteres de 7 bits), porque ste queda obsoleto tras la definicin del paquete A d a . C h a r a c t e r s . L a t i n _ 1 , que define el juego completo de caracteres ISO Latn 1 de 8 bits.

Especificacin
La definicin del paquete Standard segn el manual de referencia de Ada:

p a c k a g eS t a n d a r di s p r a g m aP u r e ( S t a n d a r d ) ; t y p eB o o l e a ni s( F a l s e ,T r u e ) ; -T h ep r e d e f i n e dr e l a t i o n a lo p e r a t o r sf o rt h i st y p ea r ea sf o l l o w s : -f u n c t i o n" = " -f u n c t i o n" / = " -f u n c t i o n" < " -f u n c t i o n" < = " -f u n c t i o n" > " -f u n c t i o n" > = " ( L e f t ,R i g h t:B o o l e a n ' B a s e )r e t u r nB o o l e a n ; ( L e f t ,R i g h t:B o o l e a n ' B a s e )r e t u r nB o o l e a n ; ( L e f t ,R i g h t:B o o l e a n ' B a s e )r e t u r nB o o l e a n ; ( L e f t ,R i g h t:B o o l e a n ' B a s e )r e t u r nB o o l e a n ; ( L e f t ,R i g h t:B o o l e a n ' B a s e )r e t u r nB o o l e a n ; ( L e f t ,R i g h t:B o o l e a n ' B a s e )r e t u r nB o o l e a n ;

-T h ep r e d e f i n e dl o g i c a lo p e r a t o r sa n dt h ep r e d e f i n e dl o g i c a l -n e g a t i o no p e r a t o ra r ea sf o l l o w s : -f u n c t i o n" a n d "( L e f t ,R i g h t:B o o l e a n ' B a s e )r e t u r nB o o l e a n ; -f u n c t i o n" o r " ( L e f t ,R i g h t:B o o l e a n ' B a s e )r e t u r nB o o l e a n ; -f u n c t i o n" x o r "( L e f t ,R i g h t:B o o l e a n ' B a s e )r e t u r nB o o l e a n ; -f u n c t i o n" n o t "( R i g h t:B o o l e a n ' B a s e )r e t u r nB o o l e a n ; -T h ei n t e g e rt y p er o o t _ i n t e g e ri sp r e d e f i n e d . -T h ec o r r e s p o n d i n gu n i v e r s a lt y p ei su n i v e r s a l _ i n t e g e r . t y p eI n t e g e ri sr a n g e' ' i m p l e m e n t a t i o n d e f i n e d ' ' ; s u b t y p eN a t u r a l i sI n t e g e rr a n g e0. .I n t e g e r ' L a s t ; s u b t y p eP o s i t i v ei sI n t e g e rr a n g e1. .I n t e g e r ' L a s t ; -T h ep r e d e f i n e do p e r a t o r sf o rt y p eI n t e g e ra r ea sf o l l o w s : -f u n c t i o n" = " ( L e f t ,R i g h t:I n t e g e r ' B a s e )r e t u r nB o o l e a n ; -f u n c t i o n" / = "( L e f t ,R i g h t:I n t e g e r ' B a s e )r e t u r nB o o l e a n ; -f u n c t i o n" < " ( L e f t ,R i g h t:I n t e g e r ' B a s e )r e t u r nB o o l e a n ; -f u n c t i o n" < = "( L e f t ,R i g h t:I n t e g e r ' B a s e )r e t u r nB o o l e a n ; -f u n c t i o n" > " ( L e f t ,R i g h t:I n t e g e r ' B a s e )r e t u r nB o o l e a n ; -f u n c t i o n" > = "( L e f t ,R i g h t:I n t e g e r ' B a s e )r e t u r nB o o l e a n ; -f u n c t i o n" + " ( R i g h t:I n t e g e r ' B a s e )r e t u r nI n t e g e r ' B a s e ; -f u n c t i o n" " ( R i g h t:I n t e g e r ' B a s e )r e t u r nI n t e g e r ' B a s e ; -f u n c t i o n" a b s "( R i g h t:I n t e g e r ' B a s e )r e t u r nI n t e g e r ' B a s e ; -f u n c t i o n" + " -f u n c t i o n" " ( L e f t ,R i g h t:I n t e g e r ' B a s e )r e t u r nI n t e g e r ' B a s e ; ( L e f t ,R i g h t:I n t e g e r ' B a s e )r e t u r nI n t e g e r ' B a s e ;
124/147

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

11/09/12

Programacin en Ada/Texto completo - Wikilibros

-f u n c t i o n" * " ( L e f t ,R i g h t:I n t e g e r ' B a s e )r e t u r nI n t e g e r ' B a s e ; -f u n c t i o n" / " ( L e f t ,R i g h t:I n t e g e r ' B a s e )r e t u r nI n t e g e r ' B a s e ; -f u n c t i o n" r e m "( L e f t ,R i g h t:I n t e g e r ' B a s e )r e t u r nI n t e g e r ' B a s e ; -f u n c t i o n" m o d "( L e f t ,R i g h t:I n t e g e r ' B a s e )r e t u r nI n t e g e r ' B a s e ; -f u n c t i o n" * * " ( L e f t:I n t e g e r ' B a s e ;R i g h t:N a t u r a l ) r e t u r nI n t e g e r ' B a s e ; -T h es p e c i f i c a t i o no fe a c ho p e r a t o rf o rt h et y p e -r o o t _ i n t e g e r ,o rf o ra n ya d d i t i o n a lp r e d e f i n e di n t e g e r -t y p e ,i so b t a i n e db yr e p l a c i n gI n t e g e rb yt h en a m eo ft h et y p e -i nt h es p e c i f i c a t i o no ft h ec o r r e s p o n d i n go p e r a t o ro ft h et y p e -I n t e g e r .T h er i g h to p e r a n do ft h ee x p o n e n t i a t i o no p e r a t o r -r e m a i n sa ss u b t y p eN a t u r a l . -T h ef l o a t i n gp o i n tt y p er o o t _ r e a li sp r e d e f i n e d . -T h ec o r r e s p o n d i n gu n i v e r s a lt y p ei su n i v e r s a l _ r e a l . t y p eF l o a ti sd i g i t s' ' i m p l e m e n t a t i o n d e f i n e d ' ' ; -T h ep r e d e f i n e do p e r a t o r sf o rt h i st y p ea r ea sf o l l o w s : -f u n c t i o n" = " -f u n c t i o n" / = " -f u n c t i o n" < " -f u n c t i o n" < = " -f u n c t i o n" > " -f u n c t i o n" > = " ( L e f t ,R i g h t:F l o a t )r e t u r nB o o l e a n ; ( L e f t ,R i g h t:F l o a t )r e t u r nB o o l e a n ; ( L e f t ,R i g h t:F l o a t )r e t u r nB o o l e a n ; ( L e f t ,R i g h t:F l o a t )r e t u r nB o o l e a n ; ( L e f t ,R i g h t:F l o a t )r e t u r nB o o l e a n ; ( L e f t ,R i g h t:F l o a t )r e t u r nB o o l e a n ;

-f u n c t i o n" + " ( R i g h t:F l o a t )r e t u r nF l o a t ; -f u n c t i o n" " ( R i g h t:F l o a t )r e t u r nF l o a t ; -f u n c t i o n" a b s "( R i g h t:F l o a t )r e t u r nF l o a t ; -f u n c t i o n" + " -f u n c t i o n" " -f u n c t i o n" * " -f u n c t i o n" / " ( L e f t ,R i g h t:F l o a t )r e t u r nF l o a t ; ( L e f t ,R i g h t:F l o a t )r e t u r nF l o a t ; ( L e f t ,R i g h t:F l o a t )r e t u r nF l o a t ; ( L e f t ,R i g h t:F l o a t )r e t u r nF l o a t ;

-f u n c t i o n" * * " ( L e f t:F l o a t ;R i g h t:I n t e g e r ' B a s e )r e t u r nF l o a t ; -T h es p e c i f i c a t i o no fe a c ho p e r a t o rf o rt h et y p er o o t _ r e a l ,o rf o r -a n ya d d i t i o n a lp r e d e f i n e df l o a t i n gp o i n tt y p e ,i so b t a i n e db y -r e p l a c i n gF l o a tb yt h en a m eo ft h et y p ei nt h es p e c i f i c a t i o no ft h e -c o r r e s p o n d i n go p e r a t o ro ft h et y p eF l o a t . -I na d d i t i o n ,t h ef o l l o w i n go p e r a t o r sa r ep r e d e f i n e df o rt h er o o t -n u m e r i ct y p e s : f u n c t i o n" * "( L e f t:r o o t _ i n t e g e r ;R i g h t:r o o t _ r e a l ) r e t u r nr o o t _ r e a l ; f u n c t i o n" * "( L e f t:r o o t _ r e a l ; r e t u r nr o o t _ r e a l ; f u n c t i o n" / "( L e f t:r o o t _ r e a l ; r e t u r nr o o t _ r e a l ; R i g h t:r o o t _ i n t e g e r ) R i g h t:r o o t _ i n t e g e r )

-T h et y p eu n i v e r s a l _ f i x e di sp r e d e f i n e d . -T h eo n l ym u l t i p l y i n go p e r a t o r sd e f i n e db e t w e e n -f i x e dp o i n tt y p e sa r e f u n c t i o n" * "( L e f t:u n i v e r s a l _ f i x e d ;R i g h t:u n i v e r s a l _ f i x e d ) r e t u r nu n i v e r s a l _ f i x e d ; f u n c t i o n" / "( L e f t:u n i v e r s a l _ f i x e d ;R i g h t:u n i v e r s a l _ f i x e d ) r e t u r nu n i v e r s a l _ f i x e d ; -T h ed e c l a r a t i o no ft y p eC h a r a c t e ri sb a s e do nt h es t a n d a r dI S O8 8 5 9 1c h a r a c t e rs e t . -T h e r ea r en oc h a r a c t e rl i t e r a l sc o r r e s p o n d i n gt ot h ep o s i t i o n sf o rc o n t r o lc h a r a c t e r s . -T h e ya r ei n d i c a t e di ni t a l i c si nt h i sd e f i n i t i o n .S e e3 . 5 . 2 . t y p eC h a r a c t e ri s ( n u l , s o h , s t x , b s , h t , l f , d l e , d c 1 , d c 2 , e t x , v t , d c 3 , e o t , f f , d c 4 , e n q , c r , n a k , a c k , s o , s y n , b e l , s i , e t b , 0( 1 6 # 0 0 # ). .7( 1 6 # 0 7 # ) 8( 1 6 # 0 8 # ). .1 5( 1 6 # 0 F # ) 1 6( 1 6 # 1 0 # ). .2 3( 1 6 # 1 7 # )


125/147

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

11/09/12

Programacin en Ada/Texto completo - Wikilibros

c a n , '' , ' ( ' , ' 0 ' , ' 8 ' , ' @ ' , ' H ' , ' P ' , ' X ' , ' ` ' , ' h ' , ' p ' , ' x ' ,

e m , ' ! ' , ' ) ' , ' 1 ' , ' 9 ' , ' A ' , ' I ' , ' Q ' , ' Y ' , ' a ' , ' i ' , ' q ' , ' y ' ,

s u b , ' " ' , ' * ' , ' 2 ' , ' : ' , ' B ' , ' J ' , ' R ' , ' Z ' , ' b ' , ' j ' , ' r ' , ' z ' ,

e s c , ' # ' , ' + ' , ' 3 ' , ' ; ' , ' C ' , ' K ' , ' S ' , ' [ ' , ' c ' , ' k ' , ' s ' , ' { ' ,

f s , ' $ ' , ' , ' , ' 4 ' , ' < ' , ' D ' , ' L ' , ' T ' , ' \ ' , ' d ' , ' l ' , ' t ' , ' | ' , b p h , e s a , p l u , c c h , c s i , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' ,

g s , ' % ' , ' ' , ' 5 ' , ' = ' , ' E ' , ' M ' , ' U ' , ' ] ' , ' e ' , ' m ' , ' u ' , ' } ' , n b h , r i , m w ,

r s , ' & ' , ' . ' , ' 6 ' , ' > ' , ' F ' , ' N ' , ' V ' , ' ^ ' , ' f ' , ' n ' , ' v ' , ' ~ ' ,

u s , ' ' ' , ' / ' , ' 7 ' , ' ? ' , ' G ' , ' O ' , ' W ' , ' _ ' , ' g ' , ' o ' , ' w ' , d e l ,

2 4( 1 6 # 1 8 # ). .3 1( 1 6 # 1 F # ) 3 2( 1 6 # 2 0 # ). .3 9( 1 6 # 2 7 # )" 4 0( 1 6 # 2 8 # ). .4 7( 1 6 # 2 F # ) 4 8( 1 6 # 3 0 # ). .5 5( 1 6 # 3 7 # ) 5 6( 1 6 # 3 8 # ). .6 3( 1 6 # 3 F # ) 6 4( 1 6 # 4 0 # ). .7 1( 1 6 # 4 7 # ) 7 2( 1 6 # 4 8 # ). .7 9( 1 6 # 4 F # ) 8 0( 1 6 # 5 0 # ). .8 7( 1 6 # 5 7 # ) 8 8( 1 6 # 5 8 # ). .9 5( 1 6 # 5 F # ) 9 6( 1 6 # 6 0 # ). .1 0 3( 1 6 # 6 7 # ) 1 0 4( 1 6 # 6 8 # ). .1 1 1( 1 6 # 6 F # ) 1 1 2( 1 6 # 7 0 # ). .1 1 9( 1 6 # 7 7 # ) 1 2 0( 1 6 # 7 8 # ). .1 2 7( 1 6 # 7 F # ) 1 2 8( 1 6 # 8 0 # ). .1 3 1( 1 6 # 8 3 # ) 1 3 2( 1 6 # 8 4 # ). .1 3 5( 1 6 # 8 7 # ) 1 3 6( 1 6 # 8 8 # ). .1 4 3( 1 6 # 8 F # ) 1 4 4( 1 6 # 9 0 # ). .1 5 1( 1 6 # 9 7 # ) 1 5 2( 1 6 # 9 8 # ). .1 5 5( 1 6 # 9 B # ) 1 5 6( 1 6 # 9 C # ). .1 5 9( 1 6 # 9 F # )

r e s e r v e d _ 1 2 8 , r e s e r v e d _ 1 3 2 , h t s , h t j , d c s , s o s , s t , '' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' ,

r e s e r v e d _ 1 2 9 , n e l , s s a , v t s , p l d ,

s s 2 , s p a ,

s s 3 , e p a ,

p u 1 , p u 2 , s t s , r e s e r v e d _ 1 5 3 , s c i , o s c , p m , a p c , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' ,

' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' ,

' ' , ' ' , 1 6 0( 1 6 # A 0 # ). .1 6 7( 1 6 # A 7 # ) ' ' , ' ' , 1 6 8( 1 6 # A 8 # ). .1 7 5( 1 6 # A F # ) ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , 1 7 6( 1 6 # B 0 # ). .1 8 3( 1 6 # B 7 # ) 1 8 4( 1 6 # B 8 # ). .1 9 1( 1 6 # B F # ) 1 9 2( 1 6 # C 0 # ). .1 9 9( 1 6 # C 7 # ) 2 0 0( 1 6 # C 8 # ). .2 0 7( 1 6 # C F # ) 2 0 8( 1 6 # D 0 # ). .2 1 5( 1 6 # D 7 # ) 2 1 6( 1 6 # D 8 # ). .2 2 3( 1 6 # D F # ) 2 2 4( 1 6 # E 0 # ). .2 3 1( 1 6 # E 7 # ) 2 3 2( 1 6 # E 8 # ). .2 3 9( 1 6 # E F # ) 2 4 0( 1 6 # F 0 # ). .2 4 7( 1 6 # F 7 # ) 2 4 8( 1 6 # F 8 # ). .2 5 5( 1 6 # F F # )

-T h ep r e d e f i n e do p e r a t o r sf o rt h et y p eC h a r a c t e ra r et h es a m ea sf o r -a n ye n u m e r a t i o nt y p e . -T h ed e c l a r a t i o no ft y p eW i d e _ C h a r a c t e ri sb a s e do nt h es t a n d a r dI S O1 0 6 4 6B M Pc h a r a c t e rs e t . -T h ef i r s t2 5 6p o s i t i o n sh a v et h es a m ec o n t e n t sa st y p eC h a r a c t e r .S e e3 . 5 . 2 . t y p eW i d e _ C h a r a c t e ri s( n u l ,s o h. . .F F F E ,F F F F ) ; p a c k a g eA S C I Ii s. . .e n dA S C I I ; O b s o l e s c e n t ;s e eJ . 5 -P r e d e f i n e ds t r i n gt y p e s : t y p eS t r i n gi sa r r a y ( P o s i t i v er a n g e< > )o fC h a r a c t e r ; p r a g m aP a c k ( S t r i n g ) ; -T h ep r e d e f i n e do p e r a t o r sf o rt h i st y p ea r ea sf o l l o w s : f u n c t i o n" = " ( L e f t ,R i g h t :S t r i n g )r e t u r nB o o l e a n ; f u n c t i o n" / = "( L e f t ,R i g h t :S t r i n g )r e t u r nB o o l e a n ; f u n c t i o n" < " ( L e f t ,R i g h t :S t r i n g )r e t u r nB o o l e a n ; f u n c t i o n" < = "( L e f t ,R i g h t :S t r i n g )r e t u r nB o o l e a n ; f u n c t i o n" > " ( L e f t ,R i g h t :S t r i n g )r e t u r nB o o l e a n ; f u n c t i o n" > = "( L e f t ,R i g h t :S t r i n g )r e t u r nB o o l e a n ; f u n c t i o n" & "( L e f t :S t r i n g ; R i g h t :S t r i n g ) r e t u r nS t r i n g ; f u n c t i o n" & "( L e f t :C h a r a c t e r ;R i g h t :S t r i n g ) r e t u r nS t r i n g ; f u n c t i o n" & "( L e f t :S t r i n g ; R i g h t :C h a r a c t e r )r e t u r nS t r i n g ; f u n c t i o n" & "( L e f t :C h a r a c t e r ;R i g h t :C h a r a c t e r )r e t u r nS t r i n g ;

t y p eW i d e _ S t r i n gi sa r r a y ( P o s i t i v er a n g e< > )o fW i d e _ C h a r a c t e r ;
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 126/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

p r a g m aP a c k ( W i d e _ S t r i n g ) ; -T h ep r e d e f i n e do p e r a t o r sf o rt h i st y p ec o r r e s p o n dt ot h o s ef o rS t r i n g t y p eD u r a t i o ni sd e l t a' ' i m p l e m e n t a t i o n d e f i n e d ' 'r a n g e' ' i m p l e m e n t a t i o n d e f i n e d ' ' ; -T h ep r e d e f i n e do p e r a t o r sf o rt h et y p eD u r a t i o na r et h es a m ea sf o r -a n yf i x e dp o i n tt y p e . -T h ep r e d e f i n e de x c e p t i o n s : C o n s t r a i n t _ E r r o r :e x c e p t i o n ; P r o g r a m _ E r r o r :e x c e p t i o n ; S t o r a g e _ E r r o r :e x c e p t i o n ; T a s k i n g _ E r r o r :e x c e p t i o n ; e n dS t a n d a r d ;

Manual de referencia de Ada


A.1 The Package Standard (http://www.adaic.com/standards/95lrm/html/RM-A-1.html) J.5 ASCII (http://www.adaic.com/standards/95lrm/html/RM-J-5.html) A.3.3 The Package Characters.Latin_1 (http://www.adaic.com/standards/95lrm/html/RM-A-3-3.html)

Unidades predefinidas. Ada.Exceptions


Informacin sobre la excepcin
Ada proporciona informacin sobre una determinada excepcin en un objeto del tipo Exception_Ocurrence, definido dentro del paquete predefinido Ada.Exceptions. junto con otras funciones que toman como parmetro una ocurrencia de excepcin. Exception_Name: devuelve el nombre del tipo de la excepcin en notacin de puntos completa en letra mayscula, por ejemplo "PILA.ERROR". Exception_Message: devuelve un mensaje de una lnea con la causa y la ubicacin de la excepcin. No contiene el nombre de la excepcin. Exception_Information: devuelve una cadena que incluye el nombre de la excepcin, la causa y la ubicacin y debera proporcionar detalles de la traza de la excepcin. Para comunicar dicha ocurrencia, se emplea la siguiente notacin, por ejemplo:
w i t hA d a . E x c e p t i o n s ;u s eA d a . E x c e p t i o n s ; -. . . e x c e p t i o n w h e nE v e n t o :P r e s i n E l e v a d a|T e m p e r a t u r a E l e v a d a= > P u t( " E x c e p c i n :" ) ; P u t( E x c e p t i o n _ N a m e ( E v e n t o ) ) ; N e w _ L i n e ; w h e nE v e n t o :o t h e r s= > P u t( " E x c e p c i nn op r e v i s t a :" ) ; P u t( E x c e p t i o n _ N a m e ( E v e n t o ) ) ;
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 127/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

N e w _ L i n e ; P u t( E x c e p t i o n _ M e s s a g e ( E v e n t o ) ) ; e n d ;

En ocasiones puede resultar til almacenar una ocurrencia. Por ejemplo, sera til crear un registro de las excepciones producidas en la ejecucin de un programa almacenndolas en una lista o vector de ocurrencias. Ntese que el tipo Exception_Occurrence es limitado, de modo que no puede ser asignado para ser guardado. Por esta razn Ada.Exceptions proporciona el procedimiento y la funcin Save_Ocurrence. El tipo Exception_Id puede entenderse como un tipo enumeracin. Toda excepcin declarada mediante la palabra reservada e x c e p t i o npuede ser considerada como uno de los literales del tipo Exception_Id y, por lo tanto, tiene asociado una identificacin, que es el literal correspondiente. Ntese que se refiere ahora a excepciones y a ocurrencias de las mismas. Los literales aludidos seran referencias a Constraint_Error, TemperaturaElevada, etc.; en general, las excepciones predefinidas y las declaradas. Cada una de ellas es en rigor uno de los valores que puede tomar el tipo Exception_Id. El atributo Identity proporciona la identificacin de una excepcin. Por ejemplo:
d e c l a r e F a l l o _ V l v u l a :e x c e p t i o n ; I d :A d a . E x c e p t i o n s . E x c e p t i o n _ I d ; b e g i n -. . . I d: =F a l l o _ V l v u l a ' I d e n t i t y ; -. . . e n d ;

El programador puede establecer su propio mensaje para una ocurrencia concreta elevndola mediante Raise_Exception en lugar de hacerlo con r a i s eseguido del nombre de la excepcin. Por ejemplo:
d e c l a r e F a l l o _ V l v u l a:e x c e p t i o n ; b e g i n -. . . R a i s e _ E x c e p t i o n( F a l l o _ V l v u l a ' I d e n t i t y ," E r r o rd ea p e r t u r a " ) ; -. . . R a i s e _ E x c e p t i o n( F a l l o _ V l v u l a ' I d e n t i t y ," E r r o rd ec i e r r e " ) ; -. . . e x c e p t i o n w h e nE v e n t o :F a l l o _ V l v u l a= > P u t ( E x c e p t i o n _ M e s s a g e ( E v e n t o ) ) ; e n d ;

Esta llamada es equivalente en Ada 2005 a la siguiente sentencia:


r a i s eF a l l o _ V l v u l aw i t h" E r r o rd ea p e r t u r a " ;

Especificacin de Ada.Exceptions
Segn el manual de referencia de Ada el paquete Ada.Exceptions debe tener esta especificacin:
p a c k a g eA d a . E x c e p t i o n si s t y p eE x c e p t i o n _ I di sp r i v a t e ; N u l l _ I d:c o n s t a n tE x c e p t i o n _ I d ; f u n c t i o nE x c e p t i o n _ N a m e ( I d:E x c e p t i o n _ I d )r e t u r nS t r i n g ;
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 128/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

t y p eE x c e p t i o n _ O c c u r r e n c ei sl i m i t e dp r i v a t e ; t y p eE x c e p t i o n _ O c c u r r e n c e _ A c c e s si sa c c e s sa l lE x c e p t i o n _ O c c u r r e n c e ; N u l l _ O c c u r r e n c e:c o n s t a n tE x c e p t i o n _ O c c u r r e n c e ; p r o c e d u r eR a i s e _ E x c e p t i o n ( E:i nE x c e p t i o n _ I d ; M e s s a g e:i nS t r i n g: =" " ) ; f u n c t i o nE x c e p t i o n _ M e s s a g e ( X:E x c e p t i o n _ O c c u r r e n c e )r e t u r nS t r i n g ; p r o c e d u r eR e r a i s e _ O c c u r r e n c e ( X:i nE x c e p t i o n _ O c c u r r e n c e ) ; f u n c t i o nE x c e p t i o n _ I d e n t i t y ( X:E x c e p t i o n _ O c c u r r e n c e ) r e t u r nE x c e p t i o n _ I d ; f u n c t i o nE x c e p t i o n _ N a m e ( X:E x c e p t i o n _ O c c u r r e n c e )r e t u r nS t r i n g ; -S a m ea sE x c e p t i o n _ N a m e ( E x c e p t i o n _ I d e n t i t y ( X ) ) . f u n c t i o nE x c e p t i o n _ I n f o r m a t i o n ( X:E x c e p t i o n _ O c c u r r e n c e )r e t u r nS t r i n g ; p r o c e d u r eS a v e _ O c c u r r e n c e ( T a r g e t:o u tE x c e p t i o n _ O c c u r r e n c e ; S o u r c e:i nE x c e p t i o n _ O c c u r r e n c e ) ; f u n c t i o nS a v e _ O c c u r r e n c e ( S o u r c e:E x c e p t i o n _ O c c u r r e n c e ) r e t u r nE x c e p t i o n _ O c c u r r e n c e _ A c c e s s ; p r i v a t e . . .-n o ts p e c i f i e db yt h el a n g u a g e e n dA d a . E x c e p t i o n s ;

Manual de referencia de Ada


11.4.1 The Package Exceptions (http://www.adaic.com/standards/95lrm/html/RM-11-4-1.html)

Unidades predefinidas. Ada.Strings.Fixed


Ada.Strings.Fixed proporciona subprogramas para la transformacin y el manejo de strings de tamao fijo.

Ejemplo
p a c k a g eF e c h a si s t y p eF e c h ai s r e c o r d D i a:P o s i t i v er a n g e1. .3 1 ; M e s:P o s i t i v er a n g e1. .1 2 ; A o:P o s i t i v er a n g e1. .3 0 0 0 ; e n dr e c o r d ; s u b t y p eS t r i n g _ F e c h ai sS t r i n g( 1 . . 1 0 ) ; -P a s al af e c h aas t r i n ge nf o r m a t o" d d m m a a a a " . f u n c t i o nI m a g e n( F :F e c h a )r e t u r nS t r i n g _ F e c h a ; e n dF e c h a s ;

w i t hA d a . S t r i n g s . F i x e d ; u s eA d a . S t r i n g s . F i x e d ; u s eA d a . S t r i n g s ; p a c k a g eb o d yF e c h a si s f u n c t i o nI m a g e n( F :F e c h a )r e t u r nS t r i n g _ f e c h ai s
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 129/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

p r o c e d u r eM o v e r _ I m a g e n _ P o s i t i v e( N :P o s i t i v e ;S :i no u tS t r i n g )i s b e g i n -M o v ec o p i au ns t r i n ge no t r od eo t r ot a m a o ,a a d i e n d ou n -p a d d i n go p c i o n a l m e n t e .T r i me l i m i n al o sb l a n c o sai z q u i e r d ao -d e r e c h a( e ne s t ec a s oe lb l a n c oq u ep o n ee l' I m a g e ) . M o v e ( S o u r c e = >T r i m( P o s i t i v e ' I m a g e( N ) ,L e f t ) , T a r g e t = >S , J u s t i f y= >R i g h t , P a d = >' 0 ' ) ; e n dM o v e r _ I m a g e n _ P o s i t i v e ; S _ F e c h a:S t r i n g _ F e c h a ; b e g i n M o v e r _ I m a g e n _ P o s i t i v e( F . D i a ,S _ F e c h a( 1 . . 2 ) ) ; S _ F e c h a( 3 ): =' ' ; M o v e r _ I m a g e n _ P o s i t i v e( F . M e s ,S _ F e c h a( 4 . . 5 ) ) ; S _ F e c h a( 6 ): =' ' ; M o v e r _ I m a g e n _ P o s i t i v e( F . A o ,S _ F e c h a( 7 . . 1 0 ) ) ; r e t u r nS _ F e c h a ; e n dI m a g e n ; e n dF e c h a s ;

Especificacin
Segn el manual de referencia de Ada, la especificacin de este paquete ha de ser la siguiente:
w i t hA d a . S t r i n g s . M a p s ; p a c k a g eA d a . S t r i n g s . F i x e di s p r a g m aP r e e l a b o r a t e ( F i x e d ) ; -" C o p y "p r o c e d u r ef o rs t r i n g so fp o s s i b l yd i f f e r e n tl e n g t h s p r o c e d u r eM o v e( S o u r c e :i n S t r i n g ; T a r g e t :o u tS t r i n g ; D r o p :i n T r u n c a t i o n: =E r r o r ; J u s t i f y:i n A l i g n m e n t : =L e f t ; P a d :i n C h a r a c t e r : =S p a c e ) ; -S e a r c hs u b p r o g r a m s f u n c t i o nI n d e x( S o u r c e P a t t e r n G o i n g M a p p i n g r e t u r nN a t u r a l ; f u n c t i o nI n d e x( S o u r c e P a t t e r n G o i n g M a p p i n g r e t u r nN a t u r a l ; :i nS t r i n g ; :i nS t r i n g ; :i nD i r e c t i o n: =F o r w a r d ; :i nM a p s . C h a r a c t e r _ M a p p i n g _ F u n c t i o n ) :i nS t r i n g ; :i nS t r i n g ; :i nD i r e c t i o n: =F o r w a r d ; :i nM a p s . C h a r a c t e r _ M a p p i n g : =M a p s . I d e n t i t y )

f u n c t i o nI n d e x( S o u r c e:i nS t r i n g ; S e t :i nM a p s . C h a r a c t e r _ S e t ; T e s t :i nM e m b e r s h i p: =I n s i d e ; G o i n g :i nD i r e c t i o n : =F o r w a r d ) r e t u r nN a t u r a l ;
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 130/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

f u n c t i o nI n d e x _ N o n _ B l a n k( S o u r c e:i nS t r i n g ; G o i n g :i nD i r e c t i o n: =F o r w a r d ) r e t u r nN a t u r a l ; f u n c t i o nC o u n t( S o u r c e :i nS t r i n g ; P a t t e r n :i nS t r i n g ; M a p p i n g :i nM a p s . C h a r a c t e r _ M a p p i n g : =M a p s . I d e n t i t y ) r e t u r nN a t u r a l ; f u n c t i o nC o u n t( S o u r c e :i nS t r i n g ; P a t t e r n :i nS t r i n g ; M a p p i n g :i nM a p s . C h a r a c t e r _ M a p p i n g _ F u n c t i o n ) r e t u r nN a t u r a l ; f u n c t i o nC o u n t( S o u r c e S e t r e t u r nN a t u r a l ; :i nS t r i n g ; :i nM a p s . C h a r a c t e r _ S e t )

p r o c e d u r eF i n d _ T o k e n( S o u r c e:i nS t r i n g ; S e t :i nM a p s . C h a r a c t e r _ S e t ; T e s t :i nM e m b e r s h i p ; F i r s t :o u tP o s i t i v e ; L a s t :o u tN a t u r a l ) ; -S t r i n gt r a n s l a t i o ns u b p r o g r a m s f u n c t i o nT r a n s l a t e( S o u r c e :i nS t r i n g ; M a p p i n g:i nM a p s . C h a r a c t e r _ M a p p i n g ) r e t u r nS t r i n g ; p r o c e d u r eT r a n s l a t e( S o u r c e :i no u tS t r i n g ; M a p p i n g:i nM a p s . C h a r a c t e r _ M a p p i n g ) ; f u n c t i o nT r a n s l a t e( S o u r c e :i nS t r i n g ; M a p p i n g:i nM a p s . C h a r a c t e r _ M a p p i n g _ F u n c t i o n ) r e t u r nS t r i n g ; p r o c e d u r eT r a n s l a t e( S o u r c e :i no u tS t r i n g ; M a p p i n g:i nM a p s . C h a r a c t e r _ M a p p i n g _ F u n c t i o n ) ; -S t r i n gt r a n s f o r m a t i o ns u b p r o g r a m s f u n c t i o nR e p l a c e _ S l i c e( S o u r c e L o w H i g h B y r e t u r nS t r i n g ; p r o c e d u r eR e p l a c e _ S l i c e( S o u r c e L o w H i g h B y D r o p J u s t i f y P a d :i nS t r i n g ; :i nP o s i t i v e ; :i nN a t u r a l ; :i nS t r i n g )

:i no u tS t r i n g ; :i nP o s i t i v e ; :i nN a t u r a l ; :i nS t r i n g ; :i nT r u n c a t i o n: =E r r o r ; :i nA l i g n m e n t : =L e f t ; :i nC h a r a c t e r : =S p a c e ) ;

f u n c t i o nI n s e r t( S o u r c e :i nS t r i n g ; B e f o r e :i nP o s i t i v e ; N e w _ I t e m:i nS t r i n g ) r e t u r nS t r i n g ; p r o c e d u r eI n s e r t( S o u r c e :i no u tS t r i n g ; B e f o r e :i nP o s i t i v e ; N e w _ I t e m:i nS t r i n g ; D r o p :i nT r u n c a t i o n: =E r r o r ) ; f u n c t i o nO v e r w r i t e( S o u r c e :i nS t r i n g ;
131/147

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

11/09/12

Programacin en Ada/Texto completo - Wikilibros

P o s i t i o n:i nP o s i t i v e ; N e w _ I t e m:i nS t r i n g ) r e t u r nS t r i n g ; p r o c e d u r eO v e r w r i t e( S o u r c e :i no u tS t r i n g ; P o s i t i o n:i nP o s i t i v e ; N e w _ I t e m:i nS t r i n g ; D r o p :i nT r u n c a t i o n: =R i g h t ) ; f u n c t i o nD e l e t e( S o u r c e :i nS t r i n g ; F r o m :i nP o s i t i v e ; T h r o u g h:i nN a t u r a l ) r e t u r nS t r i n g ; p r o c e d u r eD e l e t e( S o u r c e :i no u tS t r i n g ; F r o m :i nP o s i t i v e ; T h r o u g h:i nN a t u r a l ; J u s t i f y:i nA l i g n m e n t: =L e f t ; P a d :i nC h a r a c t e r: =S p a c e ) ; -S t r i n gs e l e c t o rs u b p r o g r a m s f u n c t i o nT r i m( S o u r c e:i nS t r i n g ; S i d e :i nT r i m _ E n d ) r e t u r nS t r i n g ; p r o c e d u r eT r i m( S o u r c e :i no u tS t r i n g ; S i d e :i nT r i m _ E n d ; J u s t i f y:i nA l i g n m e n t: =L e f t ; P a d :i nC h a r a c t e r: =S p a c e ) ; f u n c t i o nT r i m( S o u r c e:i nS t r i n g ; L e f t :i nM a p s . C h a r a c t e r _ S e t ; R i g h t :i nM a p s . C h a r a c t e r _ S e t ) r e t u r nS t r i n g ; p r o c e d u r eT r i m( S o u r c e :i no u tS t r i n g ; L e f t :i nM a p s . C h a r a c t e r _ S e t ; R i g h t :i nM a p s . C h a r a c t e r _ S e t ; J u s t i f y:i nA l i g n m e n t: =S t r i n g s . L e f t ; P a d :i nC h a r a c t e r: =S p a c e ) ; f u n c t i o nH e a d( S o u r c e:i nS t r i n g ; C o u n t :i nN a t u r a l ; P a d :i nC h a r a c t e r: =S p a c e ) r e t u r nS t r i n g ; p r o c e d u r eH e a d( S o u r c e :i no u tS t r i n g ; C o u n t :i nN a t u r a l ; J u s t i f y:i nA l i g n m e n t: =L e f t ; P a d :i nC h a r a c t e r: =S p a c e ) ; f u n c t i o nT a i l( S o u r c e:i nS t r i n g ; C o u n t :i nN a t u r a l ; P a d :i nC h a r a c t e r: =S p a c e ) r e t u r nS t r i n g ; p r o c e d u r eT a i l( S o u r c e :i no u tS t r i n g ; C o u n t :i nN a t u r a l ; J u s t i f y:i nA l i g n m e n t: =L e f t ; P a d :i nC h a r a c t e r: =S p a c e ) ; -S t r i n gc o n s t r u c t o rf u n c t i o n s f u n c t i o n" * "( L e f t :i nN a t u r a l ; R i g h t:i nC h a r a c t e r )r e t u r nS t r i n g ; f u n c t i o n" * "( L e f t :i nN a t u r a l ; R i g h t:i nS t r i n g )r e t u r nS t r i n g ;

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

132/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

e n dA d a . S t r i n g s . F i x e d ;

Manual de refencia de Ada


A.4.3 Fixed-Length String Handling (http://www.adaic.com/standards/95lrm/html/RM-A-4-3.html)

Unidades predefinidas. Ada.Text_IO


A d a . T e x t _ I Oes un paquete predefinido

para la entrada y salida de texto.

Tiene procedimientos Get y Put para strings y caracteres; y varios paquetes genricos anidados para la entrada/salida de otros tipos en formato texto: Decimal_IO, Enumeration_IO, Fixed_IO, Float_IO, Integer_IO y Modular_IO.

Ejemplo de E/S por consola


w i t hA d a . T e x t _ I O ; w i t hA d a . C h a r a c t e r s . H a n d l i n g ; -L e ed ee n t r a d au nn m e r oe n t e r on od e j a n d oa lu s u a r i oe s c r i b i r -c a r a c t e r e sq u en os e a nd g i t o s .E s t av e r s i ns l of u n c i o n a -c o r r e c t a m e n t ee nW i n d o w s .P a r aq u ef u n c i o n ee nL i n u xyo t r o s -s i s t e m a sU n i x ,h a yq u ec a m b i a rl o sv a l o r e sd eI n t r oyB a c k . p r o c e d u r eL e e r _ E n t e r oi s -P a r aL i n u xc a m b i a rp o rA S C I I . L F I n t r o:c o n s t a n tC h a r a c t e r: =A S C I I . C R ; -P a r aL i n u xc a m b i a rp o rA S C I I . D e l B a c k:c o n s t a n tC h a r a c t e r: =A S C I I . B S ; C h a r:C h a r a c t e r ; F i n:B o o l e a n: =F a l s e ; N m e r o:N a t u r a l: =0 ; -C a d e n ap a r al e e re ln m e r oc a r c t e rac a r c t e r -E lm x i m od ec a r a c t e r e se sI n t e g e r ' W i d t h-1p o r q u en ol e e m o ss i g n o C a d e n a _ N m e r o:S t r i n g( 1. .I n t e g e r ' W i d t h-1 ) ; b e g i n A d a . T e x t _ I O . P u t( " E s c r i b au nn m e r oyp u l s eE n t e r :" ) ; w h i l en o tF i nl o o p A d a . T e x t _ I O . G e t _ I m m e d i a t e( C h a r ) ; i fA d a . C h a r a c t e r s . H a n d l i n g . I s _ D i g i t( C h a r )t h e n N m e r o: =N m e r o+1 ; C a d e n a _ n m e r o ( N m e r o ): =C h a r ; A d a . T e x t _ I O . P u t( C h a r ) ; e l s i fC h a r=I n t r ot h e n F i n: =T r u e ; e l s i fN m e r o > 0a n dC h a r=B a c kt h e n -S ie lu s u a r i oh ap u l s a d ol at e c l ab a c k s p a c e -b o r r ae ld g i t oe s c r i t oa n t e r i o r m e n t e A d a . T e x t _ I O . P u t( A S C I I . B S&''&A S C I I . B S ) ; N m e r o : = N m e r o 1 ; e n di f ;
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 133/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

e n dl o o p ; N m e r o: =I n t e g e r ' V a l u e( C a d e n a _ N m e r o( 1. .N m e r o ) ) ; A d a . T e x t _ I O . N e w _ l i n e ; A d a . T e x t _ I O . P u t _ L i n e( " H a se s c r i t o : "&I n t e g e r ' I m a g e( N m e r o ) ) ; e x c e p t i o n w h e nC o n s t r a i n t _ E r r o r= > A d a . T e x t _ I O . N e w _ l i n e ; A d a . T e x t _ I O . P u t _ L i n e( " L os i e n t o :"&C a d e n a _ N m e r o& "e sd e m a s i a d ol a r g op a r aa l m a c e n a r s e " ) ; e n dL e e r _ E n t e r o ;

Ficheros de texto
A d a . T e x t _ I Otambin permite el acceso

y modificacin de ficheros de texto de forma secuencial.

La mayora de funciones de Ada.Text_IO estn disponibles para ser usadas con ficheros de texto. Para eso, se usan variables de tipo F i l e _ t y p e , necesarias para especificar a qu archivo acceder. Muchas de las funciones conocidas para consola de A d a . T e x t _ I Ose pueden usar en archivos de texto pasando por parmetro una variable de tipo F i l e _ t y p e . Algunas funciones y procedimientos para el manejo de ficheros con A d a . T e x t _ I O : Open(F,Modo,Ruta) Permite abrir un fichero. Si el fichero no existe, devuelve una excepcin 'Name_error'. 'F' es una variable F i l e _ t y p e , 'Ruta' es la ruta del sistema donde se localiza el fichero y 'Modo' especifica como abrir el fichero: 'In_file' significa lectura, 'Out_file' significa escritura (borrando lo anterior) y 'Append_file' significa escritura empezando desde el final. Para acceder a este archivo, lo haremos a travs de la variable F i l e _ t y p e'F'. Create(F,Modo,Ruta) Crea un fichero en la ruta del sistema elegida. Si no existe, se crea, y si existe, se sobreescribe. Los parmetros son los mismos que en 'Open', pero por defecto el modo es 'Out_file' (si creas un archivo, suele ser para escribir en l). Para acceder a este archivo, lo haremos a travs de la variable F i l e _ t y p e 'F'. Close(F) Cierra el archivo referido por la variable 'F'. Es necesario hacer esto cuando dejemos de leer o escribir en un fichero. Get(F,C) Lee un carcter de un fichero, siendo F una variable F i l e _ t y p ey 'C' una variable c h a r a c t e r . Para leer se debe haber hecho un 'Open' previamente. Put(F,C) Escribe un carcter en un fichero, siendo F una variable F i l e _ t y p ey 'C' una variable C h a r a c t e r . Para escribir se debe haber hecho un 'Open' en modo escritura o un 'Create' previamente. End_of_file(F) Esta funcin devuelve 'True' (boolean) si hemos llegado al final del fichero y 'False' si quedan elementos por leer. Es importante saber usar esta funcin, ya que si intentamos leer un elemento del fichero habiendo llegado al final de ste, saltar la excepcin 'End_Error'. End_of_line(F) Esta funcin devuelve 'True' (boolean) si hemos llegado al final de la linea actual y 'False' si quedan elementos por leer. Reset(F)
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 134/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Reinicia el cursor; para saber que elemento estamos leyendo, se guarda un cursor con la posicin del elemento actual; esta operacin lo reinicia, como si cerrsemos el fichero y lo volvisemos a abrir. Para encontrar la lista completa de operaciones sobre ficheros de A d a . T e x t _ I O , se puede ver en el manual de referencia: A.10.1 Text_IO (http://www.adaic.com/standards/95lrm/html/RM-A-10-1.html) .

Ejemplo de E/S por fichero


w i t hA d a . C o m m a n d _ L i n e , A d a . T e x t _ I o ; u s eA d a . C o m m a n d _ L i n e , A d a . T e x t _ I o ; p r o c e d u r eV i s o r _ t e x t oi s -L e ed eu nf i c h e r od et e x t oc u y ar u t as ep a s ap o rp a r m e t r oos ep r e g u n t a -e x p l c i t a m e n t e ,ys ev i s u a l i z ap o rp a n t a l l a ,t o m a n d oc o m o' e s t a n d a r d 'u n ac o n s o l a -d e2 4l n e a sd el a r g oy8 0c a r a c t e r e sd ea n c h o C a r a c t e r e s _ P o r _ L i n e a:c o n s t a n tN a t u r a l : =7 9 ; L i n e a s _ P o r _ P a n t a l l a :c o n s t a n tN a t u r a l : =2 4 ; F : F i l e _ T y p e ; L i n e a : S t r i n g( 1. .C a r a c t e r e s _ P o r _ L i n e a ) ; I n d i c e : N a t u r a l ; C o n t a d o r : N a t u r a l : =0 ; p r o c e d u r eE s p e r a r _ T e c l a i s C:C h a r a c t e r ; b e g i n G e t _ I m m e d i a t e ( C ) ; e n dE s p e r a r _ T e c l a ; b e g i n i fA r g u m e n t _ C o u n t > 0t h e n -S ih a yp a r a m e t r o s ,u s a m o se lp r i m e r oc o m or u t ad e la r c h i v o O p e n ( F , I n _ F i l e , A r g u m e n t ( 1 ) ) ; e l s e -S in oh a yp a r m e t r o s ,p r e g u n t a m o se x p l c i t a m e n t el ar u t ad e la r c h i v o P u t _ L i n e ( " I n t r o d u z c al ar u t ad e la r c h i v oaa b r i r :" ) ; G e t _ L i n e ( L i n e a , I n d i c e ) ; O p e n ( F , I n _ F i l e , L i n e a ( 1 . . I n d i c e ) ) ; N e w _ L i n e ( 3 ) ; e n di f ; P u t _ L i n e ( " " ) ; P u t _ L i n e ( " -V i s o rd et e x t o-"&N a m e ( F ) ) ; P u t _ L i n e ( " " ) ; -L af u n c i nN a m e ( )n o sd e v u e l v el ar u t ad e la r c h i v o N e w _ L i n e ( 2 ) ; w h i l en o tE n d _ O f _ F i l e ( F )l o o p -L e e m o sh a s t al l e g a ra lf i n a ld e lf i c h e r o -S il l e g a m o sa lf i n a lei n t e n t a m o sl e e r ,d a r e r r o r ,p o rl oq u eh a yq u ep r e v e n i r l o i fC o n t a d o r > = L i n e a s _ P o r _ P a n t a l l a 2t h e n N e w _ L i n e ; P u t _ L i n e ( " -P r e s i o n eu n at e c l ap a r ac o n t i n u a r " ) ; E s p e r a r _ T e c l a ; N e w _ L i n e ; C o n t a d o r : = 0 ; e n di f; -L e e m o su n al i n e ad e s d ee la r c h i v o ,t o m a n d os ul o n g i t u de n' I n d i c e ' -yg u a r d a n d ol al i n e ae nu ns t r i n g G e t _ L i n e ( F , L i n e a , I n d i c e ) ; -V i s u a l i z a m o sl al i n e ao b t e n i d ap o rp a n t a l l a ,p e r os o l oh a s t al al o n g i t u do b t e n i d a P u t _ L i n e ( L i n e a ( 1 . . I n d i c e ) ) ; C o n t a d o r : = C o n t a d o r + 1 ; e n dl o o p;
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 135/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

C l o s e ( F ) ; -C o n t r o l a m o sp o s i b l e se r r o r e sq u ep u e d eh a b e rc o nf i c h e r o s e x c e p t i o n w h e nN a m e _ E r r o r = > N e w _ l i n e ( 2 ) ; P u t _ L i n e ( " * * * *E r r o r* * * * " ) ; P u t _ L i n e ( " N o m b r ed ea r c h i v on ov a l i d o " ) ; w h e nU s e _ E r r o r = > N e w _ l i n e ( 2 ) ; P u t _ L i n e ( " * * * *E r r o r* * * * " ) ; P u t _ L i n e ( " A r c h i v oy aa b i e r t ooi n a c c e s i b l e " ) ; e n dV i s o r _ t e x t o ;

Portabilidad
Un programa hecho en Ada usando la librera Ada.Text_IO debera poderse compilar sin problemas (si no se usan libreras propias del sistema) tanto en sistemas Windows como en sistemas Unix (incluyendo GNU/Linux) . Sin embargo, puede que su funcionamiento no sea igual en ambos sistemas si no se tienen en cuenta ciertas diferencias en sus consolas. Por ejemplo, todos los sistemas Unix soportan el estndar de terminal ANSI, mientras que en Windows ME, NT, 2000 y XP la consola no es compatible con ANSI (aunque es posible configurarlo cargando el driver ANSI.SYS). Adems el salto de linea es diferente en Unix y en Windows: en sistemas Unix consta de un carcter y en Windows de dos. A la hora de programar, has de tener en cuentas algunas diferencias: El salto de lnea en sistemas Unix es ASCII.LF. En Windows es ASCII.LF & ASCII.CR. Sin embargo usando Get_Line, End_Of_Line y Put_Line se asegura portabilidad en este aspecto. Algunas funciones de Ada.Text_IO no funcionan correctamente en Windows, como el procedimiento New_Page. Get_immediate(C,B) tambin puede dar problemas con algunas teclas en Linux. El carcter de control asociado a ciertas teclas puede variar entre Unix y Windows. Por tanto si tu programa intenta detectar pulsaciones de teclas especficas, como 'Enter', etc. debers adecuar el carcter con el que se identifica la tecla. Algunos ejemplos:
I n t r o :c h a r a c t e r : = A S C I I . C r ; -W i n d o w s I n t r o :c h a r a c t e r : = A S C I I . L f ; -U n i x

B a c k s p a c e :c h a r a c t e r : = A S C I I . B s ; -W i n d o w s( t e c l ad eb o r r a r ) B a c k s p a c e :c h a r a c t e r : = A S C I I . D e l ; -U n i x

Debes tener esto en cuenta si deseas hacer portable tu programa, y que funcione tanto en Unix como en Windows. Por lo tanto recomendamos que pruebes la aplicacin en ambos sistemas si es posible, para asegurar su buen funcionamiento. Si deseas ms funciones para la consola, y ver sus diferentes implementaciones en Linux y Windows, puedes mirar el paquete Pantalla_ansi (http://www.ctr.unican.es/asignaturas/lan/pantalla_ansi.html) .

Manual de referencia de Ada


A.10.1 The Package Text_IO (http://www.adaic.com/standards/95lrm/html/RM-A-10-1.html)

Unidades predefinidas. Ada.Text_IO.Editing


es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 136/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

A d a . T e x t _ I O . E d i t i n ges un paquete predefinido

para la entrada y salida de tipos de coma fija en formato

monetario. Ejemplo:
w i t hA d a . T e x t _ I O . E d i t i n g ; p r o c e d u r eE j e m p l o _ E u r o si s t y p eT _ P r e c i o _ E n _ E u r o si sd e l t a0 . 0 1d i g i t s6 ; p a c k a g eE u r o s _ I Oi sn e wA d a . T e x t _ I O . E d i t i n g . D e c i m a l _ O u t p u t ( N u m = >T _ P r e c i o _ E n _ E u r o s , D e f a u l t _ C u r r e n c y = >" E U R" , D e f a u l t _ F i l l = >'' , D e f a u l t _ S e p a r a t o r = >' . ' , D e f a u l t _ R a d i x _ M a r k= >' , ' ) ; U n _ P r e c i o:c o n s t a n tT _ P r e c i o _ E n _ E u r o s: =5 8 7 3 . 2 6 ; b e g i n A d a . T e x t _ I O . P u t _ L i n e ( E u r o s _ I O . I m a g e ( I t e m= >U n _ P r e c i o , P i c = >A d a . T e x t _ I O . E d i t i n g . T o _ P i c t u r e ( " # _ # # # _ # # # _ # # 9 . 9 9 " ) ) ) ; e n dE j e m p l o _ E u r o s ;

La salida es:
E U R5 . 8 7 3 , 2 6

Manual de referencia de Ada


F.3.3 The Package Text_IO.Editing (http://www.adaic.com/standards/95lrm/html/RM-F-3-3.html)

Unidades predefinidas. Ada.Sequential_IO


A d a . S e q u e n t i a l _ I Oes un paquete predefinido

de la biblioteca estndar para el manejo de entrada y salida de ficheros secuenciales, esto es, ficheros en los que se leen o escriben los datos uno detrs de otro.

Instanciacin
Para ser usado, el paquete A d a . S e q u e n t i a l _ I Odebe ser instanciado con el tipo a usar, es decir se debe especificar qu elemento debe leer/escribir: un entero, un carcter, un booleano, o un tipo definido por nosotros. Para ello, usaremos la clusula with. A continuacin procedemos a instanciar el paquete de la siguiente forma
p a c k a g eN o m b r ei sn e wA d a . S e q u e n t i a l _ I O ( T i p o ) ;

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

137/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Ahora podremos usar la clusula use.


u s eN o m b r e

O bien ponerlo como prefijo a todas las operaciones y tipos de A d a . S e q u e n t i a l _ I O


N o m b r e . O p e n ( F , N o m b r e . I n _ f i l e , " a r c h i v o . d a t " ) ;

Si se hacen varias instanciaciones de A d a . S e q u e n t i a l _ I Oa diferentes tipos, ser necesario usar el nombre del paquete que hemos puesto como prefijo
p a c k a g eP k g _ i n t e g e ri sn e wA d a . S e q u e n t i a l _ I O ( I n t e g e r ) p a c k a g eP k g _ c h a r a c t e ri sn e wA d a . S e q u e n t i a l _ I O ( C h a r a c t e r ) ; ; F :P k g _ i n t e g e r . F i l e _ t y p e ; G :P k g _ c h a r a c t e r . F i l e _ t y p e ;

Funciones y procedimientos ms comunes


Open(F,Modo,Ruta) Permite abrir un fichero. Si el fichero no existe, devuelve una excepcin 'Name_error'. 'F' es una variable F i l e _ t y p e , 'Ruta' es la ruta del sistema donde se localiza el fichero y 'Modo' especifica como abrir el fichero: 'In_file' significa lectura, 'Out_file' significa escritura (borrando lo anterior) y 'Append_file' significa escritura empezando desde el final. Para acceder a este archivo, lo haremos a travs de la variable F i l e _ t y p e'F'. Create(F,Modo,Ruta) Crea un fichero en la ruta del sistema elegida. Si no existe, se crea, y si existe, se sobreescribe. Los parmetros son los mismos que en 'Open', pero por defecto el modo es 'Out_file' (si creas un archivo, suele ser para escribir en l). Para acceder a este archivo, lo haremos a travs de la variable F i l e _ t y p e 'F'. Close(F) Cierra el archivo referido por la variable 'F'. Es necesario hacer esto cuando dejemos de leer o escribir en un fichero. Read(F,X) Lee de un fichero una variable 'X' del tipo instanciado, siendo F una variable File_type . Para leer se debe haber hecho un 'Open' previamente. Write(F,X) Escribe en un fichero una variable 'X' del tipo instanciado, siendo siendo F una variable File_type. Para escribir se debe haber hecho un 'Open' en modo escritura o un 'Create' previamente. End_of_file(F) Esta funcin devuelve 'True' (boolean) si hemos llegado al final del fichero y 'False' si quedan elementos por leer. Es importante saber usar esta funcin, ya que si intentamos leer un elemento del fichero habiendo llegado al final de ste, saltar la excepcin 'End_Error'. Reset(F) Reinicia el cursor; para saber que elemento estamos leyendo, se guarda un cursor con la posicin del elemento actual; esta operacin lo reinicia, como si cerrsemos el fichero y lo volvisemos a abrir. La lista completa de operaciones de A d a . S e q u e n t i a l _ I O , se encuentra en el manual de referencia: A.8.1 The
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 138/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Package Sequential_IO (http://www.adaic.com/standards/95lrm/html/RM-A-8-1.html) .

Excepciones ms frecuentes
Estas son algunas de las excepciones que pueden aparecer: 1. End_Error: Hemos intentado leer un fichero cuando ste estaba vaco o si hemos llegado al final de l. Para prevenirlo, hay que usar la funcin End_of_file 2. Name_Error: La ruta con la que hemos abierto un fichero es incorrecta, y el archivo no existe. 3. Use_Error: Se suele dar cuando el archivo al que intentamos acceder ya est abierto por otro programa, o hemos hecho dos Open de un mismo archivo sin cerrar el primero. Para el primer caso, poco podemos hacer (es un programa externo el que influye) excepto avisar al usuario de que lo cierre; en el segundo caso el error es de cdigo, ya que no hemos cerrado el fichero con un Close.

Ejemplos
w i t hA d a . T e x t _ I O ,A d a . S e q u e n t i a l _ I O ; - E j e m p l os e n c i l l od eu s oA d a . S e q u e n t i a l _ I O ; - C o p i a m o su na r c h i v op a r ah a c e ru n ac o p i ad es e g u r i d a d

p r o c e d u r eC o p i a d o ri s t y p eB y t ei sm o d2 * * 8 ; p a c k a g eP k g _ B y t ei sn e wA d a . S e q u e n t i a l _ I o ( B y t e ) ; C:C h a r a c t e r: =A s c i i . N u l ; B:B y t e ; A r c h i v o _ O r i g i n a l , A r c h i v o _ C o p i a :P k g _ B y t e . F i l e _ T y p e ; R u t a _ E n t r a d a :S t r i n g( 1. .3 2 ) ; L o n g _ E n t :I n t e g e r : =0 ; b e g i n A d a . T e x t _ I o . P u t _ L i n e ( " I n t r o d u z c ae ln o m b r ed e lf i c h e r od eac o p i a r( m a x i m o3 2c a r a c t e r e s ) " ) ; A d a . T e x t _ I o . G e t _ L i n e ( R u t a _ E n t r a d a , L o n g _ E n t ) ; - A b r i m o se lf i c h e r oe nm o d oI n _ f i l e ,m o d ol e c t u r a , - c o nl ar u t ae s p e c i f i c a d ap o re lu s u a r i o P k g _ B y t e . O p e n ( A r c h i v o _ O r i g i n a l , P k g _ B y t e . I n _ F i l e , R u t a _ E n t r a d a ( 1 . . L o n g _ E n t ) ) ; - C r e a m o su nf i c h e r od e lm i s m on o m b r ec o nt e r m i n a c i n' . b a c k u p ' P k g _ B y t e . C r e a t e ( A r c h i v o _ C o p i a , P k g _ B y t e . O u t _ F i l e , R u t a _ E n t r a d a ( 1 . . L o n g _ E n t )&" . b a c k u p " ) ; - C o p i a m o se lc o n t e n i d od e lf i c h e r oo r i g i n a la lr e c i nc r e a d o - N t e s ee lu s od eE n d _ o f _ f i l ep a r ap r e v e n i rl al e c t u r ad ef i n a ld ef i c h e r o w h i l en o tP k g _ B y t e . E n d _ O f _ F i l e ( A r c h i v o _ O r i g i n a l )l o o p P k g _ B y t e . R e a d ( A r c h i v o _ O r i g i n a l , B ) ; P k g _ B y t e . W r i t e ( A r c h i v o _ C o p i a , B ) ; e n dl o o p; - I m p o r t a n t e : N oh a yq u eo l v i d a r s ed ec e r r a rl o sf i c h e r o sc u a n d on ol o su s e m o s ! P k g _ B y t e . C l o s e ( A r c h i v o _ O r i g i n a l ) ; P k g _ B y t e . C l o s e ( A r c h i v o _ C o p i a ) ;

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

139/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

A d a . T e x t _ I o . P u t _ L i n e ( " O p e r a c i o nr e a l i z a d ac o ne x i t o " ) ; A d a . T e x t _ I o . P u t _ L i n e ( " P r e s i o n ec u a l q u i e rt e c l ap a r af i n a l i z a r " ) ; A d a . T e x t _ I o . G e t _ I m m e d i a t e ( C ) ; e x c e p t i o n w h e nP k g _ B y t e . N a m e _ E r r o r = > A d a . T e x t _ I o . P u t _ L i n e ( " E r r o r :N o m b r ed ea r c h i v oor u t ai n c o r r e c t o s " ) ; w h e nP k g _ B y t e . U s e _ E r r o r = > A d a . T e x t _ I o . P u t _ L i n e ( " E r r o r :E la r c h i v oy ae s t aa b i e r t o " ) ; e n dC o p i a d o r ;

w i t hA d a . T e x t _ I O ,A d a . I n t e g e r _ T e x t _ I O ,A d a . S e q u e n t i a l _ I O ; E j e m p l oa v a n z a d od eu s oA d a . S e q u e n t i a l _ I O ; P r o g r a m ad e' c i f r a d o 'C s a r L e e m o sd eu nf i c h e r o ,h a c e m o su nd e s p l a z a m i e n t om e d i a n t e u n ac o n t r a s e a( m t o d oC s a r )ye s c r i b i m o se no t r of i c h e r o .

-E v i d e n t e m e n t el as e g u r i d a de sc a s in u l a ,b a s t ai rp r o b a n d ol a s -2 5 5p o s i b i l i d a d e sp a r as a c a r l o .Ys ic i f r a sd o sv e c e sc o n s e c u t i v a s -d ef o r m aq u es u m e n2 5 6t a m b i ns es a c a . p r o c e d u r eC e s a ri s t y p eB y t ei sm o d2 * * 8 ; p a c k a g eP k g _ B y t ei sn e wA d a . S e q u e n t i a l _ I o ( B y t e ) ;

C:C h a r a c t e r: =A s c i i . N u l ; B:B y t e ; A r c h i v o _ E n t r a d a , A r c h i v o _ S a l i d a :P k g _ B y t e . F i l e _ T y p e ; R u t a _ E n t r a d a , R u t a _ S a l i d a :S t r i n g( 1. .3 2 ) ; P a s s w o r d , L o n g _ E n t , L o n g _ S a l , A u x :I n t e g e r : =0 ; b e g i n w h i l eC / = ' c 'a n dC / = ' d 'l o o p A d a . T e x t _ I o . P u t _ L i n e ( " C i f r a r( c )oD e s c i f r a r( d ) ? " ) ; A d a . T e x t _ I o . G e t _ I m m e d i a t e( C ) ; i fC / = ' c 'a n dC / = ' d 't h e n A d a . T e x t _ I o . N e w _ L i n e ; A d a . T e x t _ I o . P u t _ L i n e ( " E r r o r : P u l s el aCol aD " ) ; e n di f ; e n dl o o p ; A d a . T e x t _ I o . P u t ( " H ae l e g i d o :" ) ; i fC = ' c 't h e n A d a . T e x t _ I o . P u t ( " C i f r a r " ) ; A d a . T e x t _ I o . N e w _ L i n e ( 2 ) ; e l s e A d a . T e x t _ I o . P u t ( " D e s c i f r a r " ) ; A d a . T e x t _ I o . N e w _ L i n e ( 2 ) ; e n di f ; A d a . T e x t _ I o . P u t _ L i n e ( " I n t r o d u z c ae ln o m b r ed e lf i c h e r od ee n t r a d a( m a x i m o3 2c a r a c t e r e s ) " ) ; A d a . T e x t _ I o . G e t _ L i n e ( R u t a _ E n t r a d a , L o n g _ E n t ) ;
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 140/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

P k g _ B y t e . O p e n ( A r c h i v o _ E n t r a d a , P k g _ B y t e . I n _ F i l e , R u t a _ E n t r a d a ( 1 . . L o n g _ E n t ) ) ;

A d a . T e x t _ I o . P u t _ L i n e ( " I n t r o d u z c ae ln o m b r ed e lf i c h e r od es a l i d a( m a x i m o3 2c a r a c t e r e s ) " ) ; A d a . T e x t _ I o . P u t _ L i n e ( " O j o ,s o b r e e s c r i b i r ae lf i c h e r os i np r e g u n t a r ! " ) ; A d a . T e x t _ I o . G e t _ L i n e ( R u t a _ S a l i d a , L o n g _ S a l ) ; P k g _ B y t e . C r e a t e ( A r c h i v o _ S a l i d a , P k g _ B y t e . O u t _ F i l e , R u t a _ S a l i d a ( 1 . . L o n g _ S a l ) ) ; w h i l eP a s s w o r d < 1o rP a s s w o r d > 2 5 5l o o p A d a . T e x t _ I o . P u t _ L i n e ( " E l i j au np a s s w o r d( n u m e r od e l1a l2 5 5 ) " ) ; A d a . I n t e g e r _ T e x t _ I o . G e t ( P a s s w o r d ) ; i fP a s s w o r d < 1o rP a s s w o r d > 2 5 5t h e n A d a . T e x t _ I o . N e w _ L i n e ; A d a . T e x t _ I o . P u t _ L i n e ( " E r r o r :E lv a l o rn oe sc o r r e c t o .D e b ee s t a re n t r e1y2 5 5 " ) ; e n di f ; e n dl o o p ;

w h i l en o tP k g _ B y t e . E n d _ O f _ F i l e ( A r c h i v o _ E n t r a d a )l o o p P k g _ B y t e . R e a d ( A r c h i v o _ E n t r a d a , B ) ; i fC = ' c 't h e n A u x : = ( I n t e g e r ( B ) + P a s s w o r d )m o d2 5 6 ; e l s e A u x : = ( I n t e g e r ( B ) P a s s w o r d )m o d2 5 6 ; e n di f ; P k g _ B y t e . W r i t e ( A r c h i v o _ S a l i d a , B y t e ( A u x ) ) ; e n dl o o p ; P k g _ B y t e . C l o s e ( A r c h i v o _ E n t r a d a ) ; P k g _ B y t e . C l o s e ( A r c h i v o _ S a l i d a ) ; A d a . T e x t _ I o . P u t _ L i n e ( " O p e r a c i o nr e a l i z a d ac o ne x i t o " ) ; A d a . T e x t _ I o . P u t _ L i n e ( " P r e s i o n ec u a l q u i e rt e c l ap a r af i n a l i z a r " ) ; A d a . T e x t _ I o . G e t _ I m m e d i a t e ( C ) ; e x c e p t i o n w h e nP k g _ B y t e . N a m e _ E r r o r = > A d a . T e x t _ I o . P u t _ L i n e ( " E r r o r :N o m b r ed ea r c h i v oor u t ai n c o r r e c t o s " ) ; w h e nP k g _ B y t e . U s e _ E r r o r = > A d a . T e x t _ I o . P u t _ L i n e ( " E r r o r :E la r c h i v oy ae s t aa b i e r t o " ) ; w h e nA d a . I n t e g e r _ T e x t _ I O . D a t a _ E r r o r = > A d a . T e x t _ I o . P u t _ L i n e ( " E r r o r :L ac o n t r a s e ad e b ee s t a re n t r e1y2 5 5 " ) ; e n dC e s a r ;

Manual de referencia de Ada


A.8.1 The Package Sequential_IO (http://www.adaic.com/standards/95lrm/html/RM-A-8-1.html)

Unidades predefinidas. Ada.Command_Line


A d a . C o m m a n d _ L i n ees un paquete predefinido

para la consulta de la lnea de comandos para los sistemas operativos que lo soportan, que son la mayora. Tambin permite establecer el cdigo de error de terminacin del programa.

Ejemplo
w i t hA d a . T e x t _ I O ; w i t hA d a . C o m m a n d _ L i n e ;u s eA d a . C o m m a n d _ L i n e ; -I m p r i m el o sa r g u m e n t o sp a s a d o sp o rl n e ad ec o m a n d o s
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 141/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

p r o c e d u r eI m p r i m i r _ A r g u m e n t o si s b e g i n A d a . T e x t _ I O . P u t _ L i n e( " I m p r i m i e n d oa r g u m e n t o sp a s a d o sa"& C o m m a n d _ N a m e&' . ' ) ; f o rIi n1. .A r g u m e n t _ C o u n tl o o p A d a . T e x t _ I O . P u t _ L i n e ( " A r g u m e n t on "&I n t e g e r ' I m a g e( I )&" :"& A r g u m e n t( I ) ) ; e n dl o o p ; S e t _ E x i t _ S t a t u s( S u c c e s s ) ; e x c e p t i o n w h e no t h e r s= > S e t _ E x i t _ S t a t u s( F a i l u r e ) ; e n dI m p r i m i r _ A r g u m e n t o s ;

Especificacin
Segn el manual de referencia de Ada (el estndar), la especificacin de este paquete ha de ser la siguiente:
p a c k a g eA d a . C o m m a n d _ L i n ei s p r a g m aP r e e l a b o r a t e ( C o m m a n d _ L i n e ) ; f u n c t i o nA r g u m e n t _ C o u n tr e t u r nN a t u r a l ; f u n c t i o nA r g u m e n t( N u m b e r:i nP o s i t i v e )r e t u r nS t r i n g ; f u n c t i o nC o m m a n d _ N a m er e t u r nS t r i n g ; t y p eE x i t _ S t a t u si si m p l e m e n t a t i o n d e f i n e di n t e g e rt y p e ; S u c c e s s:c o n s t a n tE x i t _ S t a t u s ; F a i l u r e:c o n s t a n tE x i t _ S t a t u s ; p r o c e d u r eS e t _ E x i t _ S t a t u s( C o d e:i nE x i t _ S t a t u s ) ; p r i v a t e . . .-n o ts p e c i f i e db yt h el a n g u a g e e n dA d a . C o m m a n d _ L i n e ;

Manual de referencia de Ada


A.15 The Package Command_Line (http://www.adaic.com/standards/95lrm/html/RM-A-15.html)

Recursos en la Web
Esta apndice del wikilibro Programacin en Ada es un listado de enlaces web ordenados por categoras.

Informacin general, portales


es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 142/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Portal y foro del canal #Ada (http://www.canalada.org/) AdaPower.com (http://www.adapower.com/) Ada World (http://www.adaworld.com/) Ada Resource Assoc.'s Ada Information Clearinghouse (http://www.adaic.com/)

Asociaciones y grupos
Asociacin Ada-Spain (http://adaspain.unican.es/) Asociacin Ada-Europe (http://www.ada-europe.org) Ada-Belgium Organization (en ingls) (http://www.cs.kuleuven.ac.be/~dirk/ada-belgium/) ACM - SIGAda: Special Interest Group on Ada (http://www.acm.org/sigada/)

Estndar
Ada 2005 Reference Manual (http://www.adaic.org/resources/add_content/standards/05rm/html/RMTTL.html) Ada 2005 Rationale (http://www.adaic.org/resources/add_content/standards/05rat/html/Rat-TTL.html)

Estndar de Ada 95
Ada 95 Reference Manual (http://www.adaic.org/resources/add_content/standards/95lrm/ARM_HTML/RM-TTL.html) Ada 95 Rationale (http://www.adaic.org/resources/add_content/standards/95rat/rat95html/rat95contents.html)

Estndar de Ada 83
Ada 83 Reference Manual (http://archive.adaic.com/standards/83lrm/html/lrm-TOC.html) Ada 83 Rationale (http://archive.adaic.com/standards/83rat/html/ratl-TOC.html) Ada '83 Quality and Style: Guidelines for Professional Programmers (http://www.informatik.unistuttgart.de/ifi/ps/AdaBasis/pal_1195/ada/ajpo/docs/style-guide/83style/html/)

Cursos y tutoriales
Gua mnima de Ada (http://www.gedlc.ulpgc.es/docencia/mp_i/GuiaAda/) , Gua de referencia bsica de Ada 95 (http://www.gedlc.ulpgc.es/docencia/NGA/index.html) y Gua bsica de Ada 2005 (http://www.gedlc.ulpgc.es/docencia/NGA/Ada2005/ada/index.html) de la Universidad de las Palmas de Gran Canaria. Transparencias de Ada de Juan Antonio de la Puente (http://polaris.dit.upm.es/~jpuente/strl05/transparencias/Ada.pdf) de la UPM. Programacin distribuida con Ada95 bajo GNU/Linux (I) (http://es.tldp.org/Tutoriales/ADAGlade/html/) Programacin multitarea con Ada (http://www.gui.uva.es/~laertes/nuke/index.php? option=com_content&task=view&id=47&Itemid=41) de la Universidad de Valladolid. Trabajo sobre Ada en el rincondelvago.com (http://html.rincondelvago.com/ada.html) Trabajo en monografias.com (http://www.monografias.com/trabajos6/teorlen/teorlen.shtml) Lovelace Tutorial (http://www.dwheeler.com/lovelace/) : tutorial interactivo.
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 143/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Libros electrnicos completos


computer-books.us - Libros electrnicos de Ada 95, completos y gratuitos (http://www.computerbooks.us/ada95.php) The Big Book of Linux Ada Programming (http://www.pegasoft.ca/resources/boblap/book.html) ; Copia en OOPWeb.com (http://oopweb.com/Ada/Documents/AdaLinux/VolumeFrames.html) Ada Lecture Notes (http://www.informatik.uni-stuttgart.de/ifi/bs/lehre/ei1/adanotes/) Ada for Software Engineers, M. Ben-Ari (http://stwww.weizmann.ac.il/gcs/benari/books/index.html#ase)

Software libre o gratuito


Repositorios de proyectos
SourceForge.net: Software Map: Ada (http://sourceforge.net/softwaremap/trove_list.php?form_cat=163) Libre Site: GNAT, GtkAda, XmlAda, AWS, etc (http://libre.adacore.com) AdaPower: Active Ada Projects You Can Join (http://www.adapower.com/index.php? Command=Projects&Title=Ada+Projects) Google Code (http://code.google.com/hosting/search?filter=1&q=label:Ada&start=0) BerliOS Developer: Software Map (http://developer.berlios.de/softwaremap/trove_list.php? form_cat=52) Ada and Software Engineering Library 2 (ASE2) (http://archive.adaic.com/ase/)

Buscadores y directorios de cdigo Ada


Ohloh (http://www.ohloh.net/tags/ada) Koders (http://www.koders.com/)

Entornos de desarrollo integrado


GPS (Libre Site) - GNAT Programming Studio (http://libre.adacore.com/gps) ada-mode (http://stephe-leake.org/emacs/ada-mode/emacs-ada-mode.html) para Emacs (http://www.gnu.org/software/emacs) . AdaGIDE - Ada GNAT Integrated Development Environment for Windows (http://adagide.martincarlisle.com/) GNAVI - The GNU Ada Visual IDE (http://www.gnavi.org/) GRASP - Graphical Representations of Algorithms, Structures and Processes (http://www.eng.auburn.edu/grasp/)

Herramientas para programadores


AdaBrowse - An Ada-To-HTML generator (http://home.datacomm.ch/t_wolf/tw/ada95/adabrowse/) C2Ada - a translator from C to Ada (http://c2ada.wiki.sourceforge.net/) - Translating C to Ada (article) (http://www.knosof.co.uk/ctoa.html) Auto_Text_IO (http://www.stephe-leake.org/ada/auto_text_io.html) , generacin de cdigo de impresin de tipos Ada. ICC Ada ICCFMT Info page (pretty printer) (http://www.irvine.com/freebies.html) Adalog Components (http://www.adalog.fr/compo2.htm) , herramientas de anlisis de cdigo, paquetes
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 144/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

de uso general y Adapplets.

Libreras y bindings
XML4Ada95 - An XML package for Ada 95 (http://xml4ada95.sourceforge.net/) The web page of Gautier de Montmollin - Software (http://homepage.sunrise.ch/mysunrise/gdm/gsoft.htm) Paul Pukite's Home Page (http://www.tc.umn.edu/~puk/) , varias libreras y artculos. OpenALada, Ada binding for OpenAL (Open Audio Library) (http://coreland.ath.cx/code/openal-ada) Bindings para Qt: Qt4Ada (http://qt4ada.sourceforge.net/) y QtAda (http://sourceforge.net/projects/qtada/) .

Otras aplicaciones
MaRTE OS Home Page (http://marte.unican.es/) , sistema operativo de tiempo real de la Universidad de Cantabria. Lovelace (http://www.lovelace.fr/) , proyecto para crear un sistema operativo completo basado en Ada.

Vendedores de compiladores
AdaCore - GNAT (http://www.adacore.com) Aonix - ObjectAda (http://www.aonix.com/objectada.html) DDC-I (http://www.ddci.com/products.php?language=Ada) IBM Rational Ada Developer (http://www-306.ibm.com/software/awdtools/developer/ada/) Ada for .NET (http://www.martincarlisle.com/a_sharp.html)

Artculos
Artculo de Ada en Wikipedia (http://es.wikipedia.org/wiki/Lenguaje_de_programacin_Ada) A Detailed Description of the GNU Ada Run Time (http://www.iuma.ulpgc.es/users/jmiranda/gnatrts/index.htm) Mapping UML To Ada (http://www.dedicated-systems.com/VPR/layout/display/pr.asp?PRID=6060) Embedded.com - Ada's Slide into Oblivion (http://www.embedded.com/story/OEG20020125S0098) Markus Kuhn's Ada95 Page (Why Ada?) (http://www.cl.cam.ac.uk/~mgk25/ada.html) Ian Sharpe - Technical Notes - Shared Libraries & Ada (http://homepage.ntlworld.com/ian.sharpe/isharpe/technote/ada_sl.htm) There's Still Some Life Left in Ada. When it comes to survival of the fittest, Ada ain't no dinosaur (http://www.acmqueue.org/modules.php?name=Content&pa=showpage&pid=221) From extended Pascals to Ada 95 (http://homepage.sunrise.ch/mysunrise/gdm/pascada.htm) Linux Journal - Elegance of Java and the Efficiency of C++--It's Ada (http://www.linuxjournal.com/article/4342) Linux Journal - Testing Safety-Critical Software with AdaTEST (http://www.linuxjournal.com/article/5965) Linux Gazette - Introduction to Programming Ada (http://linuxgazette.net/issue81/adam2.html) Linux Gazette - Gnat and Linux: C++ and Java Under Fire (http://linuxgazette.net/issue33/burtch.html) STSC CrossTalk - Ada in the 21st Century - Mar 2001 (http://www.stsc.hill.af.mil/crosstalk/2001/03/brosgol.html) Robotics with Ada95 (http://www.circuitcellar.com/archives/viewable/212-Ramirez/index.html)
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 145/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Noticias y bitcoras
Bitcora de Gneuromante - Barrapunto (http://barrapunto.com/~Gneuromante/journal/) Barrapunto | GNU Visual Debugger en Ada95. (http://barrapunto.com/article.pl?sid=00/12/13/1054255) (2000/12/13) Barrapunto de fernand0 | Informacin sobre Ada (http://barrapunto.com/mbpfernand0/01/06/18/116259.shtml) (2001/06/18) Barrapunto de fernand0 | GNADE, el entorno de bases de datos para Ada (http://barrapunto.com/article.pl?sid=01/06/18/0859207&mode=archive) (2001/06/18) Barrapunto de fernand0 | GNAT comienza a integrarse con el GCC (http://barrapunto.com/article.pl? sid=01/10/03/1747226) (2001/10/03) Barrapunto de hacking | Para qu sirve Ada? (http://barrapunto.com/article.pl?sid=02/04/08/1127243) (2002/04/08) Barrapunto de fernand0 | Comparando Ada y Java (http://barrapunto.com/mbpfernand0/02/05/16/1751259.shtml) (2002/05/16) Barrapunto | Las tripas de un RTS libre (http://barrapunto.com/article.pl? sid=02/07/05/1023236&mode=thread) (2002/07/05) Barrapunto | Liberado libro completo sobre el runtime de GNAT (http://barrapunto.com/article.pl? sid=02/09/03/143257) (2002/09/03) Libertonia || Qu fue del Ada? (http://libertonia.escomposlinux.org/story/2002/9/14/193839/155) (2002/09/14) Barrapunto | Sale el primer entorno de desarrollo libre de Ada (http://barrapunto.com/article.pl? sid=03/07/22/1058235) (2003/07/22) Barrapunto | Ada y el software libre: un futuro en comn? (http://barrapunto.com/article.pl? sid=04/11/27/021239) (2004/11/2) Bitcora de mig21 (7781) | Queda algo de vida en Ada? (http://barrapunto.com/journal.pl? op=display&id=8263&uid=7781) (2004/11/15) Barrapunto | Ada 2005, cada vez ms cerca (http://barrapunto.com/article.pl?sid=06/06/14/1633231) (2006/06/14)

Directorios de enlaces
Ada en dmoz.org, directorio de Internet, rama en espaol (http://dmoz.org/World/Espa%c3%b1ol/Computadoras/Programaci%c3%b3n/Lenguajes/Ada/) Ada en dmoz.org, directorio de Internet, rama en ingls (http://dmoz.org/Computers/Programming/Languages/Ada/) Ada95 y GNAT - unizar.es (http://webdiis.unizar.es/~jcampos/EDA/2006/09/ada-y-gnat.html) Enlaces Ada - ulpgc.es (http://labsopa.dis.ulpgc.es/ada/) Resources on Ada: Managing Complexity (http://www.csv.ica.unistuttgart.de/homes/ph/resources_on_ada.html) Ada on Windows by Sergio Gomez (http://deim.urv.cat/~sgomez/ada/)

Foros, chats y listas de correo


Lista de correo sobre Ada en espaol (http://listas.uninet.edu/mailman/listinfo/ada) Canal del IRC Hispano (en espaol) (irc://irc.irc-hispano.org/ada) Foro del canal #ada (http://www.canalada.org/foro) Foro de SloCdigo (http://foros.solocodigo.com/index.php?showforum=13)
es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes 146/147

11/09/12

Programacin en Ada/Texto completo - Wikilibros

Foro de "La Web del Programador" (http://www.lawebdelprogramador.com/news/new.php? id=3&texto=Ada) Usenet: comp.lang.ada (news:comp.lang.ada) Canal IRC de Ada en freenode.net (en ingls) (irc://irc.freenode.net/Ada)

Ingeniera de software
Ada 95 QUALITY AND STYLE Guide (http://www.adaic.org/docs/95style/html/contents.html) Ada 95 QUALITY AND STYLE Guide (http://www.adaic.org/docs/95style) (formato PDF, PS y Word)

Buscadores
Search Ada sites on the Internet (http://www.adaic.org/ada-resources/ada-on-the-web/) Buscar en el Annotated Ada Reference Manual (AARM) (http://www.adaic.org/resources/add_content/standards/05aarm/html/AA-SRCH.html) koders.com - Buscador de software libre que permite buscar cdigo escrito en Ada (http://koders.com)

GNU Free Documentation License


Obtenido de http://es.wikibooks.org/w/index.php? title=Programacin_en_Ada/Texto_completo&oldid=134587 Categoras: Libros con versin para imprimir Programacin en Ada Pginas con enlaces rotos a archivos Textos GFDL Programacin Libros con un artculo relacionado Esta pgina fue modificada por ltima vez el 31 oct 2009, a las 09:38. El texto est disponible bajo la Licencia Creative Commons Atribucin/Compartir-Igual 3.0; clusulas adicionales pueden aplicar. Vase los trminos de uso para ms detalles.

es.wikibooks.org/w/index.php?title=Programacin_en_Ada/Texto_completo&printable=yes

147/147

Das könnte Ihnen auch gefallen