Noções básicas de C++ em um Arduino, parte 2: funções e métodos

Tempo de leitura: 3 minutes

Este Noções básicas de C++ em uma série Arduino cobre muitos elementos diferentes necessários para todos os tipos de projetos e ideias em um Arduino. Nesta entrada, abordamos funções e métodos em C++.

Blocos e chamadas de método

Na primeira entrada desta série, os usuários aprenderam como fazer declarações e instruções simples, como o seguinte:

Serial.print(“Hello!”);

Esta declaração é uma chamada de método. Termina, como qualquer outra instrução, com um ponto e vírgula. O nome do método é print e um único parâmetro é fornecido, que é a string “Hello” neste caso.

Um bloco pode combinar instruções que pertencem a uma única unidade. Em C++, os blocos são encapsulados com uma chave, assim:

{
    // Este é um bloco.
        // Ele agrupa certas chamadas para uma unidade lógica
    int year = 2020;
    int birth_year = 1995;
    int age = year - birth_year;

    Serial.print("Age: ");
    Serial.println(age);
}

Observe que esses blocos só podem entrar em funções já existentes – por exemplo, o método de loop. Também é importante lembrar que qualquer variável definida dentro de um bloco só é válida dentro dessa região.

Além disso, os blocos só podem ser usados uma vez. Sempre que quiser repetir um cálculo, você terá que copiar todo o bloco e colá-lo onde for necessário. Isso é inconveniente e apresentará erros rapidamente em seu programa. Tende a ser muito melhor escrever um método personalizado que calcule a idade e a retorne, assim:

int age = calculateAge(1995, 2020);

 

Escrevendo seus próprios métodos e funções

Você pode pensar em uma função como um bloco nomeado. Além disso, as funções também têm um tipo de retorno e podem ter um número arbitrário de parâmetros que permitem passar alguns dados para ela. O tipo de retorno pode ser qualquer coisa que você também possa usar como o tipo de uma variável. Se você não quiser retornar um valor, C++ exige que você use void como o tipo. Aqui estão alguns exemplos de métodos e funções:

// Esta função recebe dois inteiros como parâmetros, calcula a idade e a retorna.
int calculateAge(int birth_year, int current_year)
{
    int year = 2020;
    int birth_year = 1995;
    int age = year - birth_year;

    return age;
}

// Este método não possui parâmetros e não retorna um valor
// Observe que ele aceitará quaisquer parâmetros.
void doSomething()
{
    // ...
}

// Este método não possui parâmetros e não retorna um valor
// Use a palavra-chave void para indicar que nenhum parâmetro é permitido.
void doSomethingWithoutParameters(void)
{
    // ...
}

// Você também pode escrever a chave de abertura na mesma linha do cabeçalho do método
void doSomeMath(float x, float y, double angle) {
 
}

No contexto dos métodos, a declaração do método, que contém o tipo de retorno, o nome e os parâmetros, é chamada de cabeça do método. O conteúdo dentro do formulário de função é seu corpo.

Por enquanto, lembre-se de que, ao contrário dos blocos simples, os métodos podem não estar contidos em outras funções em C++. No entanto, há exceções a essa regra, mas esse é um tópico avançado que pode ser explorado em um blog posterior.

 

Protótipos de método

Normalmente, você não pode usar um método antes de ser declarado em C++. Normalmente não é permitido o seguinte:

void printSomeMath()
{
  Serial.println(doSomeMath(2.0f, 9.7f, 93.572000));
}

double doSomeMath(float x, float y, double angle)
{
  return (x * y) + (x * angle) + (y * angle) - (x / y);
}

Como você pode ver, o método printSomeMath() faz referência à função doSomeMath() antes de ser definida. Você pode trocar as funções para resolver esse problema. No entanto, também é possível definir protótipos de método para permitir que o compilador saiba sobre suas funções autodefinidas. Um protótipo de método consiste em seu cabeçalho e omite o corpo. Por ser uma declaração, também deve terminar com um ponto e vírgula:

// Protótipos de método
void printSomeMath();
double doSomeMath(float x, float y, double angle);

// Os métodos implementados
void printSomeMath()
{
  Serial.println(doSomeMath(2.0f, 9.7f, 93.572000));
}

double doSomeMath(float x, float y, double angle)
{
  return (x * y) + (x * angle) + (y * angle) - (x / y);
}

É possível adicionar todos os protótipos ao início de um arquivo cpp. No entanto, também é possível definir um arquivo hpp ou h que os contenha. (Vamos cobrir isso na parte cinco desta série – por enquanto, você pode omitir os protótipos porque o código funcionará muito bem sem eles no IDE do Arduino.)

 

Resumo

É possível definir funções personalizadas em seu código. Isso ajuda a manter seu código organizado e fácil de entender, manter e usar. Você pode então chamar o método sempre que precisar de um determinado comportamento. Cada método deve ter pelo menos um nome e um tipo de retorno. Além disso, ele pode ter um número arbitrário de parâmetros opcionais que permitem que você passe dados para ele. Se você definir parâmetros, deverá sempre fornecer todos eles na ordem correta ao chamar a função.