Las variables que jamás te declaré…
¡Qué bueno que viniste! Dos años por aquí y aún no he escrito sobre cosas básicas y que interesan de verdad. O el tiempo pasa muy rápido o yo escribo muy lento… casi que la segunda es más probable.
La cosa es que siempre que hablo de programar hablo de las variables. Hasta en S4A lo hago. Los niños lo ven normal, es un lugar dónde guardar información. Pero claro, programando en el IDE de Arduino hay algunas cuestiones que tienes que tener en cuenta. En Arduino o en C++ básicamente. ¿Vamos a verlo?
Las variables de siempre, las variables globales
Por ejemplo, ¿Da lo mismo declarar la variable antes del setup que dentro del setup? ¿Y dentro del loop? ¿Hay alguna diferencia? En un principio no. Seguramente las utilices indistintamente y es algo casi innato. Las creamos según las necesitamos o todas al principio para que no se nos olvide dónde están inicializadas.
Pero en realidad cada una tiene sus propiedades. Vamos al caso que normalmente se ve en Arduino: el de poner todas las variables al inicio del programa. Estas variables se crean al crear el programa y te acompañan durante todo el programa. Las puedes llamar cuando quieras. Sino pruébalo.
Si al inicio de todo declaras una variable y le das el valor 5, cuando llegues al loop y llames a esa variable valdrá 5. Y si la modificas en el loop se quedará modificada para siempre. Parece lógico pero no todas las variables son así…
Es por eso que a estas variables se las llama globales. Porque afectan a todo y las puedes mirar o cambiar en cualquier momento. No pasa eso con todas….
Eso que llaman variables locales…
Ahora pon que declaras una variable en el setup del programa de Arduino. La creas al iniciar y la modificas por ejemplo como un contador para un bucle for. Ahora llamas a esa variable en el loop. ¿Qué pasa?
Lo que sucede es que te da un error porque esa variable no existe… pero tú sabes que existe. Esto es lo que se llama variable local. La razón es porque solamente se utiliza en una función, no es para todas. Quiere decir esto que si la variable se llamaba contador, podrás crear otra variable en el loop llamada contador. Y volver a contar unidades en el bucle for, pero no continuar la cuenta que llevabas en el setup.
Puede parecer raro pero cuando creas una variable en el setup es porque la vas a utilizar solo una vez en el setup y ya está, porque el setup solamente se hace una vez. Puede que esto te vuelva loco pero es así: esa variable desaparece al salir del setup.
Lo mismo pasaría si tú crearas una función propia. Lo que declares dentro de ella será de uso único en esa función. Lo mismo pasa en variables creadas en interrupciones. De hecho, en este caso ¿Qué pasa cada vez que se llama a la interrupción? Imagínatelo: Tengo una interrupción que crea una variable, le suma 4 y vuelve al programa principal. Al volver a la interrupción lo que sucede es que crea una variable encima de la otra: la elimina (en realidad la elimina al salir de la interrupción en sí).
Por lo que si vas al caso del loop, toda variable que crees ahí, cada vez que se entre al loop la variable se destruirá. No es que no la puedas llamar fuera del loop es que dentro del loop, habrá un momento (cuando salga del loop o bucle) que la propia variable expirará, autoimplosionará y renacerá de sus cenizas (me estoy viniendo muy arriba…) para volver en otra variable del mismo nombre pero con un valor inicial distinto al que tenía antes de destruirse.
Información básica sobre Proteción de datos
Responsable ➥ Sergio Luján Cuenca
Finalidad ➥ Gestionar el envío de correos electrónicos con artículos, noticias y publicidad. Todo relacionado con los temas de rufianenlared.com
Legitimación ➥ Consentimiento del interesado
Destinatarios ➥ Estos datos se comunicarán a MailRelay para gestionar el envío de los correos electrónicos
Derechos ➥ Acceder, rectificar y suprimir los datos, así como otros derechos, como se explica en la política de privacidad
Plazo de conservación de los datos ➥ Hasta que se solicite la supresión por parte del interesado
Información adicional ➥ Puedes encontrarla en la política de privacidad y el aviso legal
Todos quietos, casi estáticos…
Ya ves, hay variables que actúan para todo el programa y algunas solamente para una parte de código en especial. Hay variables que existen durante toda la vida del programa y otras que mueren al terminar la función que las creó. ¿Hay variables que no tengan que morir pero que no sean eternas?
Parece que sí. Las static. Si al definir una variable (por ejemplo int inicio=0) le añadimos la palabra static delante lo que sucede es exactamente eso: que no mueren pero no son eternas.
Me explico, una variable estática es una variable que declararás en una función. Pongamos el loop. La creas y es un contador. El contador se reinicia cada vez que entras al loop… si no es una variable estática. La variable estática se queda en standby, esperando a que vuelva la funcón loop y continua con el valor que tenía antes.
No sufre una implosión y se elimina al terminar la función, sino que se mantiene para que puedas seguir utilizándola. Esto es útil para cuentas o valores que no quieres que se pierdan. En Arduino no es común (o al menos no en programación para mortales no lo es) pero puede que estés programando en C++ con varios archivos que se llaman entre sí. Es interesante que ciertas variables compartidas entre los distintos códigos sean estáticas.
Ya que al cambiar de funciones (cada archivo contendrá sus funciones que engloben todo el programa) esas variables no se podrían compartir ya que cada programa actuaría como una función distinta. Así que a pesar de ser globales no valdrían entre diferentes archivos de texto. Y es por eso que necesitarías variables estáticas.
¿Dos años en el blog este?
Así que espero que a partir de ahora les des a las variables la importancia que se merecen y que las declares con cabeza. Recuerda también que a más variables más espacio ocupamos, ¡Tengamos cabeza!
Y nada, te espero en los comentarios y hablamos de variables. De eso o de que llevo dos años con el blog… No espero un regalo pero un tirón de orejas sí, que es gratuito 😉