19 septiembre 2014

Pascal - 5b: Definición de tipos

5.2. Definición de tipos.

El "tipo" de una variable es lo que determina qué clase de valores podremos guardar en ella. En los programas que hemos creado hasta ahora, el "tipo" es lo que indicamos junto al nombre de una variable cuando la declaramos. Por ejemplo,
var PrimerNumero: real;
indica que vamos a usar una variable que se va a llamar PrimerNumero y que almacenará números reales (con decimales), mientras que
const intentos: integer = 3;
indica que vamos a usar una variable llamada intentos, que guardará números enteros y que tendrá como valor inicial 3.
También podemos crear nuestros tipos de datos, a partir de los tipos básicos que permite el lenguaje, usando la palabra "type". Así, por ejemplo, podemos crear una nueva versión del ejemplo de "array de records" del apartado 4.3.3, definiendo
(* ARR_REC2.PAS, "array" de varios "record" *)
(* Segunda version, con "const" y "type"    *)
(* Parte de CUPAS5, por Nacho Cabanes       *)
 
program RecordArray2;
 
const
    maxDatos = 10;
 
type
    ficha = record
        nombre: string[30];
        edad: byte;
    end;
 
var
    datos: array [1..maxDatos] of ficha;
 
begin
    datos[1].nombre := 'Ignacio';
    datos[1].edad := 23;
    write('El primer nombre es ', datos[1].nombre );
    write(' y la primera edad ', datos[1].edad);
end.
 
 
(* Resultado:
El primer nombre es Ignacio y la primera edad 23
*)
 
Esto añade legibilidad, pero no es imprescindible. Entonces... ¿no será necesario definir tipos? Sí, en algunas circunstancias concretas sí será necesario. Un primer ejemplo en cuando tenemos dos variables declaradas de igual forma en distintas partes del programa, como en este ejemplo:
(* TIPOS1.PAS, asignacion INCORRECTA de tipos *)
(*            No compila !!!                  *)
(* Parte de CUPAS5, por Nacho Cabanes         *)
 
program Tipos1;
 
var
    ficha1: record
        nombre: string;
        email: string;
        anyoNacimiento: integer;
    end;
 
    ficha2: record
        nombre: string;
        email: string;
        anyoNacimiento: integer;
    end;
 
begin
    ficha1.nombre := 'Pepe';
    ficha1.email := 'p@p.com';
    ficha1.anyoNacimiento := 1990;
 
    ficha2 := ficha1;
    writeLn( ficha2.nombre );
end.  
 
Aunque a nuestros ojos parezca que ambas variables son del mismo tipo, para el compilador no es así, de modo que el programa anterior no compilar correctamente.
Podríamos declarar ambas a la vez, de la siguiente forma:
var
    ficha1, ficha2: record
        nombre: string;
        email: string;
        anyoNacimiento: integer;
    end;
pero eso no servirá si las variables están en zonas separadas del programa (algo que nos empezará a ocurrir pronto). En ese caso, no habrá más remedio que crear un nuevo tipo de datos, y declarar ambas variables como pertenecientes a dicho tipo:
(* TIPOS2.PAS, asignacion correcta de tipos *)
(* Parte de CUPAS5, por Nacho Cabanes       *)
 
program Tipos2;
 
type TipoFicha = record 
        nombre: string;
        email: string;
        anyoNacimiento: integer;
    end;
 
var
    ficha1: TipoFicha;
    ficha2: TipoFicha;
 
begin
    ficha1.nombre := 'Pepe';
    ficha1.email := 'p@p.com';
    ficha1.anyoNacimiento := 1990;
 
    ficha2 := ficha1;
    writeLn( ficha2.nombre );
end.  
 
Y habrá más casos en los que sea imprescindible declarar tipos, como cuando vayamos a volcar nuestros "record" a fichero, pero eso lo veremos más adelante.