No es un bug, es una característica no documentada

23/2/15

Bases de datos. SQL programado (I)

9:26 Posted by Inazio , No comments
Con SQL hay ciertas cosas que no podemos hacer, por lo que deberemos aprender un lenguaje programado para SQL.

Tenemos varios, PS/SQL usado para Oracle, TranSact para Windows y, en el caso que nos atañe, MySQL, directamente no tiene nombre. Es el lenguaje programado de MySQL.

Veremos tres tipos de programas:
  • Procedimiento. Programa que "hace algo" (pudiendo devolver más de un resultado)
  • Funciones. Programa que "hace algo" y devuelve un resultado
  • Triggers. Programa que se ejecuta cuando ocurre una determinada acción. Puede emplearse, por ejemplo, al hacer un pedido con el carrito de la compra, al clicar en comprar, descontará del inventario las unidades recién compradas. La idea sería como la programación en eventos.
Estos programas ofrecerán una mayor portabilidad, ya que nos valdrán para cualquier tipo de programa que acceda a la base de datos. Es decir, lo dejo en el servidor, y pueden servir para programas que accedan desde cualquier plataforma (Java, C, PHP...)

Si nos vamos al WorkBench, en la parte izquierda creamos podemos ver las secciones de Stored Procedures, donde se almacenarán los procedimientos, y Functions para crear las funciones.


Vamos a crear nuestro primer programa, el típico Hola Mundo.


NOTA IMPORTANTE: No poner comentarios en las lineas de delimiter $$, DROP y CREATE PROCEDURE. Si no no funcionará

Eso sí, esto, siempre según el profesor, no debería hacerse nunca, porque un procedimiento, o una función, en SQL, no debería mostrar ningún resultado, sino operar con datos y devolver resultados. Punto.

¿Cómo declaro las variables? 

DECLARE nombreVariable tipoVariable, nombreVariable2 tipoVariable2...

Tengo los siguientes tipos





Los últimos tipos de datos son para datos binarios. Usados para guardar gráficos, audio, video... dependiendo del tamaño.
Por ejemplo un logotipo lo guardariamos con un tipo BLOB, y un LONGBLOB serviría para un video.

Las declararemos de la siguiente manera


22/2/15

Programación. ADA. Tipos abstractos de datos

13:57 Posted by Inazio , No comments

Concepto de abstracción


El concepto de abstracción en el proceso de compresión de un problema, lleva consigo el destacar los detalles importantes e ignorar los irrelevantes.

La abstracción es usada constantemente a la hora de programar.

Un claro ejemplo de ello es el uso de funciones y procedimientos. Ambos, ocultan los detalles sobre como se consigue el resultado que ofrecen y desde fuera son vistos como lo que hacen y no el cómo lo consiguen hacer.

La abstracción siempre lleva asociada la ocultación de información.

Se separa el QUÉ del CÓMO.

O dicho de otra manera, se separa la especificación (el qué) de la implementación (el cómo).

Abstracción de acciones


El uso de procedimientos y funciones nos permite abstraernos de las instrucciones que realmente se están ejecutando para conseguir los resultados que obtenemos.

Tenemos una acción (en el caso de procedimientos) o valor (en el de las funciones) virtual parametrizada.

Se está ocultando información: los datos locales y la secuencia de instrucciones del subprograma.

Recordemos, se separa la especificación (el qué: lo que hace la función o el procedimiento) de la implementación (el cómo: las instrucciones concretas que lo hacen).

Tipo abstracto de datos (TAD)


Un TAD es una colección de valores y de operaciones definidos mediante una espeficación independiente de cualquier representación.

La programación con TADs requiere dos pasos.

è Definición del tipo. Establecer los valores que puede tomar el tipo y las operaciones necesarias para manipular los valores y especificar su interfaz. Esto tiene dos partes:
·         Parte sintáctica. Cómo se llama la operación, si es una función o un procedimiento, que parámetros tiene, en que orden y de qué tipo.
·         Parte semántica. Qué hace la operación con los parámetros de entrada, cómo modificar los de salida y qué devuelve (si se trata de una función). En otras palabras, para qué sirve esa operación y cuál es su comportamiento.
è Implementación del tipo. Elegir la representación de los valores e implementar las operaciones

