Definición de funciones

Una definición de función consta del tipo de valor que devuelve, un identificador, una lista de parámetros entre paréntesis y un cuerpo, es decir, un bloque de código con sentencias. Los argumentos de la lista están separados por comas. A cada parámetro se le asigna un tipo, un nombre y, opcionalmente, un valor por defecto.

result_type function_identifier ( [parameter_type parameter_identifier
                                       = value_by_default] ,... )
{
  [statement]
   ...
}

Se permite crear funciones sin parámetros: en ese caso no hay lista, y se colocan corchetes vacíos después del nombre de la función (no se pueden omitir). Opcionalmente, puede escribir la palabra clave void entre los corchetes para enfatizar que no hay parámetros. Por ejemplo, así:

void OnStart(void)
{
}

La combinación de tipo de retorno, número y tipos de parámetros de la lista se denomina prototipo o firma de función. Diferentes funciones pueden tener el mismo prototipo.

En secciones anteriores hemos visto ya definiciones de funciones como OnStart y Greeting. Ahora vamos a intentar implementar el cálculo de los números de Fibonacci como función de prueba. Estas cifras se calculan mediante la siguiente fórmula:

f[0] = 1
f[1] = 1
f[i] = f[i - 1] + f[i - 2], i > 1

Los dos primeros números son 1, y todos los números siguientes son la suma de los dos anteriores. Damos el comienzo de la serie: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55...

Puede calcular el número en un índice dado utilizando la siguiente función (FuncFibo.mq5).

int Fibo(const int n)
{
   int prev = 0;
   int result = 1;
   for(int i = 0i < n; ++i)
   {
      int temp = result;
      result = result + prev;
      prev = temp;
   }
   return result;
}

Toma un parámetro n de tipo int y devuelve un resultado de tipo int. El parámetro n tiene el modificador const porque no vamos a cambiar n dentro de la función (una declaración tan explícita de las restricciones sobre los «derechos» de las variables es bienvenida porque ayuda a evitar errores aleatorios).

Las variables locales prev y result almacenarán los valores actuales de los dos últimos números de la serie. En el bucle sobre i calculamos su suma, obteniendo el siguiente número de la secuencia. Previamente, el valor antiguo result se escribe en la variable temp, a fin de que después de la suma se transfiera a prev.

Tras ejecutar el bucle un número determinado de veces, la variable result contiene el número deseado. Lo devolvemos desde la función utilizando la sentencia result.

El parámetro de entrada de una función es también una variable local que se inicializará con el valor real durante la llamada a la función. Este valor se pasa «fuera» de la sentencia con la llamada a la función.

Los nombres de los parámetros deben ser únicos y no deben coincidir con los nombres de las variables locales.

El cuerpo de una función es un bloque de código que define el ámbito y la vida útil de las variables locales. Su definición y principios de funcionamiento se han abordado en las secciones Sentencias de declaración y definición e Inicialización.