Práctica 4: Compilador MINICOMP
Versión 10. Funciones.
- Haz las modificaciones necesarias para poder utilizar en las
funciones variables locales y parámetros de tipo real, y para
especificar que una función devuelve un resultado de tipo real.
Un ejemplo de programa válido sería:
funcion area_triangulo(base, altura: real): real es secuencia devuelve base*altura/2; fin secuencia escribe llama area_triangulo(3.0, 5.0); fin
Realiza también las modificaciones necesarias para llevar a cabo una promoción implícita de entero a real en las siguientes situaciones:
- en una llamada a función con un argumento entero para un parámetro real, y
- en una sentencia devuelve con expresión de tipo entero dentro de una función con tipo devuelto real.
Aquí tienes un ejemplo que ilustra el primer caso:
funcion area_triangulo(base, altura: real): real es secuencia devuelve base*altura/2; fin secuencia escribe llama area_triangulo(2, 10); fin
- Haz las modificaciones necesarias para que las funciones permitan
el paso de parámetros por referencia. Cuando en el perfil de una
función se anteponga la palabra reservada pr al
identificador de un parámetro, el argumento correspondiente se
pasará por referencia en vez de por valor. Dicho argumento deberá
ser una expresión con valor-i cuyo tipo deberá coincidir con el
del parámetro. Por ejemplo, mediante la siguiente definición:
funcion f(a, pr b, c: real) : entero
llama f(4.5, r, e) llama f(r, v[0], e) llama f(r, r, e) llama f(v[0], r, 2*e) llama f(r, 4.5, v[0]) llama f(r, r*1, v[0]) llama f(3, e, 5)
Recuerda que cuando en el cuerpo de una función se utilice el identificador de un parámetro por referencia, en realidad se estará accediendo al objeto pasado como argumento. Para implementar ese comportamiento, puede ayudarte almacenar, en el objeto que representa una variable, un indicador de si se trata de un parámetro por referencia o no.
Nota: Consideramos que una expresión tiene valor-i (l-value) si puede utilizarse a la izquierda (left) de una asignación para cambiarle su valor. Ello requiere que tenga asociada una dirección de memoria modificable. Por ejemplo, suponiendo definidas las mismas variables del ejemplo anterior, en las siguientes asignaciones:
r = 9.9; v[0] = 8.8; v = 7.7; llama f(4.5, r, e) = 5; 3 + 4 = 5;
Aclaración para estudiantes repetidores: Respecto del curso pasado hemos movido hasta aquí el apartado 1, que se hacía en la versión 1.
Última actualización: 4 de mayo de 2010.