Encapsulación


El concepto fundamental subyacente bajo la programación de TADs es la encapsulación.

La encapsulación consiste basicamente en:
è La privacidad de la representación (el usuario no conoce los detalles del tipo)
è La protección del tipo (el usuario sólo puede utilizar las operaciones previstas)

Diseño modular


La programación a gran escala exige la partición del código en módulos.

Un módulo es una unidad del programa que puede ser desarrollada independientemente del resto.

La descomposición en módulos debe cumplir unos requisitos.
è Que cada módulo tenga una conexión mínima con el resto. La interfaz
è Que la mayor parte de los cambios del programa afecten sólo a un número pequeño de módulos.
è Que el tamaño de cada módulo sea adecuado (si es muy grande es dificil hacer cambios, si es muy pequeño es costoso por los trabajos adicionales de especificación, documentación, control de versiones…)

Un TAD puede encapsularse en un módulo.
è La interfaz es reducida. El nombre del tipo y los encabezamientos de las operaciones.
è Puede cambiarse la implementación independientemente (para mejorarla, por ejemplo), siempre y cuando mantengamos la interfaz.

El tamaño del módulo suele ser suficientemente grande (implementación de las operaciones).

TADs como base del diseño modular


El uso de procedimientos y funciones (diseño descendente) facilita la programación a pequeña escala (programas pequeños).

Sin embargo esto es insuficiente para la programación a gran escala. Es necesario utilizar el diseño modular.

Programas = datos + algoritmos
Programas = datos + (algoritmos de control)
Programas = (datos + algoritmos de datos) + algoritmos de control
Programas = TADs + algoritmos de control

Hasta ahora conocíamos la forma de abstraer algoritmos (mediante funciones y procedimientos que podemos agrupar en módulos). Ahora conocemos la forma de abstraer datos (mediante TADs que también pueden constituir módulos).

TADs genéricos y algoritmos genéricos


Se pueden definir TADs genéricos (o tipos parametrizados) con algunas características indefinidas.

Estas características pueden ser concretadas posteriormente de diversas formas según las necesidades, obteniendo ejemplares de TADs concretos distintos.

La genericidad facilia la reutilización de algoritmos. Por ejemplo, si se implementa un algoritmo de ordenación de vectores, los tipos de datos de los índices y de los elementos del vector no afectan al algoritmo, siempre y cuando se disponga de una función de orden que diga si un elemento es mayor que otro.

Módulo de declaración ordenacion_g.ads

generic
            type ind is (<>); -- cualquier tipo discreto
            type elem is private; -- cualquier tipo
            type vector is array (ind range <>) of elem;
            with funcion “>”(a,b:elem) return boolean;

package ordenacion_g is
            procedure ordena (v:in out vector);
end; -- del módulo de declaración

Módulo de implementación ordenacion_g.adb

package body ordenacion_g is
            procedure ordena (v: in out vector) is
                        i,j:ind; m,t:elem; n:integer;

