Guía mínima de Ada 95 |
En la cáusula "use" sólo hay que incluir
"Ada.Strings.Fixed" y "Ada.Strings.Unbounded", ya que las ristras de tamaño
limitado (bounded) necesitan una instanciación para fijar la longitud
máxima antes de poder usarse.
use Text_IO, Ada.Strings.Fixed,
Ada.Strings.Unbounded;
Antes de declarar ristras de tamaño limitado
es necesario instanciar el subpaquete genérico llamado "Ada.Strings.Bounded.Generic_bounded_length"
para el tamaño máximo que se desee (esto se hace para poder
tener instancias para distintas longitudes).
package String_max_10 is
new Ada.Strings.Bounded.Generic_bounded_length(10);
use String_max_10;
Una vez hecho esto se pueden declarar variables de
tamaño limitado (tipo "Bounded_string"), cualificando el nombre
del tipo con el de la instancia definida.
sl1, sl2 : String_max_10.Bounded_string;
--ristras de hasta 10 caracteres
Las ristras de longitud dinámica se declaran
del tipo "Unbounded_string".
sd1, sd2 : Unbounded_string; --ristra
de longitud dinámica
La ristra nula para las ristras de tamaño
limitado está representada por el valor "Null_Bounded_String".
sl1 := Null_Bounded_String.
La ristra nula para las ristras de tamaño
dinámico está representada por el valor "Null_Unbounded_String".
sd1 := Null_Unbounded_String;
También sirve para representar la ristra nula una ristra fija vacía, que se representa mediante dos dobles comillas (""), pero para ello son necesarias las funciones de coversión entre ristras.
La conversión entre ristras limitadas y dinámicas
ha de hacerse a través de ristras de tamaño fijo.
sd2 := to_unbounded_string(to_string(sl1));--conversión
limitada->fija->dinámica
sl2 := to_bounded_string(to_string(sd1));
--conversión dinámica->fija->limitada
Se puede asignar la ristra nula convirtiendo una
ristra fija vacía.
sl1 := to_bounded_string("");
--asigna la ristra nula a sl1
sd1 := to_unbounded_string("");
--asigna la ristra nula a sd1
En las ristras de tamaño fijo, la asignación
sólo puede realizarse entre ristras del mismo tamaño:
sf1 := "1234567890";
Si se necesita asignar una ristra de un tamaño
distinto, se puede emplear la operación "move":
move("prueba", sf1);
La operación "move" admite hasta 5 parametros:
procedure Move (Source
: in String;
Target : out String;
Drop : in Truncation := Error;
Justify : in Alignment := Left;
Pad : in Character := Space
);
|
|
Suponiendo que el usuario introduce la ristra "abcde",
sf1 quedará con el valor "abcde67890".
Asimismo, las ristras de tipo "String" se escriben
con las operaciones "put(X)" o "put_line(X)". La diferencia entre ambas
es que la segunda produce un salto de línea después de escribir
la ristra.
En los otros tipos de ristras, se ha de utilizar
una función llamada "Slice".
function Slice ( Source
: in Bounded_String; --Source también
puede ser del tipo Unbounded_String
Inicio : in Positive;
Fin : in Natural )
return String;
Move(Slice(sl1,1,5),sf2); --copia en sf2 la subristra formada por los caracteres de sl1 desde el 1 al 5
Hay que tener cuidado de que los límites del slice estén comprendidos dentro del rango de índices de la ristra, ya que si no se produciría un error.
Con las ristras de tamaño limitado se puede
utilizar la función "append":
function Append (Left,
Right : in Bounded_String;
Drop : in Truncation
:= Error )
return Bounded_String;
En este caso, la función devuelve la ristra
resultante de concatenar "Left" y "Right". El parámetro "Drop" indica
qué hacer en caso de que la ristra resultante exceda el tamaño
máximo permitido. Los valores posibles de Drop son: "Error" (produce
un error), "Left" (trunca la ristra por la izquierda) y "Right" (trunca
la ristra por la derecha). Existen versiones para concatenar ristras de
tamaño limitado con ristras de tamaño fijo o con caracteres.
Con las ristras de tamaño dinámico
se puede utilizar el procedimiento "append":
procedure Append (Source
: in out Unbounded_String;
New_Item : in Unbounded_String);
En este caso, no se necesita el parámetro "Drop", ya que el tamaño de las ristras no está límitado. Existen versiones de "Append" para concatenar una ristra de tamaño dinámico con una ristra de tamaño fijo o con un carácter, en este orden.
s1,s2 : string(1..5);
s3 : string(1..10);
...
s1 := "12345";
s2 := "abcde" ;
s3 := s1 & s2;
put(Index(s3,"45")); --Se
escribe un 4