type - La web de Sistemas Operativos (SOPA)

Anuncio
Introducción al lenguaje Ada95
1
© José Miguel Santos Espino – Alexis Quesada Arencibia
Historia
n
n
n
n
Concurso de ideas del Departamento de
Defensa norteamericano (1974)
Primer estándar: Ada 83
Utilizado en la industria militar,
aeroespacial, sistemas empotrados, etc.
Ada influye en lenguajes posteriores
(c++, ObjectPascal, etc.)
2
© José Miguel Santos Espino – Alexis Quesada Arencibia
Historia(2)
n
n
n
Segundo estándar: Ada 95
Actualiza el lenguaje: orientación a
objetos, monitores (objetos protegidos),
anexos especializados ...
La aparición de Linux provoca una
expansión de Ada como lenguaje de
uso general: compilador gratuito GNAT
3
© José Miguel Santos Espino – Alexis Quesada Arencibia
4
Elementos del lenguaje
n
Tipos de datos
n
Concurrencia
n
Estructuras algorítmicas
n
Orientación a objetos
n
Subprogramas
n
Biblioteca estándar
n
Excepciones
n
Anexos especializados
n
Paquetes
n
Genéricos
© José Miguel Santos Espino – Alexis Quesada Arencibia
Objetivos principales
n
Legibilidad
n
n
Tipado fuerte
n
n
Facilitar lectura. Evitar notación concisa
Impedir confusión entre conceptos
lógicamente distintos.
Construcción de grandes programas
n
Mecanismos de encapsulado para
compilación separada
5
© José Miguel Santos Espino – Alexis Quesada Arencibia
Objetivos principales (2)
n
Manejo de excepciones
n
n
Abstracción de datos
n
n
Mayor transportabilidad y mejor mantenibilidad
Procesamiento paralelo
n
n
Control de los errores
Mecanismos para permitir ejecutar actividades
(tareas) de forma paralela
Unidades genéricas
n
Especialmente útil para la creación de bibliotecas
6
© José Miguel Santos Espino – Alexis Quesada Arencibia
Un programa en Ada
n
Programa pral. + Servicios de otras
unidades de biblioteca
--Ejemplo de programa
with Text_IO; --cláusula de contexto
procedure hola is --procedimiento principal
--Parte de declaraciones
begin
--Cuerpo de sentencias ejecutables
Text_IO.Put_Line(“Hola, mundo”);
end hola;
7
© José Miguel Santos Espino – Alexis Quesada Arencibia
Un programa en Ada (2)
-- ejemplo de programa
with Text_IO;
use Text_IO;
procedure hola is
saludo: STRING :=(“hola, mundo”);
begin
for i in 1..10 loop
Put_Line(SALUDO);
end loop;
end hola;
8
© José Miguel Santos Espino – Alexis Quesada Arencibia
Algunos detalles
n
n
n
n
No distingue mayúsculas de minúsculas
Se pueden usar acentos y eñes en los
identificadores
Comprobación muy estricta de tipos
Las sentencias siempre terminan en
punto y coma
9
© José Miguel Santos Espino – Alexis Quesada Arencibia
Elementos léxicos
n
Comentarios con doble guión: -- texto
n
Identificadores tipo Pascal
n
Cadenas entre “comillas dobles”
n
Caracteres con ‘comilla simple’
n
Números (literales numéricos)
n
n
Enteros
Reales
10
© José Miguel Santos Espino – Alexis Quesada Arencibia
Elementos léxicos
n
Más sobre literales numéricos
n
Se pueden emplear separadores
n
n
Literales enteros y reales con exponente
n
n
9.84E2 19E2
Se puede expresar la base
n
n
123_456_789
2#1001001#
Un literal con base también puede tener exponente)
n
12#40#E3 (es 4 x 12 x 123)
11
© José Miguel Santos Espino – Alexis Quesada Arencibia
12
Tipos de Datos
Elementales
Accesos
Compuestos
Arrays
Escalares
Discretos
Enumeración
Tagged
records
Tasks
Protected
objects
Reales
Enteros
Enteros con
signo
Records
Modulares
Coma
flotante
Coma Fija
Decimales
Ordinarios
Tipos Numéricos
© José Miguel Santos Espino – Alexis Quesada Arencibia
Variables y asignaciones
n
“nombre_de_variable : tipo”
x : INTEGER; --una variable de tipo integer llamada x
x, y, z : INTEGER;
n
Asignación :=
x, y, z : INTEGER := 0;
13
© José Miguel Santos Espino – Alexis Quesada Arencibia
Declaración de constantes
n
n
= variable pero poniendo la palabra
reservada “constant”
En el caso de constantes numéricas se
puede omitir el tipo (declaración de
número)
c : constant INTEGER := 10; --Declaración de la
--constante c
pi: constant := 3.1416; --Declaración del número pi
14
© José Miguel Santos Espino – Alexis Quesada Arencibia
Declaración de tipos
n
type nombre is definición;
n
type nombre is new definición;
n
subtype nombre is definición;
type byte is range 0..255;
subtype byte is INTEGER range 0..255;
type Mienterocorto is new INTEGER range 0..255;
15
© José Miguel Santos Espino – Alexis Quesada Arencibia
16
Tipos predefinidos
n
n
Un tipo está caracterizado por un
conjunto de valores y un conjunto de
operaciones
Paquete STANDAR
© José Miguel Santos Espino – Alexis Quesada Arencibia
Tipos enteros
n
integer
n
natural (de 0 en adelante)
n
positive (de 1 en adelante)
n
mod N (entero sin signo, rango 0..N-1)
n
Se puede imponer una restricción al tipo
integer (range)
p: INTEGER range 1..10;
x: INTEGER range 1..I+J;
t: mod 10; --Entero rango 0..9
17
© José Miguel Santos Espino – Alexis Quesada Arencibia
Tipos enteros (2)
n
Algunas implementaciones:
n
n
n
n
long_integer
short_integer
OJO, el rango de valores de estos tipos
depende de la implementación
¿Como hacer programas más “transportables” ?
n
Atributos
n
Son valores asociados a tipos u objetos que suelen usarse
para devolver propiedades de un tipo de datos o efectuar
operaciones predefinidas sobre un tipo
18
© José Miguel Santos Espino – Alexis Quesada Arencibia
Tipos enteros (3)
n
Atributos: tipo’atributo(params)
n
Por ejemplo:
subtype NATURAL is INTEGER range 0..INTEGER’LAST;
subtype POSITIVE is INTEGER range 1..INTEGER’LAST;
19
© José Miguel Santos Espino – Alexis Quesada Arencibia
Tipos enumerados
type COLOR is (Rojo, Ambar, Verde);
type DIA is (lun, mar, mie, jue, vie, sap, dom);
subtype LABORABLE is DIA range lun..vie; --Restricciones
--Hay un tipo enumeración predefinido, el CHARACTER
type CHARACTER is (nul,...,’A’,’B’,...,del);
20
© José Miguel Santos Espino – Alexis Quesada Arencibia
21
Atributos típicos
n
Atributos aplicables a todos los tipos
escalares (enteros y enumerados)
n
T’First
n
T’Max(e1,e2)
n
T’Last
n
T’Min(e1,e2)
n
T’Range
n
T’Pos(e)
n
T’Length
n
T’Val(e)
n
T’Succ(e)
n
T’Value(string)
n
T’Pred(e)
n
T’Image(e)
© José Miguel Santos Espino – Alexis Quesada Arencibia
Ejemplos de atributos
type DIAS is (lun, mar, mie, jue, vie, sap, dom);
subtype LABORABLE is DIAS range lun..vie; --Restricciones
for dia in lun..sap loop
Text_IO.Put(DIAS’IMAGE(dia));
end loop;
hoy := lunes;
mañana := DIAS’SUCC(hoy);
ayer := DIAS’PRED(hoy); -- error
if hoy<mañana then
Text_IO.Put(“Hoy es menor que mañana”);
end if;
22
© José Miguel Santos Espino – Alexis Quesada Arencibia
Ejemplos de atributos (2)
x : INTEGER;
begin
Text_IO.Get (cadena);
x := INTEGER’VALUE (cadena);
Text_IO.Put (INTEGER’IMAGE(x));
end;
23
© José Miguel Santos Espino – Alexis Quesada Arencibia
Tipo booleano
n
El tipo booleano es un tipo enumerado
predefinido cuya declaración puede
entenderse como
type BOOLEAN is (FALSE,TRUE)
24
© José Miguel Santos Espino – Alexis Quesada Arencibia
Tipos reales
n
Tipo predefinido: FLOAT
n
Algunas implementaciones:
n
n
n
Short_Float;
Long_Float;
El programador también puede definir sus
propios reales
n
n
Coma fija
Coma flotante
25
© José Miguel Santos Espino – Alexis Quesada Arencibia
Coma fija y coma flotante
--Coma flotante
type rflotante is digits 5 [range –1.0..1.0];
--se exigen una precisión de al menos 5 digitos
--significativos
--Coma fija ordinario
type rfija1 is delta 0.01 range –1.0..1.0;
--Se especifica un error absoluto (0.01)
--Coma fija decimal
type rfija2 is delta 0.01 digits 5;
26
© José Miguel Santos Espino – Alexis Quesada Arencibia
Conversión de tipos
n
Ada => Tipado fuerte
n
n
No permite nunca mezclar tipos diferentes
Conversión
n
Nuevo_Tipo(Expresión_Tipo_Original)
27
© José Miguel Santos Espino – Alexis Quesada Arencibia
Operadores
n
Los típicos y además:
n
n
n
n
n
exponenciación: a**b
modulo: a mod b
resto: a rem b
valor absoluto: abs a
Comprobaciones de pertenencia aplicables
a todos los tipos escalares:
n
in, not in (aunque técnicamente no son
operadores)
28
© José Miguel Santos Espino – Alexis Quesada Arencibia
Arrays
n
Nombre_Array: array (tipo_discreto) of Tipo_Elemento;
A: array (INTEGER range 1..6) of REAL;
AA: array (INTEGER range 0..2, INTEGER range 0..3) of REAL;
N: INTEGER := 5;
B: array (INTEGER range 1..N) of BOOLEAN;
HORAS_TRABAJADAS: array (DIA) of REAL;
29
© José Miguel Santos Espino – Alexis Quesada Arencibia
Arrays (2)
n
Recordando atributos
n
n
n
n
n
n
n
n
AA’FIRST(1) es 0
AA’FIRST(2) es 0
AA’LAST(1) es 2
AA’LAST(2) es 3
AA’LENGTH(1) es 3
AA’LENGHT(2) es 4
AA’RANGE(1) es 0..2
AA’RANGE(2) es 0..3
30
© José Miguel Santos Espino – Alexis Quesada Arencibia
Inicialización de arrays
n
Agregados (forma literal de un valor
formación)
n
n
n
(0.0, 0.0, 0.0)
Un agregado debe ser completo
Se puede declarar una formación como
constante en cuyo caso el valor inicial
es, evidentemente, obligatorio
31
© José Miguel Santos Espino – Alexis Quesada Arencibia
Inicialización de arrays (2)
A: array (1..6) of REAL := (0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
AA: array (0..2,0..3) of REAL := ((0.0, 0.0, 0.0, 0.0),
(0.0, 0.0, 0.0, 0.0),
(0.0, 0.0, 0.0, 0.0));
MAÑANA: constant array (DIA) of DIA :=
(mar, mie, jue, vie, sap, dom, lun);
32
© José Miguel Santos Espino – Alexis Quesada Arencibia
Tipos arrays
n
n
type Nombre is array (tipo_discreto) of Tipo_Elemento;
Además en Ada se introduce el concepto de array
irrestringido (no se dan las restricciones de los índices)
type VECTOR is array (1..6) of REAL;
type VECTOR is array (INTEGER range <>) of REAL;
V:VECTOR(1..5);
type MATRIZ is array (INTEGER range <>, INTEGER range <>)
of REAL;
--Los límites pueden ser cualquier expresión y se evalúa
--cuando se encuentra la restricción del índice
M: MATRIZ(1..N,1..N);
33
© José Miguel Santos Espino – Alexis Quesada Arencibia
Tipos arrays (2)
n
Otra forma dar los limites: arrays
contantes
n
Los límites se deducen a partir del valor inicial
(el límite infierior sería S’FIRST siendo S el
subtipo del índice)
type L is array (DIAS range <>) of DIAS;
SIGUIENTE_DIA_LABORABLE: constant L :=
(mar, mie, jue, vie, lun);
--OJO !!!
type MATRIZ is array (INTEGER range <>, INTEGER range <>)
of REAL;
MIMATRIZ: constant MATRIZ := ((1.0, 0.0), (0.0, 1.0));
34
© José Miguel Santos Espino – Alexis Quesada Arencibia
Agregado por nombre
n
Agregados por posición
n
n
(0.0, 0.0, 0.0)
Agregados por nombre (no importa el orden)
n
(1=>0.0, 2=>0.0, 3=>0.0)
type MATRIZ is array (INTEGER range <>, INTEGER range <>)
of REAL;
MIMATRIZ: constant MATRIZ := (1=>(1=>1.0, 2=>0.0),
2=>(1=>1.0, 2=>0.0));
DIA_TRABAJO: constant array(DIA) of BOOLEAN :=
(lu..vie=>TRUE, sab|dom=>false);
35
© José Miguel Santos Espino – Alexis Quesada Arencibia
Más detalles sobre agregados
n
n
Uso de others (última opción)
No se puede mezclar en un mismo agregado
notación por nombre y por posición (ojo si en
el caso de los distintos niveles en un
agregado multidimensional)
MIMATRIZ: constant array(1..5,1..2) of REAL:=
(1=>(1=>1.0, 2=>0.0),
2=>(1.0, 0.0),
others=>(others=>0.0)));
36
© José Miguel Santos Espino – Alexis Quesada Arencibia
Más sobre arrays
n
Asignación
n
n
Igual tipo y el mismo número de elementos
Igualdad y desigualdad (igual tipo)
n
= número de componentes y además
componentes iguales
V:VECTOR(1..5);
W:VECTOR(0..4);
...
V:=W; --V y W son del mismo tipo y ambos tienen 5 comp.
37
© José Miguel Santos Espino – Alexis Quesada Arencibia
Más sobre arrays (2)
n
Se puede hacer referencia a un trozo de
un array monodimensional => rodajas
V:VECTOR(1..5);
W:VECTOR(0..4);
V(1..2) := W(3..4);
38
© José Miguel Santos Espino – Alexis Quesada Arencibia
Más sobre arrays (3)
n
Operaciones sobre arrays de una
dimensión
n
n
n
n
n
and, or, xor, not => arrays booleanos
=, /= (ya vimos la regla),
>, >=, >, >= (orden lexicográfico)
Operadores binarios => mismo tipo y
mismo número de componentes
Nuevo operador: & (concatenación de
formaciones de una dimensión)
39
© José Miguel Santos Espino – Alexis Quesada Arencibia
Strings
n
Es un array de caracteres
n
type STRING is array (POSITIVE range <>) of CHARACTER
S: STRING(1..7);
G: constant STRING := (‘H’,’O’,’L’,’A’);
--Notación alternativa y más cómoda
G: constant STRING := “hola”;
40
© José Miguel Santos Espino – Alexis Quesada Arencibia
Registros
type FECHA is
record
DIA: INTEGER range 1..31
MES: NOMBRE_MES; --lo suponemos definido
AÑO: INTEGER;
end record;
F:FECHA;
F.DIA:=4;
G:FECHA:=(4,JUL,1776);
H:= (MES=>JUL,DIA=>4,AÑO=>1976);
41
© José Miguel Santos Espino – Alexis Quesada Arencibia
Estructuras algorítmicas
n
Sentencias simples
n
Bloque begin..end
n
Sentencias condicionales: if, case
n
Sentencias iterativas: for, while, loop
n
Subprogramas: function, procedure
42
© José Miguel Santos Espino – Alexis Quesada Arencibia
Sentencias simples
n
Asignación: var := expr;
n
Sentencia nula: null;
n
Llamada a procedimiento:
n
proc(parm1,parm2,...);
43
© José Miguel Santos Espino – Alexis Quesada Arencibia
Bloque begin..end
[nombre_de_bloque:]
declare
i:INTEGER:=0; --las declaraciones van aquí
begin
i:=i+1;
--Las sentencias van aquí
exception
--manejo de exepciones
end [nombre_de_bloque];
44
© José Miguel Santos Espino – Alexis Quesada Arencibia
45
Ambito
declare
i:INTEGER:=0;
begin
...
declare
k:INTEGER:=i;
i:INTEGER:=0;
begin
...
end;
...
end;
ámbito de la I
externa
visibilidad de la ámbito de la I visibilidad de la
I externa
interna
I interna
© José Miguel Santos Espino – Alexis Quesada Arencibia
46
Ambito (2)
externo:
declare
I:INTEGER:=0;
begin
...
declare
K:INTEGER:=I;
I:INTEGER;
J:INTEGER:=externo.I;
begin
...
end;
...
end;
--nos referimos a la I externa
© José Miguel Santos Espino – Alexis Quesada Arencibia
Sentencias condicionales
if expr then
sentencia
[elsif sentencia]
[elsif sentencia]
...
[else sentencia]
end if;
case expr is
when caso =>
sentencias
...
[when others => sent]
end case;
expr: sólo tipos discretos
caso: valor, rango, o lista
de valores v1|v2|v3...
Todos los casos han de
estar contemplados
47
© José Miguel Santos Espino – Alexis Quesada Arencibia
Sentencias iterativas
while expr loop
sentencia
end loop;
for ident in [reverse] rango loop
sentencia
end loop;
loop
sentencia
end loop;
48
© José Miguel Santos Espino – Alexis Quesada Arencibia
Ejemplos de for
for i in 1..10 loop
put(“hola, i=“);put(i);new_line;
end loop;
for i in reverse 1..10
for i in lunes..viernes
for i in dias range lunes..miercoles
for i in dias’first..dias’last
for i in laborables
49
© José Miguel Santos Espino – Alexis Quesada Arencibia
Exit y goto
loop
if una_condición then
exit;
end if;
-- o también
exit when otra_condición;
end loop;
if condición then
goto Pabajo;
end if;
...
<<Pabajo>>
Put (“Código después de la etiqueta”);
50
© José Miguel Santos Espino – Alexis Quesada Arencibia
Subprogramas
n
Procedimientos
n
n
n
n
Funciones
n
n
modo del parámetro: in, out o in out
paso de parámetros por posición o por nombre
parámetros por omisión (default)
los parámetros siempre son in (no se pueden
modificar)
Se permite sobrecarga, recursividad y
anidamiento
51
© José Miguel Santos Espino – Alexis Quesada Arencibia
Procedimientos
n
Modo de acceso a los parámetros:
n
n
n
in: el parámetro funciona como una constante
out: el parámetro funciona como una variable sin
inicializar
in out: el parámetro funciona como una variable
inicializada
procedure nombre (decl1;decl2;...) is
declaraciones locales (variables, tipos,
subtipos, procedimientos,...)
begin
cuerpo del procedimiento
end nombre;
52
© José Miguel Santos Espino – Alexis Quesada Arencibia
Funciones
n
Sólo admite parámetros in
function nombre (params) return tipo is
declaraciones locales (variables, tipos,
subtipos, procedimientos,...)
begin
cuerpo de la función
end nombre;
53
© José Miguel Santos Espino – Alexis Quesada Arencibia
54
Declaraciones, ámbito y visibilidad
procedure F(...);
procedure G(...) is
begin
F(...);
end G;
procedure F(...) is
begin
G(...);
end F;
procedure P is
I:INTEGER:=0;
procedure Q is
k:INTEGER:=I;
I:INTEGER;
J:INTEGER;
begin
...
end Q
begin
...
Q(...);
end P;
© José Miguel Santos Espino – Alexis Quesada Arencibia
Estructura general de un
programa en Ada
n
n
Programa Ada: unidades distribuidas en
uno o varios ficheros.
Unidades
n
n
n
n
Subprogramas
Paquetes
Tareas
Objetos protegidos
55
© José Miguel Santos Espino – Alexis Quesada Arencibia
Paquetes
n
n
n
En general un programa Ada se compone de
un conjunto de paquetes y un programa
principal
La cláusula de contexto with sirve para
declarar que se se van a usar los servicios de
un paquete
Paquete:
n
n
Especificación (*.ads)
Implemetación(*.adb)
56
© José Miguel Santos Espino – Alexis Quesada Arencibia
Formato general de un paquete
package nombre_paquete is
parte visible
declaraciones (variables, tipos,
subtipos, procedimientos,...)
private
declaraciones privadas
end nombre_paquete;
package body nombre_paquete is
más declaraciones y desarrollo del paquete
begin
secuencia de sentencias
end nombre_paquete;
57
© José Miguel Santos Espino – Alexis Quesada Arencibia
Más sobre paquetes
n
n
n
n
Los entes declarados dentro del paquete
tienen el mismo tiempo de vida que el paquete
en sí
Los paquetes se pueden declarar en cualquier
parte declarativa, es decir, en un bloque,
subprograma o en otro paquete
Acceso a los elementos de un paquete:
Cláusula “use” o bien notación “.”
Un paquete puede consistir sólo en una
especificación
58
© José Miguel Santos Espino – Alexis Quesada Arencibia
Tipos private y limited private
n
n
n
Al poner un tipo como “private” su definición
queda oculta
El usuario del paquete sólo podrá utilizar con él
las operaciones declaradas en la parte pública
del paquete, además de :=, = y /=
Si se pone como “limited private” entonces se
deshabilitan también :=, = y /=
59
© José Miguel Santos Espino – Alexis Quesada Arencibia
Ejemplo
package Manejo_De_Claves is
type Clave is private;
Clavenula : constant Clave;
procedure Tomar_Clave(C : out Clave);
function "<"(X, Y : in Clave) return Boolean;
private
Max : constant := 2 ** 16 - l;
type Clave is range 0 .. Max;
Clavenula : constant Clave := 0;
end Manejo_De_Claves;
60
© José Miguel Santos Espino – Alexis Quesada Arencibia
Ejemplo (2)
package body Manejo_De_Claves is
procedure Tomar_Clave(C : out Clave) is
begin
Cuerpo del procedimiento
end Tomar_Clave;
function "<"(X, Y : in Clave) return Boolean is
begin
Cuerpo del operador
end "<";
end Manejo_De_Claves;
61
© José Miguel Santos Espino – Alexis Quesada Arencibia
Renombrado
n
Se puede aplicar a variables, constantes,
excepciones, subprogramas y paquetes
procedure TomaClave(C:out Clave) renames
Manejo_de_Claves.Tomar_Clave;
function “*”(X,Y:VECTOR) return REAL renames ESCALAR;
function DIEZ return CIFRA_ROMANA renames ‘X’;
package P renames PILA;
62
© José Miguel Santos Espino – Alexis Quesada Arencibia
Unidades genéricas
n
Unidades con parámetros que se pueden
concretar para diferentes instancias de la
unidad
generic
type TElemento is private;
procedure Algo(Elemento:in TElemento) is
Declaraciones
begin
Acciones
end Algo;
63
© José Miguel Santos Espino – Alexis Quesada Arencibia
Unidades genéricas (2)
n
Para utilizar el procedimiento “Algo” primero se
deberán crear instancias para los tipos
apropiados
...
procedure Algo_Entero is new Algo(integer);
procedure Algo_Carácter is new Algo(character);
...
Algo_Entero(30);
Algo_Carácter(‘a’);
...
64
© José Miguel Santos Espino – Alexis Quesada Arencibia
Paquetes genéricos (PG)
n
Los paquetes genéricos son los que
soportan la genericidad de los tipos
abstractos de datos en este lenguaje
65
© José Miguel Santos Espino – Alexis Quesada Arencibia
Formato general de un PG
generic
zona de declaración de parámetros formales
package nombre_paquete_generico is
zona de uso de los parámetros formales
end nombre_paquete_generico;
package body nombre_paquete_generico is
desarrollo del paquete
end nombre_paquete_generico;
66
© José Miguel Santos Espino – Alexis Quesada Arencibia
Formato general de un PG (2)
n
La forma de usar un paquete genérico es
crear una instancia del PG en la que se
especifiquen todos los parámetros formales
requeridos
package nombre_instancia is new
nombre_paquete generico (parametros actuales, ...);
67
© José Miguel Santos Espino – Alexis Quesada Arencibia
Ejemplo
generic
MAX:POSITIVE;
type ITEM is private;
package PILA is
procedure PONER(X:ITEM);
function QUITAR return ITEM;
end PILA;
package body PILA is
P: array (1..MAX) of ITEM;
CIMA: INTEGER range 0..MAX;
--cuerpo de PONER y QUITAR
begin
CIMA:=0;
end PILA;
68
© José Miguel Santos Espino – Alexis Quesada Arencibia
Ejemplo (2)
...
declare
package MI_PILA is new PILA(100,REAL);
use MI_PILA;
begin
...
PONER(X);
...
Y:=QUITAR;
...
end;
69
© José Miguel Santos Espino – Alexis Quesada Arencibia
Parámetros formales en PG
n
n
n
Los parámetros formales pueden ser:
objetos, tipos, subprogramas o
paquetes
Los parámetros de un PG pueden tener
un valor por defecto
Se declaran de distinta forma según su
naturaleza
70
© José Miguel Santos Espino – Alexis Quesada Arencibia
Manejo de Excepciones
n
En Ada, cuando se producen errores
durante la ejecución de un programa se
elevará una excepción
71
© José Miguel Santos Espino – Alexis Quesada Arencibia
Excepciones predefinidas
n
CONSTRAINT_ERROR
n
n
NUMERIC_ERROR
n
n
Generalmente algo fuera de rango
Errores numéricos (p.ej. división por 0)
PROGRAM_ERROR
n
Errores estructura de control (p.ej. se llega
al “end” de una función, se llama a un
programa cuyo cuerpo no se ha definido,..)
72
© José Miguel Santos Espino – Alexis Quesada Arencibia
Excepciones predefinidas (2)
n
STORAGE_ERROR
n
n
Falta de espacio de memoria
TASKING_ERROR
n
Errores relacionados con tareas
73
© José Miguel Santos Espino – Alexis Quesada Arencibia
Ejemplo
begin
--secuencia de sentencias
exception
when NUMERIC_ERROR|CONSTRAINT_ERROR =>
Put(“Numeric o constraint error”);
...
when STORAGE_ERROR =>
Put(“Falta de memoria”);
...
when others =>
Put(“Se produjo otro tipo de error”);
...
end;
74
© José Miguel Santos Espino – Alexis Quesada Arencibia
¿ Dónde se tratan ?
n
Los manejadores de excepciones
pueden aparecer al final de:
n
n
n
n
n
un
un
un
un
bloque
cuerpo de subprograma
cuerpo de paquete o
cuerpo de tarea
No puede devolverse nunca el control a
la unidad donde se elevó la excepción
75
© José Miguel Santos Espino – Alexis Quesada Arencibia
Propagación de excepciones
n
Si una unidad no proporciona un manejador para
una determinada excepción, ésta se propaga
dinámicamente
n
n
n
Se termina la ejecución de la unidad
La excepción se eleva al punto donde se invocó a
dicha unidad y así sucesivamente
Por tanto, las excepciones se propagan
dinámicamente y no estáticamente
76
© José Miguel Santos Espino – Alexis Quesada Arencibia
Excepciones definidas por el
Programador
n
Es posible lanzar una excepción:
n
n
Sintaxis de declaración de excepciones:
n
n
raise EXCEPCION;
Miexcepción: exception;
Las reglas de manejo y propagación son
idénticas a las excepciones predefinidas
77
© José Miguel Santos Espino – Alexis Quesada Arencibia
Más sobre excepciones
n
n
Las acciones llevadas a cabo por el
manejador pueden tener que realizarse
en varias capas
A veces es conveniente manejar una
excepción y luego propagar esa misma
excepción (raise)
78
© José Miguel Santos Espino – Alexis Quesada Arencibia
Ámbito de las excepciones
n
n
Las excepciones siguen las mismas
reglas de ámbito que otras entidades
Una excepción puede propagarse fuera
de su ámbito, aunque a partir de ahí
solo puede manejarse anónimamente
mediante others
79
© José Miguel Santos Espino – Alexis Quesada Arencibia
Ámbito de las excepciones (2)
n
n
Una excepción elevada en una
declaración se propaga un nivel hacia
fuera
Si un subprograma termina debido a
una excepción, no podemos suponer
nada sobre los parámetros reales out o
in out
80
© José Miguel Santos Espino – Alexis Quesada Arencibia
Punteros (access types)
n
Dos clases de punteros:
n
n
n
n
n
punteros para memoria dinámica
punteros generales
Los punteros (access), por defecto, sólo sirven para
trabajar con memoria dinámica
Si se quiere trabajar con punteros a objetos
estáticos, hay que usar punteros generales (access
all)
Para poder tomar la dirección de un objeto, éste
debe haber sido declarado expresamente como
“aliased”.
81
© José Miguel Santos Espino – Alexis Quesada Arencibia
Punteros de memoria dinámica
type cosa is
record
c1,c2:integer;
end record;
type ptr_cosa is access cosa; -- tipo puntero
ptr : ptr_cosa;
c : cosa;
ptr := new cosa’(20,30);
-- creación dinámica
ptr.c1 := 15;
-- acceso a un campo
ptr.all := c;
-- acceso a todo el objeto
82
© José Miguel Santos Espino – Alexis Quesada Arencibia
Punteros generales
type cosa is
record
c1,c2:integer;
end record;
type ptr_cosa is access all cosa;
ptr : ptr_cosa;
cosa1 : aliased cosa;
cosa2 : cosa;
ptr := new cosa’(20,30);
ptr := cosa1’access; -- correcto
ptr := cosa2’access; -- ERROR
ptr := cosa2’Unchecked_access; -- correcto
83
© José Miguel Santos Espino – Alexis Quesada Arencibia
84
Borrado de memoria dinámica
n
n
El lenguaje Ada permite recolección de basura
(pero ningún compilador la soporta)
Borrado explícito con
Ada.Unchecked_Deallocation
with Ada.Unchecked_Deallocation;
...
procedure Free is new
Ada.Unchecked_Deallocation(cosa,ptr_cosa);
...
Free(ptr);
© José Miguel Santos Espino – Alexis Quesada Arencibia
Parámetros “access”
n
n
Un parámetro de un procedimiento puede ser
in, out o access.
En este último caso, el parámetro se
comporta como un tipo puntero
procedure P (X:access Cosa);
...
c: aliased cosa;
P(c’access);
85
© José Miguel Santos Espino – Alexis Quesada Arencibia
Un apunte más sobre punteros
n
Se puede imponer una restricción de
lectura a un puntero de forma que no
pueda modificar el objeto al que apunta
type Punt_Const_Int is access constant integer;
ptr: Punt_Const_Int;
i: aliased integer;
ptr=i’access;
ptr.all:=3; --error, no se puede modificar i a
--través de ptr
86
© José Miguel Santos Espino – Alexis Quesada Arencibia
Entrada / Salida
n
Funciones básicas
n
n
n
n
get(X), put(X) siendo X de tipo character, string,
integer, float, enumeration
get_line(S,L), put_line(s), siendo S de tipo string
y L la longitud leida
new_line, skip_line
Para realizar E/S de ristras o caracteres basta
incluir la cláusula de contexto “with TEXT_IO”
87
© José Miguel Santos Espino – Alexis Quesada Arencibia
Entrada / Salida (2)
n
n
Para realizar E/S de los tipos escalares es
necesario crear una instancia del paquete
para este tipo
En cualquier caso hay que utilizar la cláusula
“with TEXT_IO”, puesto que estos paquetes
se encuentran en dicha librería
package
package
package
package
package
package
Día_IO is new Enumeration_IO(Dia);
Mientero_IO is new Integer_IO(Mientero);
rf_IO is new Float_IO(rf);
rfija1_IO is new Fixed_IO(rfija1);
rfija2_IO is new Decimal_IO(rfija1);
Natural_IO is new Modular_IO(rfija1);
88
© José Miguel Santos Espino – Alexis Quesada Arencibia
Más sobre cadenas
n
Ada ofrece tres tipos posibles de ristras
de caracteres
n
Ristras de tamaño fijo (ya hemos hablado de
ellas: strings)
n
n
Ristras de tamaño limitado
n
n
with Ada.Strings.Fixed
with Ada.Strings.Bounded
Ristras de tamaño dinámico
n
with Ada.Strings.Unbounded
89
© José Miguel Santos Espino – Alexis Quesada Arencibia
Ficheros
n
Ficheros de texto
n
n
with Text_IO
Ficheros uniformes
n
Ficheros secuenciales
n
n
Ficheros de acceso directo
n
n
with Sequential_IO;
with Direct_IO;
Existe un cuarto paquete que contiene las
declaraciones de las excepciones usadas en
estos tres paquetes (IO_EXCEPTIONS)
90
© José Miguel Santos Espino – Alexis Quesada Arencibia
Funciones numéricas
n
Paquete Ada.Numerics
n
Funciones matemáticas elementales (sqrt,
log, sin, cos,...)
n
n
Ada.Numerics.Generic_Elementary_Functions
Números aleatorios
n
Discretos
n
n
Ada.Numerics.Discrete_Random
Coma flotante
n
Ada.Numerics.Float_Random
91
© José Miguel Santos Espino – Alexis Quesada Arencibia
Pragmas
n
Algunas veces es necesario hacer una
“observación” al margen al compilador
n
n
n
pragma nombre(params);
En general, se pueden colocar en cualquier punto
donde pueda haber declaraciones o sentencias
(aunque algunos pragmas pueden tener
restricciones en este sentido)
Algunos pragmas:
n
Inline, Interface, Optimize, Priority, ...
92
Descargar