2010-06-09 23 views
13

A continuación se realiza un cierto código en adaEl uso de IN OUT en Ada

with TYPE_VECT_B; use TYPE_VECT_B; 

    Package TEST01 is 
    procedure TEST01 
      (In_State : IN  VECT_B ; 
      Out_State : IN OUT VECT_B); 

    function TEST02 
      (In_State : IN  VECT_B) return Boolean ; 

    end TEST01; 

La especificación del paquete TYPE_VECT_B y el cuerpo también se define a continuación

Package TYPE_VECT_B is 

    type VECT_B is array (INTEGER range <>) OF BOOLEAN ; 

    rounded_data : float ; 
    count : integer ; 
    trace : integer ; 
    end TYPE_VECT_B; 

    Package BODY TYPE_VECT_B is 
    begin 
    null; 
end TYPE_VECT_B; 

Lo que hace el In_State variable y Out_State significa realmente ? Creo que In_State significa variable de entrada. Me confundo con lo que realmente significa Out_State?

Respuesta

14

Un parámetro in se puede leer pero no escribir en el subprograma. in es el valor predeterminado. Antes de Ada 2012, las funciones solo podían tener los parámetros in. El parámetro real es una expresión.

Un parámetro out implica que el valor anterior no tiene ningún interés. Se espera que el subprograma escriba en el parámetro. Después de escribir en el parámetro, el subprograma puede leer lo que ha escrito. Al salir, el parámetro real recibe el valor escrito (¡hay complicaciones en esta área!). El parámetro real debe ser una variable.

Un parámetro in out es como un parámetro out, excepto que el valor anterior es de interés y puede leerlo el subprograma antes de la asignación. Por ejemplo,

procedure Add (V : Integer; To : in out Integer; Limited_To : Integer) 
is 
begin 
    -- Check that the result wont be too large. This involves reading 
    -- the initial value of the 'in out' parameter To, which would be 
    -- wrong if To was a mere 'out' parameter (it would be 
    -- uninitialized). 
    if To + V > Limited_To then 
     To := Limited_To; 
    else 
     To := To + V; 
    end if; 
end Add; 
+2

Juast como un FYI: la próxima revisión de Ada, Ada 2012, ya no restringirá los argumentos de función para entrar y acceder, es decir, las funciones también tendrán parámetros de entrada y salida. http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai05s/ai05-0143-1.txt?rev=1.3 –

8

Básicamente, cada parámetro de una función o procedimiento tiene una dirección. Las opciones son in, out, in out (ambas) o access. Si no ve uno de ellos, se establece de manera predeterminada en in.

in significa que los datos pueden entrar en la subrutina de la persona que llama (a través del parámetro). Puede leer los parámetros in dentro de la rutina. out significa que los datos pueden salir de la rutina de esa manera, y por lo tanto se le permite asignar valores al parámetro dentro de la rutina. En general, la forma en que el compilador lleva a cabo el paso de datos depende del compilador, lo que está de acuerdo con la filosofía general de Ada de permitirle especificar lo que desea que se haga, no cómo lo quiere hacer.

access es un caso especial, y es más o menos como poner un "*" en la definición de su parámetro en los idiomas Cish.

La siguiente pregunta que suelen tener las personas es "si paso algo grande como un parámetro in, ¿va a insertar todos esos datos en la pila o algo así?" La respuesta es "no", a menos que tus escritores de compilación sean estúpidos. Cada compilador de Ada que conozco debajo del capó pasa por objetos que son más grandes que los que caben en un registro de máquina por referencia. Es el compilador, no los detalles de su mecanismo de paso de parámetros, lo que obliga a no volver a escribir datos fuera de la rutina. De nuevo, le dices a Ada lo que quieres que haga, se da cuenta de la manera más eficiente de hacerlo.

Cuestiones relacionadas