begin
            --iniciailización
            i:=v'first;
            j:=v'last;
            n;=ind'pos(i)
            n=n+ind'pos(j)
            n=n/2;
            m=v(ind'val(n));
-        partición del vector en dos
            while i<=j loop
                        while n>v(i) loop
                                   i=ind'succ(i);
                        end loop;
                        while v(j)>m loop
                                   j:=ind'pred(j);
            …
end ordenacion_g

Uso desde un programa de un ejemplar concreto de vector

with ordenacion_g;
procedure mi_programa is
            type color is (rojo, azul, gris);
            type dia is (lu,ma,mi,ju,vi,sa,do);
            type vect is array (day range <>) of color;
            x:vect(ma..vi):=(gris,azul,rojo,gris);
            package o is new ordenacion_g(dia,color,vect,”>”);
                                  
begin
            …
            o.ordena(x);
            …
end mi_programa;

¿Qué gano además con los TADs y la modularidad?


Pues oculto totalmente como se representa la información y cómo se implementan los algoritmos.

Podría cambiar en el futuro ambas cosas, y mientras mantenga la interfaz, el usuario del módulo ni lo notará.

De esta manera, podría hacer una versión rápida que funcionara, y después hacer versiones sucesivas que fueran refinando y mejorando las anteriores, especialmente en cuanto a eficiencia, funcionalidad o capacidad.

Ejemplo. Una pila

Por ejemplo supongamos que tengo un problema para el que necesito una pila, y me urge tener una pila disponible para hacer pruebas, porque lo importante es probar el problema en sí mismo.

De hecho, el problema lo va a resolver otra persona, a mi me encargan que tenga cuanto antes una pila operativa… Y yo no sé ni lo que es un puntero.

Pila. La interfaz

Lo más importante es que yo tenga claro lo que es una pia, aunque no tenga muy claro cómo implementarla, y que el que la va a usar también lo tenga claro (la implementación a él le va a dar igual completamente, a mi no). Y que lo que él va a usar es exactamente lo mismo que yo voy a implementar.

Es decir, hace falta definir antes de empezar a trabajar cada uno por su lado, que operaciones va a hacer, que atributos van a tener, de qué tipo, en qué orden y qué hace exactamente cada operación y en qué condiciones funciona.

Podrían ser las siguientes:
-          Crear pila: à Pila
-          Apilar: Pila elemento à Pila
-          Parcial desapilar: Pila à Pila
-          Parcial cima: Pila à Elemento
-          esVacia: Pila à Booleano

Especificación formal

especificación pila
            usa booleanos
            parametro formal
                        generico elemento
            generico pila
            operaciones
                        creaPila:->pila
                        Crear pila: → pila
                        apilar: pila elemento → pila
parcial desapilar: pila → pila
parcial cima: pila → elemento
                        esVacia: pila → booleano
            dominios de definicion           p:pila, e:elemento
                        desapilar(apilar(p,e))
                        cima(apilar(p,e))
            ecuaciones      p:pila, e:elemento
                        desapilar(apilar(p,e))=e
                        cima(apilar(p,e))=e
                        esVacia(creaPila)=verdad
                        esVacia(apilar(p,e))=falso
fin especificación

Implementación estática

Mientras pienso en cómo dar una solución definitiva al problema que tengo entre manos (y mientras me estudio cómo funcionan los punteros en el lenguaje de programación en el que tengo que hacer el desarrollo), lo que voy a hacer es montar algo que funcione, aunque sea una solución de andar por casa, ya que total, nadie sabrá jamás que he hecho eso, y mi jefe estará contento porque el otro programador tendrá en dos horas una pila operativa para hacer las pruebas sobre ella.

Así que sin más puedo simular una pila conun vector con espacio para un número máximo de elementos, y un contador cima que me dice hasta dónde lo he llenado.

Implementación dinámica.

Luego con tranquilidad, cuando ya domine los punteros, desarrollo en los días siguientes una pila “de verdad”.

Sin más que mantener la interfaz, el otro programador ni se enterará del cambio.

Esta pila por supuesto tendrá sus nodos y sus punteros al nodo siguiente, y todo lo que yo estime necesario.

Si en el futuro quiero mejorar alguna función o procedimiento, haciendo una nueva versión mejorada de la pila, siempre y cuando mantenga la interfaz, podré hacerlo sin ningún problema, sin que el otro programador tenga que modificar ni una línea, y sin que ni siquiera se llegue a enterar del cambio, ya que él no apreciará diferencia alguna (salvo posiblemente en capacidad o eficiencia).

Es decir:

Pilas:
è Implementación estática. Un vector y un entero que diga que componente es la cima
è Implementación dinámica. Colección de nodos enlazados mediante punteros. Se inserta siempre por el principio y un puntero apunta siempre a la cima (que es el principio).

Cola:
è Implementación estática. Vector circular (el siguiente elemento del últmo es el primero) y dos índices que digan que componente son la primera y última.

è Implementación dinámica. Nodos enlazados por punteros (uni o bidireccionalmente según necesidades) y dos punteros que apuntan al primero y último.

16/2/15

Bases de datos. SQL (XI)

10:34 Posted by Inazio , No comments
PRACTICA 12 - ÍNDICES
Crea la tabla libros con los siguientes campos:

codigo int unsigned auto_increment,
titulo varchar(40) notnull,
autor varchar(30),
editorial varchar(15)

Ten en cuenta en la sentencia de creación de la tabla que codigo será clave primaria y existirá otro índice ordinario para editorial
Comprueba que se han creado

drop table if exists libros;

create table libros (
     codigo int unsigned auto_increment primary key,
     titulo varchar(40),
     autor varchar(30),
     editorial varchar(15),
     index idx_editorial (editorial)
);

show index from libros;

Crea la tabla libros2 con los siguientes campos:

codigo int unsigned auto_increment,
titulo varchar(40) notnull,
autor varchar(30),
editorial varchar(15)

Añade después un índice de clave primaria para codigo y otro índice ordinario para editorial
Comprueba que se han creado

drop table if exists libros2;

create table libros2 (
     codigo int unsigned auto_increment primary key,
     titulo varchar(40) not null,
     autor varchar(30),
     editorial varchar(15),
     index idx_editorial (editorial)
);

show index from libros2;

Crea la tabla libros3 con los siguientes campos:

codigo int unsigned auto_increment,
titulo varchar(40) notnull,
autor varchar(30),
editorial varchar(15)

Ten en cuenta en la sentencia de creación de la tabla que codigo será clave primaria.
Añade después un índice único sobre las columnas título y editorial
Comprueba que se han creado

drop table if exists libros3;

create table libros3 (
     codigo int unsigned auto_increment primary key,
     titulo varchar(40) not null,
     autor varchar(30),
     editorial varchar(15),
     unique idx_editorial (titulo,editorial)
);

show index from libros3;

Borra el índice primario de libros, el de editorial para libros2 y el único de libros3.

alter table libros drop primary key;
alter table libros2 drop index idx_editorial;
alter table libros3 drop index idx_editorial;

Bases de datos. SQL (X). Índices

9:25 Posted by Inazio , No comments
Tipos de índices:
  • Clave primaria. Creado automáticamente cuando se configura la primary key.
  • Ordinario. Índice que se debe crear directamente, por ejemplo para acelerar la búsqueda por el campo nombre, o también se crean automáticamente por cada restricción de clave ajena que cree.
  • Únicos. Se crean con la constraint unique, y permite valores nulos.
  • De texto completo. Para campos char, varchar o text en los que se quiere encontrar índices de una o varias palabras. Por ejemplo al realizar una búsqueda en el B.O.E.
Los índices de clave primaria y los únicos no admiten repetidos.

Para saber los índices de una tabla:

show index from clientes;


¿Cómo se crean los índices?

Clave primaria:
1. Crear una primary key a la hora de crear una tabla

2. Añadir una primary key con un alter table a la tabla


Clave ajena
1. Crear una clave ajena

2. CREATE INDEX nombreIndice ON nombreTabla(campo1 [,campo2...]);

3. CREATE TABLE nombreTabla(campo1 tipoDato, campo2 tipoDato,.. INDEX [nombreIndice] (campo1 [,campo2...]));

4. ALTER TABLE nombreTabla ADD INDEX [nombreIndice] (campo1[,campo2...]);


Únicos
1. CREATE TABLE nombreTabla(campo1 tipoDato, campo2 tipoDato,.. UNIQUE [nombreIndice] (campo1 [,campo2...]));

2. ALTER TABLE nombreTabla ADD UNIQUE [nombreIndice] (campo1,campo2) ...

3. CREATE UNIQUE INDEX nombreIndice ON nombreTabla(campo1[,campo2...]);


De texto completo
1. CREATE TABLE nombreTabla( campo1 TIPO, campo2 TIPO,FULLTEXT [nombreIndice] (campo1 [campo2,...]) );

2. ALTER TABLE nombreTabla ADD FULTEXT [nombreIndice] (campo1[,campo2,...]);

3. CREATE FULLTEXT INDEX nombreIndice ON nombreTabla(campo1[,campo2,...]);



Uso con sentido de los sentidos.

El índice está destinado a reducir la cantidad de tiempo, para evitar una lectura secuencial de la tabla.
Por ejemplo, el campo sexo no sería lógico realizar un índice. Perdemos tiempo buscando en el índice y realizando luego la llamada en la tabla, pudiéndolo hacer de nuevo.

Bases de datos. Consultas SQL (IX) - Gestión de usuarios (II)

8:38 Posted by Inazio , No comments
Continuamos con la gestión de usuarios en SQL
/* Ejemplo concreto de asignación de permisos */
grant select (nombre), /* Sólo select en columna nombre */
update (nombre), /* Solo update en columna nombre */
insert
on practica3.clientes /* Puede insertar filas en la tabla concreta */
to PEPE; /* Para el usuario PEPE */

grant all /* Todos los permisos a PEPe para esa tabla */
on bad.clientes /* bdaCiclistas.* -> Toda la base de datos */
to PEPE;

/* Forma de crear usuarios y asignar permisos 2 */
grant update, insert, select
on db52.clientes
to visitante@localhost
identified by 'visitante';

/* Cambio de contraseña */
update mysql.user
set Password = password('pepito')
where user = 'visitante'
and host = 'localhost';

/* Dar permisos a varios usuarios sobre una tabla concreta */
grant update, insert, select
on db52.departamentos
to visitante@localhost,
yo@localhost identified by 'yoMismo', -- Creo usuario yo
tu@equipo.remoto.com identified by 'tuMismo'; -- Creo usuario tu

/* Dar permisos usuarios con varios dominios */
grant update (apellido, oficio), insert, select -- update solo a tabla APELLIDO y OFICIO
on db52.empleados 
to visitante@'%.empresa.com' identified by 'pepito', -- Al usuario visitante del dominio empresa.com
visitante@'%' identified by 'pepito', -- Al usuario visitante de cualquier equipo
visitante2@'localhost' identified by 'pepe2'; -- No es necesario pero localhost también entra entrecomillado

/* Dar permisos a usuario que puede darlos a su vez */
grant update, insert, select, create
on db52
to visitante@localhost
with grant option; -- Puede dar permisos

/* Eliminar permisos */
revoke insert, update
on db52.clientes
from visitante@localhost;

/* Eliminar todos los permisos*/
revoke all
on db52 -- base de datos. Tambien en tabla, etc.
from visitante@localhost;

/* Privilegios administrativos */
grant all -- Concedemos todos los privilegios
on *.* -- Para todas las bases de datos
to operador@localhost identified by 'OP'
with MAX_CONNECTIONS_PER_HOUR 3 -- Hasta tres sesiones abiertas simultaneas
MAX_QUERIES_PER_HOUR 300 -- Máximo de 300 consultas / hora
MAX_UPDATES_PER_HOUR 30; -- Máximo de 30 actualizaciones / hora


13/2/15

Lenguaje de marcas. Blog

13:24 Posted by Inazio No comments
Vamos a realizar un blog.

Para ello, nos concetamos a PHPMyAdmin y generamos una tabla con los siguientes valores


Lo siguiente será realizar nuestra página web.

Creamos:

- index.php
- insertarEntrada.php ( a su vez contendrá un formulario con titulo y cuerpo, y un botón con enviar).

El resultado de realizar esta consulta (la de insertarEntrada) la mostrará en distintos artículos.

<article>
     <h1>$titulo</h1>
     <p>$cuerpo</p>
     <p>$fecha</p>
</article>

Esto será dinámico, lo demás estático. Ergo dentro del código estático crearemos un for que haga las llamadas para visualizar tantas entradas como tengamos.

Abrimos un NetBeans y creamos un proyecto nuevo, llamado

Códigos de los archivos:

index.php


Estoy teniendo muchos problemas con el NetBeans. He tenido que reiniciar, me he desenganchado de la explicación, no puedo acceder al FTP para copiar lo que han hecho hasta ahora y ponerme al día y me está entrando muy mala hostia.

Voy a atender a lo que pueda y seguiré con este ejercicio en cuanto pueda conseguir acceso

Programación. Introducción a ADA

8:52 Posted by Inazio , No comments

Características generales

è   Lenguaje de propósito general
è   Es profesional (complejo, no pensado para aprendices)
è   Incorporación de puntos clave de la teoría de la programación
·        Legibilidad. Evita notación demasiado concisa (es más costoso el mantenimiento que la producción de software. “Un programa se lee más veces de las que se escribe”).
·        Fuerte y esteticamente tipado. Gran cantidad para definir datos de tipos diferentes. Cada dato puede usarse sólo en operaciones específicas de su tipo. La utilización inadecuada se detecta en tiempo de compilación.
·        Diseño a gran escala. Programación modular. Mecanismos de encapsulación. Compilación separada.
·        Abstracción de datos. Separación clara entre especificación, representación e implementación.
·        Módulos genéricos
·        Programa concurrente. Descripción de procesos que pueden ejecutarse concurrentemente. Definición de operaciones de sincronización entre esos procesos.
·        Manejo de excepciones. Definición de comportamientos de recuperación ante situaciones de error no previstas.

Escribir en ADA

è   El fichero tendrá extensión .adb
è   ; para finalizar una orden
è   No existen las llaves
è   -- es un comentario
è   with sirve para incluir paquetes
è   procedure [nombre] is es el procedimiento principal, que tendrá el mismo nombre que el archivo fuente.
è   use hace referencia a los paquetes
è   begin es el comienzo del programa
è   put(“”); es para mostrar por pantalla cadenas de texto
è   get(“”); sirve para capturar caracteres
è   constant es usado para la declaración de constantes
è   while loop  / end loop es para condiciones de mientras que…
è   if
            then
end if                         es usado para condiciones de si…
è   /= distinto de
è   := Asignación
è   = Comparación

Compilación en ADA 

Para compilar debes instalar el gnat.

Para su instalación, escribe:
è   sudo apt-get update (para actualizar repositorios)
è   sudo apt-get install gnat-4.6 (versión hasta la fecha – 10/02/2015)

Para compilar, escribe este comando:
è   gnatmake nombreArchivoSinLaExtensión

E/S Simple

è   text.io – Entrada y salida de caracteres
è   integer_text.io – Entrada y salida de enteros

Reservas

ADA tiene 69 palabras reservadas. Son éstas:

Tipos escalables

pi:constant float:=3.1415; -- Inicializo constante pi con valor de 3.1415
final:constant character:=’.’; -- Inicializo constante final con valor inicial de ‘.’
i, j, k: integer; -- i, j y k son enteros

ADA es fuertemente tipado. No se puede asignar valor a una variable de un tipo diferente.

Subtipos

Caracteriza un subconjunto de los valores de un tipo. No constituye un nuevo tipo (la asignación está permitida).

Tipos definidos por enumeración

Hay dos ya predefinidos. Booleanos y caracteres.

type dia is (lunes, martes, miercoles, jueves, viernes, sabado, domingo);
subtype laboral is dia range lunes..viernes;
d1:dia;d2:laboral;

Atributos

dia ‘first:=lunes; -- Primero
dia ‘last:=sabado; -- Último
dia ‘succ(lunes):=martes; -- Sucesor
dia ‘pred(martes):=lunes; -- Preedecesor
dia ‘pos(lunes):=0; -- Posición
dia ‘val(1):=martes; -- Valor
dia ‘image(lunes):=”LUNES”; -- Convertir a cadena de texto
dia ‘value(“martes”):=martes; -- Convertir cadena de texto al tipo definido

Tipo booleano

type boolean is (false,true);
a,b,c,d:boolean;
((not a) and b) or (c xor d);

Tipos enteros

Hay algunos predefinidos:
è   type integer is …; -- enteros
è   type short-integer is …; -- enteros cortos
è   type long –integer is …; -- enteros largos
è   subtype natural is integer range 0..integer ‘last; -- De 0 en adelante
è   subtype positives is integer range 1..integer ‘last; -- De 1 en adelante

Orde de las propiedades

1.      and, or, xor
2.      not
3.      =, /=, <, <=, >, >=, in, not in
4.      +. – (binarios)
5.     

Tipos reales

type misReales is digits 7;
n:integer;x:float;

-- No se admite aritmetica mixta

n+x -- incorrecto

-- Forma correcta (una de las dos)

float(n)+x
n+integer(x)

La conversion de real a entero aplica un redondeo

Estructuras de control

If

       if
            then …
       end if;

       if
            then …
            else …
       end if;

       if
            then …
            elsif
                        then …
            else …
       end if;

Case

       case … is …
            when … =>…  -- Una opción
            when … | … | … => … -- Varias opciones
            when … .. … => … -- Con rango
            when … => NULL; -- Nulo
            when others => … -- Default
       end case;

Estructuras iterativas

While

       while … loop
            …
       end loop;

For

       for d in dia loop
            …
       end loop;

       for d in reverse lunes..viernes loop
            …
       end loop;
       loop
            …
       end loop;

       loop
            …;
            exit;
            …;
       end loop;

       loop
            …
            exit when…;
            …
       end loop;

Estructuración de control. Subalgoritmos

Procedimientos y funciones

Paso de parámetros:
       in (entrada), out(salida), in out (entrada/salida)

En ADA, por defecto, todas son de entrada.

procedure toto (x:T1;y:in out T2) is
       …
end toto;

toto(e,z); -- Llamada normal
toto(y=>z;x=>e) – Llamada nombrada

Funciones

function factorial(n:natural)
       return natural is
begin
       if n in 0..1
            then return 1;
       else
            return n*factorial(n-1);
       end if;
end factorial;

Existe sobrcarga, puedo llamar a 7 funciones de la misma manera (suma de coches, de motos…), que el compilador distinguirá las funciones por el contexto de los operandos (enteros, reales, vectores).
Es decir, el significado es distinguido por el contexto.

Las funciones y procedimientos deben estar en funciones y procedimientos. Hay jerarquía, y el orden importa.

Vectores

Definiciones restringidas

type t1 is array (1..10) of boolean; -- Vector de 10 posiciones de booleanos

type t2 is array (dia) of t1; -- t2 es vector de posiciones de lunes a sábado que contienen valores contenidos en t1

type t3 is array (lunes..jueves, -10..14) of t1; -- Matriz

x:t1, y:t2, z:t3;

y(i+j);
y(martes);
y(martes)(i+j);
z(martes,i+j);
x(5..8);
y(martes..viernes);

Definiciones no restringidas

type matriz is array (positive range <>. positive range <>) of real; /* range <> es de cualquier rango */

function “+”(a,b:matriz)
            return matriz is
begin .. end “+”;

Atributos relacionados con los índices

function “+”(a,b,matriz)
            return matriz is
   suma:matriz(a'range(1),a'range(2));

begin
            for i in a'range(1) loop
                        for j in a'range(2) loop
                                   suma(i,j):=a(i,j)+b(i,j);
                        end loop;
            end loop;
            return suma;
end “+”;

Constantes de tipos vectoriales

m1:=((1..3=>1.0);(1=>2.0;2=>3.0;3=>4.0));
m2:=mat23’(1=>(1=>1.0;others=>0.0);2=>(2:=1.0,others=>0.0));

Others exige límites conocidos

Tipo no restringido predefinido: strings

type string is array(positive range <>) of character;
x0:string(1..8);
subtype s1 is string(2..8);
subtype línea is string(1..80);

x1:s1;
l:linea;

1(3..10):=x0;
1(2..4:=x0(2..6);
1(1..8):=x0(1..4)&”A”&x1(2..4);

Las constantes tipo cadena entre comillas dobles.
x0 es una cadena de caracteres de longitud exactamente 8

Cadenas à Tamaño exacto. De ocho caracteres exactamente, por ejemplo
Cadena bount it à No tan estrictas. Hasta 8 caracteres

Punteros

type celda;
type enlace is access celda;
type celda is
       record
            valor:integer;
            siguiente:enlace;
       end record;
e:enlace;

e:=new celda;
e.valor:=13;

Liberación de memoria de datos inaccesibles

with unchecked_deallocation;
procedure disponer is new
       unchecked_desallocation(celda,enlace);

e:enlace;
disponer(e);