next up previous contents
Siguiente: Parámetros Subir: Procedimientos y funciones Anterior: Variables locales   Índice General

Ambitos y visibilidad

Ada establece unas normas rígidas que regulan el acceso a todas las variables de nuestro programa. Estas normas se pueden simplificar en dos:

  1. Todo subprograma tiene visibles sus variables y las variables de todos los subprogramas que lo engloban.
  2. Si en este recorrido hay varias variables con el mismo nombre (identificador), tendremos acceso a la primera variable visible (avanzando desde el subprograma hacia los subprogramas que lo engloban).

Por ejemplo, si tenemos un programa con la siguiente estructura:

      procedure P1 is
         V1 : Integer;

         function P2
            return ...
         is
            V2 : Integer;

            procedure P3 is ...
                V1 : Float;
            begin
               ...
            end P3;

            function P4
               return ...
            is
               V4 : Integer;
            begin
               ...
            end P4;

         begin
            ...
         end P2;

      begin
         ...
      end P1;

El procedimiento P3 puede utilizar su variable (V1, de tipo Float) y la variable de P2 (V2, de tipo Integer). Sin embargo, no podrá acceder nunca a la variable V1 del procedimiento principal P1 (ya que su propia variable, al llamarse igual, le impide ver la de P1). La función P4 puede ver las variables V4, V2 y la V1 del programa principal (no puede ver la V1 de P3 porque P4 no está dentro de P3).

A la hora de realizar las llamadas a los subprogramas, Ada mantiene unas reglas similares:

La segunda regla puede parecer demasiado estricta. Mis programas pueden necesitar que los procedimientos del mismo nivel se llamen entre si. Si queremos que ambos puedan llamarse mutuamente tenemos que añadir una declaración de P4 antes de P3. Esto se hace añadiendo una copia de la cabecera del procedimiento justo antes de P3. Por ejemplo:

   procedure P1 is
      V1 : Integer;

      function P2 is
         V2 : Integer;

         procedure P4;        --  Declaracion nueva

         procedure P3 is ...
             V1 : Float;
         begin
            ...
            P4;       --  Ahora P3 puede llamar a P4
            ...
         end P3;

         procedure P4 is ...
            V4 : Integer;
         begin
            ...
            ...
         end P4;

      begin
         ...
      end P2;

   begin
      ...
   end P1;

De esta forma, como Ada lee el programa de arriba a abajo, cuando comience a leer la función P2 sabrá que más adelante va a encontrarse un procedimiento que se llama P4. Por tanto, cuando vea que P3 llama a P4, lo dará por correcto (porque sabe que está en el programa). Para disponer siempre de esta posibilidad cuando compilemos con la opción de comprobación de estilos deberemos declarar todos los procedimientos antes de poner su código.


next up previous contents
Siguiente: Parámetros Subir: Procedimientos y funciones Anterior: Variables locales   Índice General
Javier Miranda 2002-10-03