LENGUAJES DE PROGRAMACIÓN  
 
 
FreePascal

PASCAL CON FREE PASCAL

 
 

 

2.9. Tipos de datos subrango.

 

anterior :: indice :: siguiente

 

Los tipos de datos subrango, son rangos de valores, que se deben definir a partir de un tipo de dato enumerado, carácter o números Enteros. Los subrangos se declaran, separando con dos puntos seguidos los datos que determinan el inicio y final del intervalo. Los valores que se asignen a un tipo de dato subrango, deben estar comprendidos en el intervalo durante la ejecución del programa. A continuación un ejemplo:

 

 
{$codepage UTF8}

TYPE
  DiaSemana  =  (Lunes,Martes,Miercoles,Jueves,Viernes,Sabado, Domingo);
  DiasTrabajo  = Lunes..Viernes;
  Mayusculas  = 'A'..'Z';
  Minusculas  = 'a'..'z';

VAR
  m:Mayusculas; 
  x:DiasTrabajo;

BEGIN
  Write('Ingrese  una mayuscula');
  readln(m);
  Writeln(m);
  Readln()
END.
 

Código fuente 18: Uso del tipo de dato subrango.

 

Las rutinas read y readln no trabajan con subrangos de tipos de datos enumerados. En el ejemplo anterior se puede hacer lectura de la variable m, ya que sus datos son subrango de un tipo de dato carácter. Sólo se pueden crear subrangos de números enteros, desde -9223372036854775808 hasta 9223372036854775807, que es el rango usado para el tipo de dato int64. Los tipos de datos longint, integer, shortint, byte y word son definidos como subrangos  del tipo de dato int64. Las rutinas read y write se pueden usar con subrangos de números enteros. Los subrangos de números enteros también se pueden definir usando valores hexadecimales. Ejemplo:

 

 
{$codepage UTF8}

TYPE
  TNum  = -9223372036854775808..9223372036854775807;
  HNum  = $00 .. $FF; 

VAR
  n01:TNum; 
  n02:HNum;

BEGIN
  n01:=9223372036854775807;
  Writeln(n01);
  n01:=-9223372036854775808;
  Writeln(n01);
  n01:=548;
  Writeln(n01);
  n02:=200;
  Writeln(n02)
END.

Código fuente 19: Subrango de números enteros.

 

Para los subrangos de un tipo de dato carácter, se pueden crear subrangos usando el símbolo #, tanto en decimal como hexadecimal. Pero sólo se pueden asignar caracteres entre comillas simples a los subrangos comprendidos desde #0 hasta #255, o un rango menor al indicado, o mejor dicho rangos de 1 byte. Ejemplo:

 

 
{$codepage UTF8}

TYPE
 ALetras=#0..#127;
 AELetras=#0..#255;
 ULetras=#0..#65535;

VAR
 a:ALetras;
 b:AELetras;
 c:ULetras;

BEGIN
 a:='~'; 
 Writeln(a);
 b:='ó';       
 Writeln(b); 
 b:='€';
 Writeln(b);
// c:='€';     //no es posible el rango es mayor a 255
// Writeln(c)
// c:='~';     //no es posible el rango es mayor a 255
// Writeln(c) 
 c:=125;
 Writeln(c);
END.                         

Código fuente 20: Subrangos de caracteres.

 

Se debe tener en cuenta, que al usar subrangos de un tipo de dato carácter, el subrango se comporta como un tipo de dato char, usando de esta manera el administrador de caracteres cuando asignamos caracteres UTF8. También se puede observar en el ejemplo que se ha creado un subrango ULetras. Cuando se crean subrangos mayores a 255, el comportamiento será como el de un subrango de número enteros, es por eso que no se puede asignar € y ~, a la variable c, y sólo se pueden asignar números enteros. Cuando se definen subrangos que usen caracteres en UTF8 de longitud mayor a 1 byte, como por ejemplo:

 

NCirculos='➀'..'➉';

AELetras='!'..'ÿ';

 

Se considerarán estos subrangos, como subrangos de números enteros de dos bytes, por lo que no se podrá asignar caracteres de 1 byte, a los mismos. Es decir el rango de NCirculos en UTF8 sería desde $E29E80 hasta $E29E89, el compilador lo convertirá a su equivalente UTF16, es decir el rango sería desde $2780 hasta $2789, al ser de 2 bytes, sólo se podrá asignar valores numéricos y el compilador lo considerará como un subrango de números enteros, lo mismo sucede con AELetras en donde el rango sería desde $21 hasta $C3BF en UTF8, y su equivalente en BMP sería desde $0021 hasta $00FF, y el compilador considerará a este subrango como un subrango de números enteros, a pesar de que el rango puede entrar en 1 byte, esto es debido a que el carácter ÿ en UTF8 se codifica con 2 bytes. Ejemplo:

 

 
{$codepage UTF8}

TYPE
 AELetras='!'..'ÿ';     //En UTF8  sería desde #$21 hasta #$C3BF
                        //En UTF16 sería desde #$0021 hasta #$00FF 
 NCirculos='➀'..'➉';    //En UTF8  sería desde #$E29E80 hasta #$E29E89
                        //En UTF16 sería desde #$2780 hasta #$2789
VAR
 b:AELetras;
 c:NCirculos;

BEGIN
  b:=164;
  Writeln(b);          //se comporta como un subrango de numeros enteros
  
  c:=8354;
  Writeln(c);          //se comporta como un subrango de numeros enteros
END.                 

Código fuente 21: Subrango de caracteres en UTF8.

 

anterior :: indice :: siguiente

 

 
 

  SUGERENCIAS