martes, 8 de noviembre de 2016

Programación del Sinclair QL (VI): Procedimientos y funciones, paso de parámetros



Parámetros por referencia y por valor


Tras tantos años acabo de descubrir un tema que no he visto reflejado en otros lugares, supongo que buscando un poco mas aparecerá, pero usando Q-Emulator con versión del SuperBASIC inglesa JS he probado este programa:

100 CLS
110 a=10
120 b(a)  : PRINT a
130 b a   : PRINT a
140 :
150 DEFine PROCedure b(c)
160   c=c+1
170 END DEFine


Si el paso de parámetros fuera siempre por valor, el resultado debían ser 10 y 10, pero el resultado es  10 y 11. Esto quiere decir que cuando llamamos a un procedimiento o función pasando los parámetros entre paréntesis pasan por valor, pero al pasarlos sin ellos lo hacen por referencia. Esto sería muy bueno si no fuera por que cuando llamamos a un procedimiento o función con mas de un parámetro, no podemos usar los paréntesis en la llamada pues da un error. Seguramente es uno de los famosos errores de la ROM del QL.

Parámetros opcionales


Otro tema que tampoco conocía y también acabo de descubrir es que se pueden usar parámetros opcionales de cierta manera, ya que mientras no los uses en tu programa no dará error:

100 CLS
110 x=5:y=5: b x   :PRINT x,y
120 x=5:y=5: b x,y :PRINT x,y
130 x=7:y=5: b x   :PRINT x,y
140 x=7:y=5: b x,y :PRINT x,y
150 :
160 DEFine PROCedure b(c,d)
170   c=c+1
180   IF c > 6 THEN d=d+1
190 END DEFine 

Esto presentará en pantalla por la línea 110 (6,5),  la 120 presenta (6,5), la 130 muestra (8,6), y al final un error de variable no definida al querer usar la línea 140.

1 comentario: