Arduino - Passando Arrays para Funções

Para passar um argumento de matriz para uma função, especifique o nome da matriz sem colchetes. Por exemplo, se um arrayhourlyTemperatures foi declarada como a função, a chamada passa a matriz de temperatura horária e seu tamanho para a função modifyArray.

Pontos importantes

Aqui está uma lista de alguns pontos importantes que você precisa saber ao passar arrays para funções -

  • Ao passar um array para uma função, normalmente o tamanho do array também é passado, para que a função possa processar o número específico de elementos no array. Caso contrário, precisaríamos construir esse conhecimento na própria função chamada ou, pior ainda, colocar o tamanho do array em uma variável global.

  • C ++ passa arrays para funções por referência, isto é, as funções chamadas podem modificar os valores dos elementos nos arrays originais dos chamadores.

  • O valor do nome do array é o endereço na memória do computador do primeiro elemento do array. Uma vez que o endereço inicial do array é passado, a função chamada sabe exatamente onde o array está armazenado na memória. Portanto, quando a função chamada modifica os elementos do array em seu corpo de função, ela está modificando os elementos reais do array em seus locais de memória originais.

  • Embora todos os arrays sejam passados ​​por referência, os elementos individuais do array são passados ​​por valor exatamente como as variáveis ​​simples.

  • Para passar um elemento de uma matriz para uma função, use o nome subscrito do elemento da matriz como um argumento na chamada da função.

  • Para que uma função receba um array por meio de uma chamada de função, a lista de parâmetros da função deve especificar que a função espera receber um array.

  • Por exemplo, o cabeçalho da função para a função modifyArray pode ser escrito como -

void modifyArray( int b[], int arraySize )
  • A instrução indica que modifyArray espera receber o endereço de uma matriz de inteiros no parâmetro be o número de elementos da matriz no parâmetro arraySize. O tamanho da matriz não é necessário nos colchetes da matriz. Se estiver incluído, o compilador o ignora; portanto, matrizes de qualquer tamanho podem ser passadas para a função.

  • C ++ passa arrays para as funções por referência. Quando a função chamada usa o nome da matriz b, ela se refere à matriz real do chamador (ou seja, temperatura de hora de array discutida no início desta seção).

Observe a aparência estranha do protótipo da função para modifyArray.

void modifyArray( int [] , int ) ;

Este protótipo poderia ter sido escrito da seguinte maneira para fins de documentação.

void modifyArray( int anyArrayName[], int anyVariableName ) ;

No entanto, os compiladores C ++ ignoram nomes de variáveis ​​em protótipos. Lembre-se de que o protótipo informa ao compilador o número de argumentos e o tipo de cada argumento na ordem em que os argumentos devem aparecer.

O programa no próximo exemplo demonstra a diferença entre passar uma matriz inteira e passar um elemento da matriz.

Exemplo

void modifyArray( int [], int ); // appears strange; array and size
void modifyElement( int ); // receive array element value

void setup () {
   Serial.begin (9600);
   const int arraySize = 5; // size of array a
   int a[ arraySize ] = { 0, 1, 2, 3, 4 }; // initialize array a
   Serial.print ( "Effects of passing entire array by reference:" ) ;
   // output original array elements
   for ( int i = 0; i < arraySize ; ++i )
   Serial.print ( a[ i ] ) ;
   Serial.print ("\r" ) ;
   Serial.print ("The values of the modified array are:\n" );
   // output modified array elements
   for ( int j = 0; j < arraySize; ++j )
   Serial.print ( a[j ] ) ;
   Serial.print ("\r" ) ;
   Serial.print ("\r\rEffects of passing array element by value:" );
   Serial.print ( "\ra[3] before modifyElement: " );
   Serial.print ( a[ 3 ] );
   Serial.print ( "\ra[3] after modifyElement: " );
   Serial.print ( a[ 3 ] );
}

void loop () {

}

// in function modifyArray, "b" points to the original array "a" in memory

void modifyArray( int b[], int sizeOfArray ) {
   // multiply each array element by 2
   for ( int k = 0 ; k < sizeOfArray ; ++k )
   b[ k ] *= 2;
} 

// end function modifyArray
// in function modifyElement, "e" is a local copy of
// array element a[ 3 ] passed from main

void modifyElement( int e ) {
   // multiply parameter by 2
   Serial.print ( "Value of element in modifyElement: " );
   Serial.print ( ( e *= 2 ) );
} 

// end function modifyElement

Resultado

Effects of passing entire array by reference:01234
The values of the modified array are:01234

Effects of passing array element by value:
a[3] before modifyElement: 3
a[3] after modifyElement: 3
$ is not a hexadecimal digit
f is a hexadecimal digit