Devolver valores
Las funciones pueden devolver los valores de tipos integrados, estructuras con campos de tipos integrados, así como punteros a funciones y punteros a objetos class. El nombre del tipo se escribe en la definición de la función antes del nombre. Si la función no devuelve nada, se le debe asignar el tipo void .
Para devolver una función de array debe utilizar parámetros pasados por referencia (véase Parámetros de valor y parámetros de referencia).
Se devuelve un valor utilizando la sentencia return en la que se especifica una expresión después de la palabra clave return. Puede utilizarse cualquiera de las dos formas:
return expression ; |
o
return ( expression ) ; |
Si la función es del tipo void, la sentencia return se simplifica:
return ; |
La sentencia return no puede contener ninguna expresión dentro de la función void: el compilador generará un error «'return' - función 'void' devuelve un valor».
Para este tipo de funciones, en teoría, no es necesario utilizar return al final del bloque con el cuerpo de la función. Lo hemos visto en el ejemplo de la función OnStart .
Si la función tiene un tipo distinto de void, entonces la sentencia return debe ser obligatoria. Si no está presente, se producirá el error de compilación «no todas las rutas de control devuelven un valor».
int func(void)
|
Es importante tener en cuenta que el cuerpo de una función puede tener varias sentencias return. En concreto, en caso de salidas anticipadas por condición. Cualquier sentencia return interrumpe la ejecución de la función en el lugar donde se encuentra.
Si una función debe devolver un valor (porque no sea del tipo void) y no se especifica en el operador return, el compilador generará el error «la función debe devolver un valor». A continuación se ofrece la versión correcta para el compilador de la función func (FuncReturn.mq5).
int func(void)
|
Si el valor devuelto difiere del tipo de función especificado, el compilador intentará una conversión implícita. En caso de que los tipos requieran una conversión explícita se generará un error.
Para devolver un valor se crea de forma implícita una variable temporal y se pone a disposición del código de llamada.
Después de que veamos los tipos de objetos (véase el capítulo sobre Clases) y la capacidad de devolver punteros a objetos desde las funciones, volveremos a analizar cómo pasarlos de forma segura. A diferencia de C ++, las funciones en MQL5 no son capaces de devolver referencias. Si se intenta declarar una función con un ampersand en el tipo de resultado se produce el error «'&' - no se puede utilizar la referencia».