Llamada a una función
Se llama a una función cuando se menciona su nombre en una expresión. Tras el nombre, debe haber un par de paréntesis, en los que se indican los argumentos correspondientes a los parámetros de la función (si existe una lista de parámetros en su definición), separados por comas.
Un poco más adelante examinaremos el tipo puntero de función, que permite crear variables que apunten a una función con características específicas, y luego llamarla no por su nombre, sino a través de esta variable.
Siguiendo con el ejemplo de la función Fibo, vamos a llamarla desde la función OnStart. Para ello, vamos a crear una variable f en la que almacenar el número resultante, y en su expresión de inicialización indicamos el nombre de la función Fibo y un número entero (por ejemplo, 10) como argumento, entre paréntesis.
void OnStart()
|
No es necesario crear una variable para recibir un valor de una función. En lugar de ello, puede llamar a la función directamente desde una expresión, como «2*Fibo(10)» o «Print(Fibo(10))». A continuación, su valor se sustituirá en la expresión en el lugar de la llamada. Aquí, la variable auxiliar f se introduce para implementar la llamada y devolución de un valor en una sentencia separada.
El proceso de llamada incluye los siguientes pasos:
- Se suspende la ejecución de la secuencia de sentencias de la función de llamada (OnStart);
- El valor del argumento se introduce en el parámetro de entrada n de la función de llamada (Fibo);
- Comienza la ejecución de sus sentencias;
- Cuando está totalmente terminada, devuelve el resultado (recuerde la sentencia return que hay dentro);
- El resultado se escribe en la variable f;
- A continuación, la ejecución de la función OnStart continúa, es decir, el número se imprime en el registro (Print).
Para cada llamada a función, el compilador genera código binario auxiliar (el programador no tiene que preocuparse de ello). La idea de este código es que antes de llamar a la función, coloca la posición actual del programa en la pila, y una vez completada la llamada, la recupera y la utiliza para volver a las sentencias siguientes a la llamada a la función. Cuando una función llama a otra, ésta llama a una función más, la segunda llama a una tercera, y así sucesivamente, las direcciones de retorno de las transiciones a lo largo de la jerarquía de funciones llamadas se acumulan en la pila (de ahí el nombre de pila). A medida que se procesan las llamadas a funciones anidadas, la pila se borrará en orden inverso. Tenga en cuenta que la pila también asigna memoria para las variables locales de cada función.