Funciones
Las funciones te permiten crear piezas modulares de código, de forma que se puedan realizar ciertas rutinas y retornar al área de código desde donde se realizó la llamada a la función. A continuación mostramos un ejemplo de la llamada a una función:
displayNumber(value);
Cuando Arduino ejecuta esta línea, busca la declaración de dicha función en algún lugar del código, y le pasa el valor de la variable "value" como un argumento (contenido entre los paréntesis) a la función. A continuación se muestra un ejemplo de como podría ser la declaración de la función:
void displayNumber(int incomingValue){
printInteger(incomingValue);
// otro código dentro de la función
}
De forma que una función se define por el tipo de valor que devuelve (enlace a declaración de variables), por su nombre, por la lista de argumentos o parámetros que le son pasados (expresión entre paréntesis) y el bloque de código que se ejecuta cuando se realiza la llamada.
El tipo "void" del ejemplo, significa nada e indica que la función no va a devolver ningún valor.
void TomaUnEnteroyDevuelveNada(int unEntero);
Si la función va a devolver valores, se debe indicar su tipo:
int TomaNadayDevuelveUnEntero();
int TomaNadayDevuelveUnEntero(void); // equivale a lo anterior
Los parámetros pasados a la función, deben ser definidos también con sus tipos y nombres, de igual forma a como se definen las variables. (enlace a declaracion de variables)
Dentro de la función, los parámetros y las variables utilizadas se definen como "locales" a la función, es decir se utiliza una memoria local que sólo existe cuando la función se está ejecutando. Dicha característica es un estandar en la mayoría de los lenguajes.
De forma que las variables declaradas fuera de la función, serán consideradas como "globales", es decir, que cualquier función puede acceder a ellas.
Por ejemplo:
/*
multiplica por 3 un número y le sustrae ese mismo numero para conseguir su doble.*/
int Twice(int num) { // argumento tipo entero
int result = num * 3;
result = result - num; // (num * 3) - num = num *2
return(result); ¿?
}´
Y el código que llama a la función es :
int num = 13;
int a = 1;
int b = 2;
a = Twice(a); // llamada a Twice() y paso de la variable "a"
b = Twice(b + num); // llamda a Twice() y paso de la suma de las dos variables b y num
Obtenemos para "a" el valor 2 ( a == 2 ) y para "b", el valor de 30 (b == 30 ) y la variable "num", definida fuera de la función es totalmente independiente del parámetro "num" local a la función Twice(). En otras palabras, las variables locales a la función Twice(), "num" y "result", sólo existen temporalmente mientras la función se está ejecutando. Cuando se sale de la función, su memoria local desaparece.
El comando "return" al final de la función Twice() es necesario para devolver el valor calculado en la función y salirse de la función. El valor devuelto, debe ser del mismo tipo que el definido en la declaración de la función. Hay que recordar, que las funciones declaradas con void no pueden devolver valores y no deberían llevar un valor de retorno. También podría ser usado para salir de una función ¿?
Paso de parámetros por valor o por referencia:
Los parámetros o argumentos pueden ser pasados por dos métodos o mecanismos: "por valor" o "por referencia".
Cuando son pasados "por valor", significa que sólo se aplica una simple operación de asignación o copiado (=) entre las varibles externas a la función y las variables locales a la función. Como en el ejemplo anterior, el parámetro o argumento "num" va obteniendo sus valores del contexto de la llamada a la función. Dicha asignación se realiza justo antes de que la función empiece a ejecutarse.
El otro método, paso de parámetros "por referencia", se utiliza en el caso de que el parámetro sea de tipo estructura, como por ejemplo un vector.
Con dicho método, en lugar de pasar una copia de un valor procedente del contexto de la llamada a la función, se pasa un puntero o indice ¿? al valor de memoria que ocupa la estructura. Para indicar el paso del parámetro por referencia se utiliza el símbolo *.
Ejemplo:
Para pasar un vector por referencia, debemos pasar el puntero o indice al vector o posición de memoria que ocupa el vector.
Ejemplo:
//Print the whole string at once - will be performed only if thers is data inside it
//you must supply the array variable
void printSerialString(char *strArray) {
int i=0;
if (strArray[i] != 0) {
while(strArray[i] != 0) {
serialWrite( strArray[i] );
strArray[i] = 0; // optional: flush the content
i++;
}
}
}
Y el código que llama a la función es :
char serInString[100]; // array that will hold the different bytes of the string. 100=100characters;
//try to print out collected information.
printSerialString(serInString);
Importante (Prototipado)
En lenguaje de programación C, cualquier función que se cree en el código, debe llevar asociada una declaración de prototipado de la función, al comienzo de tu código y antes de la sección o bloque setup(). Dicha declaración es similar a la declaración que se realiza con una variable, y básicamente es la primera línea de la declaración de tu función, finalizada por el punto y coma. En otras palabras, se da su nombre y sus argumentos, pero no su código.
void displayNumber(int incomingValue);
Con ello se prepara al programa para que pueda saber que tipo de función se va a ejecutar y que argumentos se le pasarán.
Volver a Indice