fbpixel
Etiquetas: ,

Em programação, é muito comum e até necessário utilizar funções que requerem uma definição particular – sobretudo quando há blocos de código que se repetem no mesmo programa. Conjuntos de funções e objetos são normalmente reunidos em bibliotecas. Veremos neste tutorial a definição de funções em C aplicada ao Arduino.

Sintaxe para definição de funções em C

A sintaxe da definição de uma função em C apresenta 4 partes:

  • o tipo de variável devolvida pela função (void, int, char, etc.);
  • o nome da função;
  • os argumentos (opcional);
  • o corpo da função.
bool nom_fonction(int arg1, char arg2){
  bool out; //definition variable locale
  //corps de la fonction
  return out;
}

O tipo da função, o seu nome e a definição dos argumentos correspondem ao protótipo da função, ou seja, as informações mínimas necessárias para podermos chamar a função.

resultat = nom_fonction(param1,param2);

Exemplos

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;
}

Uma função que não devolve um valor é chamada de procedimento. Ela se caracteriza por um tipo void (vazio, em português).

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 lembrar sobre a definição de funções em C

  • É necessário definir um tipo de variável devolvida.
  • Se a função não tem valor devolvido, é chamada de procedimento, e o seu tipo é void.
  • Uma função retorna uma variável por meio da função return.
  • Os argumentos são definidos pelo tipo e o nome utilizados na função.
  • Os argumentos são opcionais.
  • O corpo da função está entre chaves.

Bônus

Definição de argumentos com valores padrão

É possível, ao definir uma função, definir um valor padrão para um ou mais parâmetros. No Arduino, para poder compilar esta função, é preciso acrescentar o protótipo da função (ou toda a definição) antes da sua primeira utilização.

No início do arquivo, definimos o protótipo da função, especificando o valor padrão.

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

Depois, na sequência ou em outro local, adicionamos a definição da função sem os valores padrão.

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();
}

Então é possível utilizar a função com ou sem o parâmetro para obter comportamentos diferentes.

   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 funções

É possível definir vários protótipos para que uma função com o mesmo nome possa atuar sobre parâmetros de diferentes tipos. Para sobrecarregar uma função, temos de declarar a função para cada lista de parâmetros desejados com diferentes protótipos e corpos.

Obs: Note que a sobrecarga de funções só é possível com listas de argumentos diferentes.

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'

Fontes

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie