Antes que nada quiero decirte que este post está generado como un fichero .ino, el cual te puedes descargar para hacer pruebas de todo lo que voy a indicar, de esa manera no te hace falta ir copiando el código que va a aparecer e ir probando cada uno de estos elementos dentro de un Sketch que tengas que fabricarte, ya está fabricado y lo puedes ver en tu IDE de Arduino.
El scope o ámbito es dónde vive tu función, constante, variable u objeto, y esto se puede modificar o controlar ligeramente.
El ámbito puede ser global o local, pero esto puede ser cambiado.
#include <Arduino.h>
String soyGlobal = "Si, soy una variable global";
Esta variable global la puedes usar a lo largo de todo tu Sketch o programa, como lo quieras llamar, porque está definida para que se use globalmente, y eso ocurre porque no está dentro de nada, está suelta.
Lo mismo ocurre con una función, declararé dos funciones, las cuales voy a llamar 'Tony' y 'Luis', que somos mi hermano y yo. Luego verás por qué nosotros
void Tony(){
String mensaje = "Hola, soy Tony, el que ha escrito esto";
Serial.println(mensaje);
}
void Luis(){
String mensaje = "Hola, soy Luis, el hermano del que ha escrito esto";
Serial.println(mensaje);
}
Dentro de estas funciones hay dos variables que son locales, su ámbito es local, y por eso, el compilador no da ningún error al traducirlo, porque sabe perfectamente cual es la variable mensaje de 'Tony' y mensaje de 'Luis', conoce su ámbito, ambas viven perfectamente dentro de mi hermano y de mí y no molestan a nadie.
Supongamos que estamos en Requena, el pueblo de mis padres, y resulta que, casualidad de la vida (cosas de pueblos pequeños españoles), mis primos, hijos de un primo de mi hermano, se llaman también Tony y Luis
void Tony(){
String mensaje = "Hola, soy Tony, el primo del que ha escrito esto";
Serial.println(mensaje);
}
void Luis(){
String mensaje = "Hola, soy Luis, el primo del que ha escrito esto";
Serial.println(mensaje);
}
Te pido que verifiques esto en tu IDE de Arduino y verás que te va a dar varios errores, en concreto te dirá:
FIledebug:52:6: error: redefinition of 'void Tony()'
y unas cuantas cosas más. Lo importante que que te dice REDEFINITION, es decir, te dice que no sabe de qué Tony estás hablando en la línea 52.
Ahora lo que tienes que hacer es tomar las líneas de la 52 a la 62 y poner delante de ellas las dos barras de comentarios
//
No quiero que las borres para que cuando yo diga la línea tal de aquí en adelante, ambos tengamos las mismas líneas, sino este tutorial será un poco más complicado.
Te quedará algo como esto
//void Tony(){
// String mensaje = "Hol
// Serial.println(men
//}
//
//
//
//void Luis(){
// String mensaje = "Hola
// Serial.println(m
//}
Poco más o menos.
En Requena lo tienen Claro, Mi hermano y yo somos "LOS DE LA BELEN", que es el nombre de mi madre, por el contrario mis primos, son "LOS DEL EUSEBIO", que es el nombre de mi tío.
Ya sabemos todos que mi madre es más famosa que mi padre, pero bueno, eso no lo resuelve Arduino.
Sigamos
BELEN y EUSEBIO son los ámbitos a los cuales los hermanos pertenecemos, igual que los apellidos, pero me gusta más este ejemplo de mi pueblo, así que ahora vamos a declarar bien a mis primos, para eso vamos a establecer un nombre de familia, un apellido, que en C++ (Y por ende en Arduino) se llama 'namespace', o espacio de nombres.
namespace LOS_DEL_EUSEBIO {
void Tony(){
String mensaje = "Hola, soy Tony, el primo del que ha escrito esto";
Serial.println(mensaje);
}
void Luis(){
String mensaje = "Hola, soy Luis, el otro primo del que ha escrito esto";
Serial.println(mensaje);
}
};
Como podrás comprobar, el compilador ya no da ningún error en la declaración de mis primos, porque sabe a que ámbito pertenece cada Tony y Cada Luis.
Ahora vamos a hacer una función para que todo el pueblo de Requena salude:
void RequenaSaluda(){
Serial.println("Requena saluda");
Tony();
Luis();
LOS_DEL_EUSEBIO::Tony();
LOS_DEL_EUSEBIO::Luis();
}
Como verás en las líneas 146 y 147 (por eso te pedí que no las borraras, para tener las mismas líneas ambos), se ha tenido que decir un ámbito adicional, el apellido C++ (namespace para los amigos) y de esa manera, aunque todas las funciones usan la misma variable mensajeadora:
mensaje
no hay duda de cual de todas ellas es la que hay que usar en cada caso.
Esto te permite coger dos trozos de programas de dos programadores diferentes y mezclarlos sin riesgo; imagínate que ambos han definido una variable, constante o objeto que se llama
imprimir
Tendríamos problemas para saber cual de todos tenemos que imprimir.
Vamos a lanzar el sketch y vamos a ver qué pasa
void setup(){
Serial.begin( 9600 );
RequenaSaluda();
}
void loop(){
}
RequenaSaluda.ino (5.08 KB)