Diferencia entre revisiones de «Programación en Ada/Tipos/Punteros a objetos»
Contenido eliminado Contenido añadido
Plantillas |
|||
Línea 10:
objetos, que se pueden crear y destruir dinámicamente.
El nombre de ''access'' en vez del habitual ''pointer'' se debe a que al diseñar Ada se quería huir de la mala fama que los punteros habían creado gracias a lenguajes como C, en los que se puede usar los punteros de manera muy insegura. Los tipos acceso de Ada son más seguros entre otras cosas porque no existe la aritmética de punteros, especialmente peligrosa. Además el uso de punteros en Ada es prescindible en muchas más situaciones que en C.
Las variables de tipo puntero en Ada se inicializan implicitamente a null.
Línea 17:
Por ejemplo, se puede definir un puntero a un tipo entero de esta manera:
{{Ada/Reservada|type}} PEntero {{Ada/Reservada|is}} {{Ada/Reservada|access}} Integer;
En un ejemplo con registros:
{{Ada/Reservada|declare}}
{{Ada/Reservada|type}} TBúfer {{Ada/Reservada|is}}
{{Ada/Reservada|record}}
Mensaje: String(1..4);
Prioridad: Integer;
{{Ada/Reservada|end}} {{Ada/Reservada|record}};
{{Ada/Reservada|type}} PTBúfer {{Ada/Reservada|is}} {{Ada/Reservada|access}} TBúfer;
Mensaje1, Mensaje2: PTBúfer;
{{Ada/Reservada|begin}}
Mensaje1 := {{Ada/Reservada|new}} TBúfer; {{Ada/--
Mensaje2 := {{Ada/Reservada|new}} TBúfer'(Prioridad => 2, Mensaje => {{Ada/"|Hola
{{Ada/--
{{Ada/--
Mensaje1.{{Ada/Reservada|all}}.Prioridad := 3;
{{Ada/--
{{Ada/--
Mensaje1.Prioridad := 3;
{{Ada/Reservada|end}};
Es útil para implementar listas, colas, árboles y grafos. Por ejemplo:
{{Ada/Reservada|declare}}
{{Ada/--
{{Ada/Reservada|type}} TNodoÁrbolBinario; {{Ada/--
{{Ada/Reservada|type}} PTNodoÁrbolBinario {{Ada/Reservada|is}} {{Ada/Reservada|access}} TNodoÁrbolBinario;
{{Ada/Reservada|type}} TNodoÁrbolBinario {{Ada/Reservada|is}}
{{Ada/Reservada|record}}
RamaIzda: PTNodoÁrbolBinario;
Dato: Float;
RamaDcha: PTNodoÁrbolBinario;
{{Ada/Reservada|end}} {{Ada/Reservada|record}};
ÁrbolBinario: PTNodoÁrbolBinario;
{{Ada/Reservada|begin}}
{{Ada/--
ÁrbolBinario := {{Ada/Reservada|new}} TNodoÁrbolBinario'({{Ada/Reservada|null}}, 1.0, {{Ada/Reservada|null}});
{{Ada/Reservada|end}};
==Liberación de memoria==
Línea 64:
procedimiento genérico [[Programación en Ada / Unidades predefinidas / Ada.Unchecked_Deallocation|Ada.Unchecked_Deallocation]] [http://www.adaic.org/standards/95lrm/html/RM-13-11-2.html#I4441], por ejemplo:
{{Ada/Reservada|with}} Ada.Unchecked_Deallocation;
{{Ada/Reservada|procedure}} Ejemplo_Liberar_Memoria {{Ada/Reservada|is}}
{{Ada/Reservada|type}} TVector {{Ada/Reservada|is}} {{Ada/Reservada|array}} (Integer {{Ada/Reservada|range}} <>) {{Ada/Reservada|of}} Float;
{{Ada/Reservada|type}} PVector {{Ada/Reservada|is}} {{Ada/Reservada|access}} TVector;
PV: PVector;
{{Ada/Reservada|procedure}} Liberar_Vector {{Ada/Reservada|is}} {{Ada/Reservada|new}} Ada.Unchecked_Deallocation
(TVector, PVector);
{{Ada/Reservada|begin}}
PV := {{Ada/Reservada|new}} TVector(1..10);
PV.{{Ada/Reservada|all}} := (others => 0.0);
{{Ada/--
Liberar_Vector (PV); {{Ada/--
{{Ada/Reservada|end}} Ejemplo_Liberar_Memoria;
El nombre de Unchecked_Deallocation viene del hecho de que no hay comprobación de que no queden punteros colgantes (''dangling pointers''), es decir que si se ha copiado el puntero en otra variable, después de llamar a Liberar_Vector el puntero copia está apuntando a una dirección de memoria no reservada y los efectos son imprevisibles, puesto que se puede haber reservado y se pude escribir o leer memoria que ya no pertenece a ese objeto.
Línea 86:
== Manual de referencia de Ada ==
*
[[en:Programming:Ada:Types:access]]
|