21 octubre 2009

Errores de programación, capítulo 5

Llevo una temporada sin escribir. Ando muy atareado con diversos asuntos, como ya os habréis imaginado. Y, claro, ya tengo mis nuevas anécdotas como programador. Algunas se me han olvidado, pero esta no...

Supongamos una función de Visual Basic. Supongamos que tengo una variable global, booleana, llamada, por ejemplo, Supervariable. Ya de por sí, programar con variables globales, aunque sean variables visibles sólo en un formulario, valdría como error de programación, o al menos, como mala práctica de programación, pero cuando hay prisa...

Bien. Yo necesitaba ejecutar una función, que devolvería un valor u otro, con la sentencia Return, en función de determinadas circunstancias. Y cumpléndose ciertas condiciones, debería dar un valor True o False a la variable Supervariable. Pues bien... No había manera... Supervariable no cambiaba de valor ni de broma, siempre tenía el original (True, creo). Tras cerca de una hora, revisando el código, veo cambiarle de valor a tal variable, se hacía sólo en un par de líneas, y se hacía correctamente. Esas líneas eran tales que así (el código es inventado):

If Condicion1>5 then
' Calcular el valor de Aux...
Return Aux
' Y cambiar el valor de Supervariable
Supervariable=False

Else
' Calcular el valor de Aux cuando no se cumple que Condicion1 sea mayor que 5
Return Aux
' Y cambiar el valor de Supervariable
Supervariable=False

End If

¡Por supuesto! Dejad de leer si queréis adivinar cuál es el fallo... La solución unas líneas más abajo. Supongo que debería descansar un poco más, desconectar, relajarme algún día a la semana, y entonces, no tendría estos fallos tan absurdos.





SOLUCIÓN: A ver. La sentencia Return dentro de una función, devuelve, como resultado de la ejecución de la misma, el valor que ésta dará lugar al ser llamada. Así, si escribo:

Return 1

la función devolverá 1. Además, Return acaba la ejecución de la función en ese mismo punto.

Entonces... ¡¡todo el codigo que ponga inmediatamente a continuación de una sentencia Return no se ejecutará nunca!! Por eso nunca se modificaba Supervariable; la función terminaba su ejecución en la línea anterior.

3 comentarios:

Liem Dazkun dijo...

YUPI, lo hacerte a la primera xD

Me alegro de verte nuevamente en acción, un saludo.

Juan dijo...

Hola

Ja, ja, ja... Era fácil... Es que estoy fatal, cada día rindo menos.

Yo también me alegro de verte por aquí :-)

Un saludo.

Juan.

Mary dijo...

pues a mi me gusta programar con variables globales, aunque al final siempre me termine haciendo bolas.