Debe introducir al menos 3 caracteres en el buscador.
Inicio / Wikis / Cursos gratis / Curso de Ada - Punteros a objetos

Curso de Ada - Punteros a objetos

 ****- (10 opiniones)
GNU Free Documentation License Curso gratis de José Alfonso Malo Romero - 16 de Marzo de 2006
Temas Relacionados: Programación estructurada
17. Punteros a objetos
Un nombre está ligado a un objeto desde su declaración hasta que el flujo del programa deja la unidad que contenía su declaración. Sin embargo, los punteros o apuntadores (access) proporcionan acceso a otros 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.

Ejemplos


Por ejemplo, se puede definir un puntero a un tipo entero de esta manera:

type PEntero is access Integer;

En un ejemplo con registros:

declare type TBúfer is record Mensaje: String(1..4); Prioridad: Integer; end record; type PTBúfer is access TBúfer; Mensaje1, Mensaje2: PTBúfer; begin Mensaje1 := new TBúfer; -- Se crea un objeto de tipo TBúfer. Mensaje2 := new TBúfer'(Prioridad => 2, Mensaje => "Hola"); -- Con all se puede desreferenciar el puntero. -- Mensaje1 es un puntero y Mensaje1.all es el registro. Mensaje1.all.Prioridad := 3; -- Sin embargo, al acceder a campos del registro la desreferenciación -- puede hacerse implícita y .all es opcional en esos casos: Mensaje1.Prioridad := 3; end;

Es útil para implementar listas, colas, árboles y grafos. Por ejemplo:

declare -- TNodoÁrbolBinario se necesita para definir el puntero. type TNodoÁrbolBinario; -- Se declara después. type PTNodoÁrbolBinario is access TNodoÁrbolBinario; type TNodoÁrbolBinario is record RamaIzda: PTNodoÁrbolBinario; Dato: Float; RamaDcha: PTNodoÁrbolBinario; end record; ÁrbolBinario: PTNodoÁrbolBinario; begin -- Se crea la raíz del árbol binario. ÁrbolBinario := new TNodoÁrbolBinario'(null, 1.0, null); end;

Liberación de memoria


Cuando se quiera liberar la memoria dinámicamente, hay que hacer uso del procedimiento genérico Ada.Unchecked_Deallocation [[http://www.adaic.org/standards/95lrm/html/RM-13-11-2.html#I4441 [1]]], por ejemplo:

with Ada.Unchecked_Deallocation; procedure Ejemplo_Liberar_Memoria is type TVector is array (Integer range <>) of Float; type PVector is access TVector; PV: PVector; procedure Liberar_Vector is new Ada.Unchecked_Deallocation (TVector, PVector); begin PV := new TVector(1..10); PV.all := (others => 0.0); -- ... Liberar_Vector (PV); -- La memoria es liberada y PV es ahora null 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.

Este sistema es similar al de C++ con new y delete. Un sistema de recolección de basura similar al de Java está previsto en el estándar, pero ningún compilador de Ada hasta el momento lo proporciona. Esto es debido a que aunque es un mecanismo más seguro, es menos eficiente y puede ser un problema para los sistemas de tiempo real por su impredictibilidad.

En Ada 95 existen métodos de gestión de memoria más seguros que el uso directo de Unchecked_Deallocation basados en los tipos controlados, algo semejante a lo que se consigue en C++ con constructores y destructores que manejan memoria dinámica.

Manual de referencia de Ada


Tabla de contenidos
  1. 1 - Introducción
  2. 2 - Historia
  3. 3 - Manual de referencia
  4. 4 - Instalación
  5. 5 - Hola Mundo
  6. 6 - Elementos del lenguaje
  7. 7 - Tipos
  8. 8 - Enteros
  9. 9 - Enumeraciones
  10. 10 - Coma flotante
  11. 11 - Coma fija
  12. 12 - Arrays
  13. 13 - Strings
  14. 14 - Registros
  15. 15 - Registros discriminados
  16. 16 - Registros variantes
  17. 17 - Punteros a objetos
  18. 18 - Punteros a subprogramas
  19. 19 - Tipos derivados
  20. 20 - Tipos etiquetados (orientación a objetos)
  21. 21 - Subtipos
  22. 22 - Objetos (variables y constantes)
  23. 23 - Atributos
  24. 24 - Expresiones
  25. 25 - Operadores
  26. 26 - Sentencias y estructuras de control
  27. 27 - Subprogramas
  28. 28 - Sobrecarga
  29. 29 - Entrada/salida
  30. 30 - Pragmas
  31. 31 - Interfaz con otros lenguajes
  32. 32 - Diseño y programación de sistemas grandes
  33. 33 - Paquetes
  34. 34 - Clausula use
  35. 35 - Clausula with
  36. 36 - Paquete Standard
  1. 37 - Declaraciones
  2. 38 - Ámbito
  3. 39 - Visibilidad
  4. 40 - Renombrado
  5. 41 - La biblioteca Ada (unidades y subunidades)
  6. 42 - Unidades de biblioteca
  7. 43 - Unidades hijas
  8. 44 - Subunidades
  9. 45 - Compilación separada y dependiente
  10. 46 - Tipos abstractos de datos
  11. 47 - Tipos limitados
  12. 48 - Unidades genéricas
  13. 49 - Excepciones
  14. 50 - Paquete Ada.Exceptions
  15. 51 - Concurrencia
  16. 52 - Tareas
  17. 53 - Sincronización de tareas mediante puntos de entrada o citas (entry)
  18. 54 - Aceptación de citas (accept)
  19. 55 - Selección de citas (select)
  20. 56 - Llamadas a punto de entrada complejas
  21. 57 - Tareas dinamicas: creación dinamica de tareas (tipos t
  22. 58 - Dependencia de tareas
  23. 59 - Ejemplos de tareas
  24. 60 - Programación distribuida con GLADE
  25. 61 - Novedades de Ada 2005
  26. 62 - Unidades predefinidas
  27. 63 - Paquete Ada.Strings.Fixed
  28. 64 - Paquete Ada.Strings.Unbounded
  29. 65 - Paquete Ada.Text_IO
  30. 66 - Paquete Ada.Text_IO.Editing
  31. 67 - Paquete Ada.Float_Text_IO
  32. 68 - Paquete Ada.Sequential_IO
  33. 69 - Paquete Ada.Command_Line
  34. 70 - Paquete Interfaces
  35. 71 - Recursos en la Web
Autor y licencia de 'Curso de Ada - Punteros a objetos'
José Alfonso Malo Romero Extraído de: http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_Ada_/_Introducci%C3%B3n GNU Free Documentation License
El contenido está disponible bajo los términos de GNU Free Documentation License
Licencia GNU Free Documentation License: http://www.gnu.org/copyleft/fdl.html
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.

Wikis relacionados con 'Curso de Ada - Punteros a objetos'

UML (Unified Modeling Language) es un lenguaje que permite modelar, construir y documentar los elementos... Más »
Excelente curso de iniciación a la astronomía para aquellos que quieran aprender sobre esta apasionante... Más »
El “hablante ingenuo”, es decir, aquel que no reflexiona expresamente acerca de su lengua, mantiene... Más »
Este es un curso tremendamente completo, guiado y con ejemplos y prácticas pensadas para convertirlo... Más »
La idea de este curso surgió de varias conversaciones entre amig@s de la cuadrilla y... Más »
Gente Wiki
Rodrigo Alberto Ramirez Z
Soy medico, graduado en la universidad de antioquia,medellìn colombia, suramerica, me gusta la medicina alternativa, de la cual practico la...
Geriatría
Catherine Osorio Davila
Soy psicologa empresarial, tengo diplomados en gerencia en salud ocupacional, alta gerencia empresarial, cursos en gerencia de procesos de salud,...
Riesgos laborales, Seguridad en la construcción,...
Cristián Fernando Pedrals Ormeño
Soy emprendedor informático, estoy creando una empresa para tv-digital, análisis de riesgo informático y sistemas web.
Jaime Agustin
D. Jaime Sánchez responsable de la implementación del programa de Robótica Educativa y Certificación de Microsoft Office, así mismo...
Karmen De La Vega
Hola, soy licenciada en comunicación y tengo una maestria en tecnología educativa. Trabajo en educación a distancia y en calidad...
Axel
Estudié psicólogía e idiomas, soy profesor de francés e inglés pero me gusta aprender otros, en particular de manera autodidacta....
Antropología, Botánica,...
Suscribirse
¿Estás seguro de que deseas eliminar este capítulo?