Pascal: estructuras de datos
Historia

tipos definidos por el usuario

nombres de tipos definidos

evaluación

arreglos

récords

variant records

apuntadores

Equivalencia de tipos

 

 




tipos de datos primitivos

  • real
  • integer
  • boolean
  • character 

tipos definidos por el usuario

  • por enumeración: type sex = (masc, fem);
  • por especificación de intervalo: type minuto = 0..59;
  • por definición de conjunto: type diasClase: set of (lu,ma.mi,ju,vi);

nombres de tipos definidos

  • declarar tipo con nombre: type vector = array [1..100] of 0..24; y después declarar var v1 : vector; 
  • declarar  tipo anónimo en la declaración de una variable: var v1: array [1..100] of 0..24;

operaciones sobre conjuntos: d1,d2, d3 : set of (lu,ma.mi,ju,vi);

  • + unión; d3 := d1 + d2;
  • * intersección; d3 := d1 * d2;
  • := asignación, constructor; d1 := [ma,ju];
  • - resta; d3 := d1 - d2;
  • in  miembro_de; IF ma in d1 THEN ......
  • <= condición de subconjunto; IF d1 <= d2 THEN ....
  • = condición de igualdad; IF d1 <= d2 THEN ....

evaluación

  • contribuyen a mayor seguridad: el compilador puede identificar más errores: puede enviar mensajes de error más informativos; cotejo de intervalo a la hora de compilación, pero no a la hora de ejecución
  • hay implementación eficiente: en n bits se puede representar una enumeración o un range de 2n valores
  • le permiten al programador expresarse a un nivel más alto, en la terminología del problema.
  • elegancia

arreglos

  • agrupación de datos homogéneos
  • arreglos de una sola dimensión
  • se especifica el tipo del index: cualquier tipo discreto y finito
  • se especifica el tipo de los elementos: cualquier tipo; así que se pueden definir arreglos de arreglos: var xyz: array [0..20] of array [2..25] of (blue,green,red);
  • selección de componente (nombre[i]) es dinámico: el compilador no sabe a que componente se va a accesar
  • en Pascal, arreglos son estáticos; dimensiones no pueden variar a la hora de ejecución. ¿Porqué? Pascal tiene un sistema fuerte de tipos de datos: el compilador tiene que conocer el tipo de cada dato; las dimensiones de un arreglo son parte de su tipo. Así que las dimensiones de un arreglo tienen que poderse determinar a la hora de compiulación.

consecuencia: si tengo un procedure que suma un arreglo de tipo array [1..10] of real; el comp;lador no va a permitir ni que le pase un arreglo definido como array [0..9] of real !!!! No puedo escribir un proc que me sume un arreglo de reales de dimensiones arbitrarias. (ISO Pascal lo resuleve con conformant arrays).

récords

  • de COBOL a Pascal a C
  • agrupación de datos heterogéneos (arreglo: homogéneo)
  • selección de componente (variable.campo) es estático: el compilador sabe a que componente se va a accesar
  • declaración de un tipo de récord con nombre  (type r1 = record ......end;) , o un tipo anónimo (var v1: record ........end;)
  • comparación y asignación de récords del mismo tipo (S := R; If S=R .....

         

variant records

  • cuando hay subtipos, cada uno con sus propios datos: todos los empleados tienen un número de empleados y una fecha de nacimiento, algunos tienen horas tarbajadas y pagoPorHora, otros tienen salarioMensual. En lugar de crar un tipo de record con campos para todos los atributos, se puede usar un variant record:

       

apuntadores 

dynamic variable: a variable whose address is determined when the program is run. In contrast, a static variable has memory reserved for it at compilation time.

heap: an area of memory reserved for data that is created at runtime -- that is, when the program actually executes. In contrast, the stack is an area of memory used for data whose size can be determined when the program is compiled.

new: creates a new dynamic variable and sets a pointer variable to point to it

  • apuntadores tienen tipo:  var p: ^real; declara una variable p que contiene no simplemente una dirección, sino la dirección de un real!

                       

  • listas, árboles, programación de sistema

      

  • la declaración de la variable (var A : nodePrt) crea espacio para una variable que va a tener un apuntador (a una estructura de tipo nodePtr)
  • el new(A) asigna memoria para una estructura nodePtr y pone la dirección de ella en la variable A
  • variables que tienen su propio nombre (A,B,C del ejemplo): memoria se asigna en el AR a la hora d elaboración del bloque
  • variables que no tienen nombre propio (los records de tipo node): se les asigna memoria en el heap cuando se ejecuta el new. ¿Por qué? El new(A) podría estar en un ciclo que ejecuta un numero de veces que no se sabe a la hora de compilación. El compilador no puede reservar espacio en el AR. 
  • el heap es un bloque de memoria que lo maneja el run-time system para guardar datos que surjan durante la ejecución. En el heap se asigna y se  libera memoria en un orden no-predefinido. 
  • En Pascal el programa puede (debe) liberar memoria en el heap que ya no se necesita, por ejemplo: dispose(A). Cuando se llena el heap disponible, Pascal da un HEAP OVERFLOW

Equivalencia de tipos

¿Cuándo dos variables o expresiones son del mismo tipo?

        

  • equivalencia de nombre: cuando se han declarado con el tipo del mismo nombre
    • si el programador le dió nombre diferente deben ser cosa diferntes
    • fácil de implementar (hay que comprar los nombres)
  • equivalencia de estructura: cuando se han declarado con tipos cuya estructura se declaró en forma idéntica
    • el compilador puede atrapar menos errores
    • facil de implementar (hay que comparar el texto de las declaraciones)