Septiembre 2010
c
2010 Grupo de Sistemas y Comunicaciones.
Algunos derechos reservados.
Este trabajo se distribuye bajo la licencia
Creative Commons Attribution Share-Alike
disponible en http://creativecommons.org/licenses/by-sa/2.1/es
2 El primer programa
3 Tipos
4 Punteros
5 Estructuras de control
6 Subprogramas
7 Paquetes
8 Ficheros de texto
9 Excepciones
10 Ejemplo Final
GSyC - 2010 Introduccion a Ada 3
Introduccion
Contenidos
1 Introduccion
2 El primer programa
3 Tipos
4 Punteros
5 Estructuras de control
6 Subprogramas
7 Paquetes
8 Ficheros de texto
9 Excepciones
10 Ejemplo Final
GSyC - 2010 Introduccion a Ada 4
Introduccion
Introduccion
Historia
Introduccion
Introduccion
Ada es un lenguaje:
estrictamente tipado
estaticamente tipado
Lo que hace que la mayora de los errores puedan detectarse en
tiempo de compilacion, antes de empezar a ejecutar del programa.
El primer programa
Contenidos
1 Introduccion
2 El primer programa
3 Tipos
4 Punteros
5 Estructuras de control
6 Subprogramas
7 Paquetes
8 Ficheros de texto
9 Excepciones
10 Ejemplo Final
GSyC - 2010 Introduccion a Ada 12
El primer programa
Codigo en Ada
with Ada.Text_IO;
begin
Ada.Text_IO.Put_Line("Tablas de Multiplicar");
Ada.Text_IO.Put_Line("=====================");
Ada.Text_IO.New_Line(2);
end Tablas_De_Multiplicar;
GSyC - 2010 Introduccion a Ada 13
El primer programa
Mayusculas y minusculas
Comentarios
Los comentarios en Ada empiezan por dos guiones -- y duran
hasta el final de la lnea
Si se quiere un comentario que abarque varias lneas es
necesario empezar cada lnea por --:
-- este es un comentario
-- de varias lineas
-- juntas
X := X + 1;
El primer programa
Uso de paquetes
El primer programa
with Ada.Text_IO;
procedure Tablas_De_Multiplicar is
package T_IO renames Ada.Text_IO;
...
begin
T_IO.Put_Line("Hola");
...
end Tablas_De_Multiplicar;
Entrada/Salida de texto
El paquete Ada.Text_IO se utiliza para entrada/salida de
cadenas de caracteres (Strings).
Hay paquetes que permiten entrada/salida de otros tipos de
datos: Integer, Float, Boolean....
En general resulta mas comodo usar siempre Ada.Text_IO y
convertir otros tipos de datos a String mediante Image.
Tambien resulta comodo usar el operador de concatenacion de
Strings: &.
Ejemplo:
Ada.Text_IO.Put_Line("Resultado: " & IntegerImage(Resultado));
El primer programa
Contenidos
1 Introduccion
2 El primer programa
3 Tipos
4 Punteros
5 Estructuras de control
6 Subprogramas
7 Paquetes
8 Ficheros de texto
9 Excepciones
10 Ejemplo Final
GSyC - 2010 Introduccion a Ada 21
Tipos
Si una variable esta sin inicializar tendra un valor cualquiera, que puede ser
diferente cada vez que se ejecute el programa.
Conviene inicializar todas las variables. El compilador no siempre puede detectar
cuando se usan variables sin inicializar y los problemas que pueden producirse
son muy difciles de detectar.
No se pueden mezclar tipos distintos si no se hace una conversion.
Los literales numericos tienen tipo: 2 es un Integer, 2.0 es un Float.
procedure Tipos_Basicos_2 is
N: Natural;
P: Positive;
Flag: Boolean;
begin
N := 4;
Flag := True;
end Tipos_Basicos_2;
Tipos
Tipos y Subtipos
procedure Tipos_Subtipos is
begin
I := 12;
D := I; -- Correcto
D := I * 3; -- Correcto pero elevara una excepcion en
-- tiempo de ejecucion: Constraint_Error
ND := I; -- Error de compilacion: tipos incompatibles
ND := Nuevo_Da_Mes(I); -- Correcto: la conversion EXPLICITA entre
-- tipos numericos incompatibles
-- es siempre posible
end Tipos_Subtipos;
Un tipo y sus subtipos son compatible, por lo que pueden mezclarse en expresiones. Dos tipos
diferentes siempre son incompatibles.
Natural y Positive son subtipos de Integer
Al mezclar tipos y subtipos puede ocurrir que un resultado se salga del rango de valores
permitidos para un subtipo, lo que provoca un error en tiempo de ejecucion:
Constraint_Error
Siempre es posible realizar una conversion explcita entre tipos numericos.
Enumerados
with Ada.Text_IO;
procedure Enumerados is
begin
end Enumerados;
Tipos
Arrays (I)
procedure Arrays is
begin
A := (3, 4, 5, 2, -1, 3);
A(1) := 4;
AA(0,3) := 5;
C := (2, 3, 4, 5, 6, 7);
D := C; -- correcto
end Arrays;
Una variable array pueden declararse de un tipo anonimo o de un tipo con nombre.
Todas las variables de tipos anonimos son incompatibles entre s.
Variables array del mismo tipo con nombre s son compatibles.
Arrays (II)
procedure Arrays is
begin
A := (3, 4, 5, 2, -1, 3); -- Agregado posicional
end Arrays;
En Ada es costumbre que la primera posicion de un array tenga ndice 1, pero puede ser
cualquiera.
Al asignar valores a las posiciones de un array pueden utilizarse agregados posicionales o
agregados por nombre.
En los agregados por nombre cada valor es precedido por el ndice en que se coloca.
Los agregados por nombre solo se usan cuando se quiere usar others para dar el mismo valor
a muchas o todas las posiciones.
Otra forma de dar valores a todo un array es a traves de bucles.
Tipos
begin
end Arrays_Irrestrigidos;
En Ada NO hay arrays dinamicos (es decir, que varen de tamano durante la ejecucion).
En Ada al declarar cualquier variable debe conocerse su tamano, que ya no cambiara durante la
ejecucion del programa.
Al hacer asignaciones entre arrays se encesita que, ademas de ser del mismo tipo, los tamanos
de los arrays sean iguales.
Una rodaja de un array es otro array: un trozo del array original.
Los arrays irrestringidos son utiles para ser utilizados como tipo de un parametro
formal en la declaracion de un subprograma.
En la llamada al subprograma podra pasarse un array de cualquier tamano.
Si dentro del codigo del subprograma se intenta acceder a una posicion que no
existe en el array que ha recibido como parametro se producira un
Constraint_Error.
GSyC - 2010 Introduccion a Ada 29
Tipos
Strings
procedure Cadenas is
C: Character := A;
S1 : String; -- no compila: tama~
no desconocido
S2 : String := "hola"; -- correcto: S2 toma tama~
no del valor inicial
S3 : String(1..10); -- correcto: S3 siempre tendra tama~
no 10
begin
end Cadenas;
Tipos
procedure Strings_Ilimitados is
US: ASU.Unbounded_String;
begin
US := ASU.To_Unbounded_String ("hola");
US := ASU.To_Unbounded_String ("como estamos"); -- correcto
US := ASU.To_Unbounded_String (ASU.To_String(US) & " todos");
Ada.Text_IO.Put_Line (ASU.To_String(US));
end Strings_Ilimitados;
procedure Strings_Ilimitados_2 is
US: ASU.Unbounded_String;
begin
if US = "gracias" then
Ada.text_IO.Put_Line("gracias a ti");
else
US := "Has dicho: " & US;
Ada.Text_IO.Put_Line(ASU.To_String(US));
end if;
end Strings_Ilimitados_2;
La sentencia use type permite tener visibilidad de los operadores &, =, <, <=, >, >= que define el
paquete Ada.Strings.Unbounded para dos operandos Unbounded_String o para un
Unbounded_String y un String.
Ada.Text_IO.Get_Line lee una lnea que escriba el usuario y la devuelve como String. Hay que
convertirla con To_Unbounded_String para poder almacenarla en una variable.
Tipos
Registros
procedure Registros is
P: Persona;
Q: Persona;
begin
P.Edad := 15;
P := (ASU.To_Unbounded_String("Luis"), 25);
P := (Nombre => ASU.To_Unbounded_String("Pepe"), Edad => 10);
end Registros;
Los campos de un registro pueden declarse con un valor por defecto: Q.Edad
tiene valor 20.
Tambien pueden inicializarse los campos de un registro con agregados por
nombre.
GSyC - 2010 Introduccion a Ada 34
Tipos
Arrays de Registros
procedure Array_De_Registros is
L: Grupo;
begin
L(1).Edad := 15;
L(1) := (ASU.To_Unbounded_String("Luis"), 25);
end Array_De_Registros;
Punteros
Contenidos
1 Introduccion
2 El primer programa
3 Tipos
4 Punteros
5 Estructuras de control
6 Subprogramas
7 Paquetes
8 Ficheros de texto
9 Excepciones
10 Ejemplo Final
GSyC - 2010 Introduccion a Ada 36
Punteros
Punteros
Punteros
Punteros
Punteros
Punteros
!"""%
1204 Q
!""$%
Se pueden mezclar en una expresion distintas formas de nombrar la misma zona
de memoria. Cuidado! Al usar punteros el codigo se vuelve mas difcil de leer.
GSyC - 2010 Introduccion a Ada 45
Punteros
procedure is
I: aliased Integer;
S% todos J: aliased Integer;
S: String(1..5);
P: access all Integer;
I% 2 J% -4 Q: access all Integer;
begin
I := 5;
J := -4;
P% S := "todos";
P := I'Access;
Q := P;
Q% P.all := 7;
Q.all := Q.all + J;
I := P.all 1;
Q := J'Access;
Punteros
procedure is
P: access Integer;
Q: access Integer;
begin
P% Q%
Un puntero para acceder a memoria dinamica se declara solo con access.
Un puntero para acceder a la posicion de memoria de variables necesita estar
declarado con access all, y esas variables como aliased.
Los punteros para acceder a memoria dinamica tambien se inicializan
automaticamente a null.
procedure is
P: access Integer;
Q: access Integer;
begin
? -3 P := new Integer;
Q := new Integer'(-3);
P% Q%
Para reservar un espacio en memoria dinamica y hacer que un puntero apunte a
el se utiliza new poniendo a su lado el tipo apuntado por el puntero.
Si se quiere dar un valor inicial se utiliza en la sentencia new la sintaxis
(valor_inicial) detras del tipo.
Si no se da un valor inicial en la sentencia new, el valor apuntado queda
indeterminado.
Punteros
procedure is
P: access Integer;
Q: access Integer;
begin
-3 -3 P := new Integer;
Q := new Integer'(-3);
P.all := Q.all;
P% Q%
Igual que antes, la sintaxis .all permite acceder a los contenidos de lo
apuntado por el puntero
procedure is
type Tipo_Ac_Int is
access Integer;
P: Tipo_Ac_Int;
Q: Tipo_Ac_Int;
-3 -3
begin
P := new Integer;
Q := new Integer'(-3);
P.all := Q.all;
P% Q% Q := P;
Las variables punteros pueden declararse de tipos anonimos (como en todos los
ejemplos anteriores) o de un tipo con nombre (como en este ejemplo).
La asignacion entre puntero copia la referencia, es decir, hace que ambos
terminen apuntando a la misma zona de memoria.
Si un espacio de memoria dinamica ya no es apuntado por ningun puntero resulta innecesario. Esa zona de
memoria se liberara automaticamente por un recolector de basura en lenguajes como Ada (o Java) aunque
tambien puede liberarse manualmente.
Punteros
procedure Accesos is
P_Lista%
type Celda; -- declaracin adelantada incompleta
P_Lista: Acceso_Celda;
P_Aux: Acceso_Celda;
begin
P_Aux%
procedure Accesos is
P_Lista%
type Celda; -- declaracin adelantada incompleta
P_Lista: Acceso_Celda;
P_Aux: Acceso_Celda;
begin
P_Aux%
Punteros
procedure Accesos is
P_Lista%
type Celda; -- declaracin adelantada incompleta
P_Lista: Acceso_Celda;
P_Aux: Acceso_Celda;
begin
P_Aux%
procedure Accesos is
P_Lista%
type Celda; -- declaracin adelantada incompleta
P_Lista: Acceso_Celda;
P_Aux: Acceso_Celda;
begin
end Accesos;
Los nuevos elementos se insertan al principio de la lista.
Ahora P_Aux puede usarse para crear un nuevo elemento, y as sucesivamente.
Estructuras de control
Contenidos
1 Introduccion
2 El primer programa
3 Tipos
4 Punteros
5 Estructuras de control
6 Subprogramas
7 Paquetes
8 Ficheros de texto
9 Excepciones
10 Ejemplo Final
GSyC - 2010 Introduccion a Ada 56
Estructuras de control
Sentencia if (I)
with Ada.Text_IO;
procedure Condicional is
A: Integer := 5;
begin
if A = 0 then
Ada.Text_IO.Put_Line ("A vale 0");
elsif A > 0 then
Ada.Text_IO.Put_Line("A es positivo");
else
Ada.Text_IO.Put_Line("A es negativo");
end if;
end Condicional;
Estructuras de control
Sentencia if (II)
with Ada.Text_IO;
procedure Condicional_2 is
A, B: Integer;
begin
A := 5;
B := -3;
end Condicional_2;
Las expresiones logicas pueden usar los operadores and, or, xor, not, y ser tan
complejas como se quiera.
Los operadores logicos son los de menor precedencia de todos, por eso en la
expresion del ejemplo no son necesarios parentesis (aunque pueden aumentar la
legibilidad).
Sentencia if (III)
with Ada.Text_IO;
procedure Condicional_3 is
A, B: Float;
begin
A := 0.0;
B := -3.2;
end Condicional_3;
El operador and then funciona de forma que solo evalua su parte derecha si es
necesario, es decir, si la parte izquierda es True (a veces se le llama operador
and perezoso o en cortocircuito).
El operador and, en cambio, evalua siempre ambas partes de la expresion. En
este ejemplo, usar and then evita que se produzca una excepcion.
El operador or else evalua su parte derecha solo si la parte izquierda es False.
GSyC - 2010 Introduccion a Ada 59
Estructuras de control
Sentencia case
with Ada.Text_IO;
procedure Condicional_4 is
I: Integer range 1..20 := 3;
begin
case I is
when 1 =>
Ada.Text_IO.Put_Line("I es 1");
when 2..10 =>
Ada.Text_IO.Put_Line("I es peque~
na");
when 13 | 15 | 17 | 19 =>
Ada.Tetxt_IO.Put_Line("I es grande e impar");
when others =>
Ada.Text_IO.Put_Line("I es grande y par");
end case;
end Condicional_4;
with Ada.Text_IO;
procedure Bucle_Infinito is
begin
loop
Ada.Text_IO.Put ("Hola... ");
Ada.Text_IO.Put_Line ("a todos");
end loop;
end Bucle_Infinito;
Estructuras de control
procedure Bucle_2 is
I: Integer := 4;
begin
end Bucle_2;
Se anade una clausula while condicion delante del loop que abre el bucle.
Las condicion se evalua antes de empezar el bucle, y despues de cada pasada. Si
cuando se evalue la condicion su valor es True, las sentencias del bucle se
ejecutaran una pasada mas.
El final del bucle es end loop, como en todos los bucles.
I: Integer := 4;
begin
loop
I := I + 1;
exit when I = 15;
end loop;
end Bucle_3;
Estructuras de control
procedure Bucle_4 is
begin
end Bucle_4;
Se anade una clausula for etiqueta in rango delante del loop que abre el bucle.
El bucle se ejecuta tantas veces como tamano tiene el rango del for.
La etiqueta del for toma en cada pasada el siguiente valor del rango.
La etiqueta NO se declara, no es una variable.
La etiqueta se comporta como una variable de solo lectura que solo existe dentro del bucle.
No se puede avanzar el rango de 2 en 2, ni hacerlo avanzar de golpe para salir del bucle.
El rango 5..1 es un rango nulo. Un for con ese rango hara que el bucle no se ejecutara
ninguna vez.
Para recorrer un rango al reves hay que escribir in reverse y el rango de forma ascendente.
Contenidos
1 Introduccion
2 El primer programa
3 Tipos
4 Punteros
5 Estructuras de control
6 Subprogramas
7 Paquetes
8 Ficheros de texto
9 Excepciones
10 Ejemplo Final
GSyC - 2010 Introduccion a Ada 65
Subprogramas
procedure Ejemplo is
-- AQUI VAN LAS DECLARACIONES DE TIPOS, CONSTANTES Y VARIABLES LOCALES DEL PROGRAMA PRINCIPAL
begin
...
end Ejemplo;
Dentro del procedimiento principal pueden aparecer anidados otros subprogramas (procedimientos y funciones) a los
que llama el codigo del programa principal.
Las variables globales deben ser las menos posibles: en vez de usarlas es mejor declararlas locales al programa
principal y pasarlas como parametros a los subprogramas.
Dentro de cualquier subprograma pueden anidarse mas subprogramas que sean llamados por el que los contiene.
Subprogramas
Procedimientos (I)
Parametros in y parametros out
with Ada.Text_IO;
procedure Sub_1 is
begin
C := A + B;
end Suma;
P: Integer;
Q: Integer;
begin
P := 7;
Suma (P, P, Q);
Ada.Text_IO.Put_Line ("El doble de " & IntegerImage(P) & " es " &
IntegerImage(Q));
end Sub_1;
Los parametros pasados en modo in solo pueden ser ledos dentro del procedimiento, pero no
modificados.
Los parametros pasados en modo out pueden ser modificados dentro del procedimiento, pero no
pueden ser ledos antes de ser modificados.
Los parametros out son una forma que tiene un procedimiento para devolver valores a quien lo llama.
Procedimientos (II)
Parametros in out
with Ada.Text_IO;
procedure Sub_2 is
P: Integer;
begin
P := 7;
Ada.Text_IO.Put ("El doble de " & IntegerImage(P));
Doblar (P);
Ada.Text_IO.Put_Line (" es " & IntegerImage(P));
end Sub_2;
Los parametros pasados en modo in out pueden ser ledos y modificados dentro del procedimiento
cuando se quiera.
Los parametros in out son otra forma que tiene un procedimiento para devolver valores a quien lo
llama.
Para cada parametro debe usarse el modo adecuado a lo que quiera hacerse con el.
Si no se especifica modo para un parametro, el modo es in.
Subprogramas
Funciones
with Ada.Text_IO;
procedure Sub_3 is
P: Integer;
begin
P := 7;
Ada.Text_IO.Put_Line ("El factorial de " & PositiveImage(P) &
" es " & PositiveImage(Factorial(P)));
end Sub_3;
Parametros access
with Ada.Text_IO;
procedure Sub_4 is
R: aliased Integer;
begin
R := 7;
Ada.Text_IO.Put_Line ("Un incremento de " & IntegerImage(R));
Incrementar (RAccess);
Ada.Text_IO.Put_Line (" es " & IntegerImage(R));
end Sub_4;
En la llamada, un parametro access puede ser una variable puntero o el atributo Access de una
variable aliased.
Dentro del subprograma el parametro access se gestiona como una varible puntero.
Los contenidos apuntados por el parametro access pueden ser ledos y modificados dentro del
procedimiento cuando se quiera.
Los parametros access son otra forma de devolver valores para los subprogramas.
Tanto las funciones como los procedimientos pueden recibir parametros access.
Paquetes
Contenidos
1 Introduccion
2 El primer programa
3 Tipos
4 Punteros
5 Estructuras de control
6 Subprogramas
7 Paquetes
8 Ficheros de texto
9 Excepciones
10 Ejemplo Final
GSyC - 2010 Introduccion a Ada 72
Paquetes
Paquetes
Especificacion (operaciones.ads)
package Operaciones is
end Operaciones;
Paquetes
Cuerpo (operaciones.adb)
package body Operaciones is
procedure Doblar (A: in out Integer) is
begin
A := 2 * A;
end Doblar;
procedure Usa_Operaciones is
I: aliased Integer;
P: Positive;
begin
I := 7;
Operaciones.Doblar (I);
Operaciones.Incrementar (IAccess);
P := Operaciones.Factorial (I);
Ada.Text_IO.Put_Line ("Resultado: " & PositiveImage (P));
end Usa_Operaciones;
Ficheros de texto
Contenidos
1 Introduccion
2 El primer programa
3 Tipos
4 Punteros
5 Estructuras de control
6 Subprogramas
7 Paquetes
8 Ficheros de texto
9 Excepciones
10 Ejemplo Final
GSyC - 2010 Introduccion a Ada 78
Ficheros de texto
Ficheros de texto
procedure Fich_1 is
Fich: Ada.Text_IO.File_Type;
begin
...
Ada.Text_IO.Open(Fich, Ada.Text_IO.In_File, "prueba.tmp");
...
end Fich_1;
with Ada.Text_IO;
procedure Fich_1 is
Fich: Ada.Text_IO.File_Type;
begin
...
Ada.Text_IO.Create(Fich, Ada.Text_IO.Out_File, "prueba.tmp");
...
end Fich_1;
Ficheros de texto
procedure Fich_1 is
package ASU renames Ada.Strings.Unbounded;
Fich: Ada.Text_IO.File_Type;
S: ASU.Unbounded_String;
begin
...
Ada.Text_IO.Open(Fich, Ada.Text_IO.In_File, "prueba.tmp");
S := ASU.To_Unbounded_String(Ada.Text_IO.Get_Line(Fich));
...
end Fich_1;
procedure Fich_1 is
package ASU renames Ada.Strings.Unbounded;
Fich: Ada.Text_IO.File_Type;
S: ASU.Unbounded_String;
begin
...
Ada.Text_IO.Create(Fich, Ada.Text_IO.Out_File, "prueba.tmp");
Ada.Text_IO.Put_Line(Fich, "esta es una lnea");
...
end Fich_1;
Ficheros de texto
procedure Fich_1 is
package ASU renames Ada.Strings.Unbounded;
Fich: Ada.Text_IO.File_Type;
S: ASU.Unbounded_String;
begin
...
Ada.Text_IO.Create(Fich, Ada.Text_IO.Out_File, "prueba.tmp");
...
Ada.Text_IO.Close(Fich);
...
end Fich_1;
Contenidos
1 Introduccion
2 El primer programa
3 Tipos
4 Punteros
5 Estructuras de control
6 Subprogramas
7 Paquetes
8 Ficheros de texto
9 Excepciones
10 Ejemplo Final
GSyC - 2010 Introduccion a Ada 85
Excepciones
Comportamiento predefinido
with Ada.Text_IO;
procedure Excepciones_1 is
I: Integer;
begin
I := 0;
I := 4 / I; -- elevara una excepcion Constraint_Error
Ada.Text_IO.Put_Line ("Resultado: " & IntegerImage (I));
end Excepciones_1;
procedure Excepciones_2 is
I: Integer;
begin
I := 0;
I := 4 / I; -- elevara una excepcion Constraint_Error
Ada.Text_IO.Put_Line ("Resultado: " & IntegerImage (I));
exception
when Constraint_Error =>
Ada.Text_IO.Put_Line ("Intento de dividir por 0");
end Excepciones_2;
El programador puede escribir codigo para ejecutar despues de que se produzca la excepcion.
Ahora si se produce una excepcion en un bloque de codigo, se deja de ejecutar ese codigo y se
salta al manejador de la excepcion que se ha producido.
La sintaxis de la parte exception es similar a las clausulas de un case, pero no tienen que
aparecer todas las posibles excepciones
Cuando se produce una excepcion para la que no aparece una clausula when se usa el
comportamiento predefinido.
Excepciones
procedure Excepciones_3 is
I: Integer;
begin
I := 0;
I := 4 / I; -- elevara una excepcion Constraint_Error
Ada.Text_IO.Put_Line ("Resultado: " & IntegerImage (I));
exception
when Constraint_Error =>
Ada.Text_IO.Put_Line ("Intento de dividir por 0");
when Except:others =>
Ada.Text_IO.Put_Line ("Excepcion imprevista: " &
Ada.Exceptions.Exception_Name (Except) & " en: " &
Ada.Exceptions.Exception_Message (Except));
end Excepciones_3;
Ahora ante cualquier excepcion que no sea Constraint Error se ejecutan las lneas de
when others.
A others se le puede poner por delante una etiqueta que permite llamar a algunos
subprogramas del paquete Ada.Exceptions (por ejemplo, para recuperar el nombre de
la excepcion o el mensaje asociado donde aparece el numero de lnea).
En cualquier lugar en que puede ir una sentencia en Ada puede ir un bloque, cuya sintaxis general es:
procedure Principal is
...
sentencia_a;
declare
declaraciones;
begin
sentencia_b1;
sentencia_b2;
...
exception
when excepcion_x =>
sentencia_x1;
sentencia_x2;
when excepcion_y =>
sentencia_y1;
...
...
end;
sentencia_c;
...
end Principal;
Excepciones
procedure Excepciones_4 is
I, J: Integer;
begin
I := 0;
while I < 50 loop
begin
J := 40 / I; -- elevara una excepcion Constraint_Error
exception
when Constraint_Error =>
Ada.Text_IO.Put_Line ("Intento de dividir por 0");
end;
Salida:
Intento de dividir por 0
Resultado: 1074347488
Resultado: 4
Resultado: 2
Resultado: 1
Resultado: 1
Ejemplo Final
Contenidos
1 Introduccion
2 El primer programa
3 Tipos
4 Punteros
5 Estructuras de control
6 Subprogramas
7 Paquetes
8 Ficheros de texto
9 Excepciones
10 Ejemplo Final
GSyC - 2010 Introduccion a Ada 92
Ejemplo Final
Ejemplo Final
with Ada.Text_IO;
with Ada.Strings.Unbounded;
with Ada.Command_Line;
with Ada.Exceptions;
procedure IP_Puerto is
Usage_Error: exception;
Format_Error: exception;
begin
Position := ASU.Index(Src, Delimiter);
Token := ASU.Head (Src, Position-1);
ASU.Tail (Src, ASU.Length(Src)-Position);
exception
when others =>
raise Format_Error;
end;
IP: ASU.Unbounded_String;
Parte_IP: ASU.Unbounded_String;
Puerto: Integer;
begin
if Ada.Command_Line.Argument_Count /= 1 then
raise Usage_Error;
end if;
Ejemplo Final
exception
when Usage_Error =>
Ada.Text_IO.Put_Line ("Uso: ip_puerto <numero-de-puerto>");
when Format_Error =>
Ada.Text_IO.Put_Line ("Formato incorrecto en la direccion IP");
when Except:others =>
Ada.Text_IO.Put_Line ("Excepcion imprevista: " &
Ada.Exceptions.Exception_Name (Except)" en: " &
Ada.Exceptions.Exception_Message (Except));
end IP_Puerto;