Parámetros opcionales
MQL5 ofrece la posibilidad de especificar valores por defecto para los parámetros a la hora de describir una función. Para ello se utiliza la sintaxis de inicialización, es decir, un literal del tipo correspondiente a la derecha del parámetro, después del signo '='. Por ejemplo:
void function(int value = 0); |
Al invocar una función pueden omitirse los argumentos de dichos parámetros. A continuación, sus valores se establecerán en sus valores por defecto. Estos parámetros se denominan opcionales (optional).
Los parámetros opcionales deben aparecer al final de la lista de parámetros. En otras palabras: si el i-ésimo parámetro se declara con inicialización, entonces todos los parámetros subsiguientes también deben tenerla. De lo contrario, se muestra un error de compilación «falta el valor por defecto para el parámetro». A continuación se describe una función con un problema de este tipo.
double Largest(const double v1, const double v2 = -DBL_MAX,
|
Hay dos soluciones: o bien el parámetro v3 debe tener también un valor por defecto, o bien el parámetro v2 debe convertirse en obligatorio.
Sólo se pueden omitir argumentos opcionales cuando se llama a una función de derecha a izquierda. Es decir: si la función tiene dos parámetros y ambos son opcionales, al llamarla no se puede omitir el primero pero especificar el segundo. El único valor pasado se comparará con el primer parámetro, y el segundo se considerará omitido. Si faltan ambos argumentos, los paréntesis vacíos siguen siendo necesarios.
Considere la función de encontrar el número máximo de tres. El primer parámetro es obligatorio, los dos últimos son opcionales e iguales por defecto al número mínimo posible de tipo double. Así, cada uno de ellos, en ausencia de un valor explícitamente pasado, será sin duda menor que (o, en casos extremos, igual a) todos los demás parámetros.
double Largest(const double v1, const double v2 = -DBL_MAX,
|
Así es como puede invocarla:
Print(Largest(1)); // ok: 1
|
Con la ayuda de parámetros opcionales, MQL5 implementa el concepto de funciones con un número variable de parámetros en funciones personalizadas.
MQL5 no admite la sintaxis de elipsis para definir funciones con un número variable de parámetros, como hace C++. Al mismo tiempo, existen funciones integradas en la API de MQL5 que se describen mediante elipsis y aceptan un número variable de parámetros arbitrarios. Por ejemplo, se trata de la función Print. Su prototipo tiene el siguiente aspecto: void Print(argument, ...). Por lo tanto, podemos invocarlo con hasta 64 argumentos separados por comas (excluyendo arrays) y los mostrará en el registro.