fbpixel
Etiquetas: ,

En la programación, es muy común o incluso necesario utilizar funciones que requieren una definición particular. Esto es aún más cierto cuando se repiten bloques de código en el mismo programa. Un conjunto de funciones y objetos se suelen reunir en bibliotecas. Veremos en este tutorial la definición de la función C aplicada a Arduino.

Sintaxis para la definición de la función en C

La sintaxis de la definición de una función C consta de 4 partes:

  • el tipo de variable devuelta por la función (void, int, char , etc.)
  • el nombre de la función
  • argumentos (opcional)
  • el cuerpo de la función
bool nom_fonction(int arg1, char arg2){
  bool out; //definition variable locale
  //corps de la fonction
  return out;
}

El tipo de la función, su nombre y la definición de los argumentos corresponden al prototipo de la función, es decir, a la información mínima que hay que conocer para llamar a la función.

resultat = nom_fonction(param1,param2);

Ejemplos

int convert(int val){
  return map(val,0,1023,-100,100);
}


bool isValid(int val){
  if(val>-5 && val<50){
    return true; 
  }else{
    return false;
  }
}


int increment(int val, int increment,int maxval, int minval){
  val+=increment;
  if(val>maxval) val=minval;
  if(val<minval) val=maxval;

  return val;
}


Una función que no devuelve un valor se denomina procedimiento, se caracteriza por un tipo de vacío.

int myVar=0;

void setup(){
  Serial.begin(115200);
}

void loop(){
   printVar("myVar",myVar);
   myVar+=1;
   delay(500);
}

void printVar(String nom, int val){
  Serial.print(F(">> "));Serial.print(nom);Serial.print(F(": "));Serial.println(val); 
}

>> myVar: 0
>> myVar: 1
>> myVar: 2
>> myVar: 3
>> myVar: 4
>> myVar: 5
>> myVar: 6
>> myVar: 7
>> myVar: 8
>> myVar: 9
>> myVar: 10

Para recordar la definición de la función en C

  • definir un tipo de variable devuelta es obligatorio
  • si la función no tiene valor devuelto, se llama procedimiento y su tipo es nulo
  • una función devuelve una variable llamando a la función return
  • los argumentos se definen por el tipo y el nombre usado en la función
  • los argumentos son opcionales
  • el cuerpo de la función está entre llaves

Bonus

Definir los argumentos con valores por defecto

Es posible, al definir una función, establecer un valor por defecto para uno o más parámetros. En virtud de Arduino, para poder compilar una función de este tipo, habrá que añadir el prototipo de la función (o toda la definición) antes de la primera utilización de la función.

Al principio del archivo, definimos el prototipo de la función especificando el valor por defecto.

void printVar(String nom, int val, String unit="");

Luego, siguiendo o en otro lugar, añadimos la definición de la función sin los valores por defecto

void printVar(String nom, int val, String unit){
  Serial.print(F(">> "));Serial.print(nom);Serial.print(F(": "));Serial.print(val);
  Serial.print(F(" "));Serial.print(unit);
  Serial.println();
}

Entonces es posible utilizar la función con o sin el parámetro para obtener diferentes comportamientos

   printVar("myVar",myVar);
   printVar("cmVar",cmVar,"cm");

int myVar=0;
int cmVar=0;

void printVar(String nom, int val, String unit="");

void setup(){
  Serial.begin(115200);
}

void loop(){
   printVar("myVar",myVar);
   printVar("cmVar",cmVar,"cm");
   
   myVar+=1;
   cmVar+=5;
   delay(1000);
}

void printVar(String nom, int val, String unit){
  Serial.print(F(">> "));Serial.print(nom);Serial.print(F(": "));Serial.print(val);
  Serial.print(F(" "));Serial.print(unit);
  Serial.println();
}

Sobrecarga de funciones

Es posible definir varios prototipos para que una función con el mismo nombre pueda actuar sobre parámetros de diferentes tipos. Para anular una función, necesitamos declarar la función para cada lista de parámetros deseados con diferentes prototipos y cuerpos

N.B.: Tenga en cuenta que la sobrecarga de la función sólo es posible con diferentes listas de argumentos.

int myVar=0;
int cmVar=0;

void printVar(String nom, int val, String unit="");
void printVar(String nom, String mot, String unit="'");

void setup(){
  Serial.begin(115200);
}

void loop(){
   printVar("myVar",myVar);
   printVar("cmVar",cmVar,"cm");
   printVar("cmVar","HelloWorld");
   myVar+=1;
   cmVar+=5;
   delay(1000);
}

void printVar(String nom, int val, String unit){
  Serial.print(F(">> "));Serial.print(nom);Serial.print(F(": "));Serial.print(val);
  Serial.print(F(" "));Serial.print(unit);
  Serial.println();
}

void printVar(String nom, String mot,String unit){
  Serial.print(F(">> "));Serial.print(nom);Serial.print(F(": "));Serial.print(unit);Serial.print(mot);
  Serial.print(unit);
  Serial.println();
}

>> myVar: 3 
>> cmVar: 15 cm
>> Text -> 'HelloWorld'
>> myVar: 4 
>> cmVar: 20 cm
>> Text -> 'HelloWorld'
>> myVar: 5 
>> cmVar: 25 cm
>> Text -> 'HelloWorld'
>> myVar: 6 
>> cmVar: 30 cm
>> Text -> 'HelloWorld'
>> myVar: 7 
>> cmVar: 35 cm
>> Text -> 'HelloWorld'

Fuentes