Arduino - Passer des tableaux aux fonctions

Pour passer un argument de tableau à une fonction, spécifiez le nom du tableau sans crochets. Par exemple, si un tableauhourlyTemperatures a été déclarée comme fonction, l'appel transmet le tableau hourlyTemperatures et sa taille à function modifyArray.

Les points importants

Voici une liste de quelques points importants que vous devez connaître lors du passage de tableaux aux fonctions -

  • Lors du passage d'un tableau à une fonction, la taille du tableau est normalement également transmise, de sorte que la fonction peut traiter le nombre spécifique d'éléments dans le tableau. Sinon, nous aurions besoin d'intégrer cette connaissance dans la fonction appelée elle-même ou, pire encore, de placer la taille du tableau dans une variable globale.

  • C ++ passe les tableaux aux fonctions par référence, c'est-à-dire que les fonctions appelées peuvent modifier les valeurs des éléments dans les tableaux d'origine des appelants.

  • La valeur du nom du tableau est l'adresse dans la mémoire de l'ordinateur du premier élément du tableau. Puisque l'adresse de départ du tableau est passée, la fonction appelée sait précisément où le tableau est stocké dans la mémoire. Par conséquent, lorsque la fonction appelée modifie les éléments du tableau dans son corps de fonction, elle modifie les éléments réels du tableau dans leurs emplacements mémoire d'origine.

  • Bien que les tableaux entiers soient passés par référence, les éléments de tableau individuels sont passés par valeur exactement comme les variables simples.

  • Pour passer un élément d'un tableau à une fonction, utilisez le nom en indice de l'élément du tableau comme argument dans l'appel de fonction.

  • Pour qu'une fonction reçoive un tableau via un appel de fonction, la liste de paramètres de la fonction doit spécifier que la fonction s'attend à recevoir un tableau.

  • Par exemple, l'en-tête de la fonction modifyArray peut être écrit comme suit:

void modifyArray( int b[], int arraySize )
  • L'instruction indique que modifyArray s'attend à recevoir l'adresse d'un tableau d'entiers dans le paramètre b et le nombre d'éléments de tableau dans le paramètre arraySize. La taille du tableau n'est pas requise dans les crochets du tableau. S'il est inclus, le compilateur l'ignore; ainsi, des tableaux de n'importe quelle taille peuvent être passés à la fonction.

  • C ++ transmet les tableaux aux fonctions par référence. Lorsque la fonction appelée utilise le nom du tableau b, elle fait référence au tableau réel de l'appelant (c'est-à-dire, arrayhourlyTemperatures discuté au début de cette section).

Notez l'apparence étrange du prototype de fonction pour modifyArray.

void modifyArray( int [] , int ) ;

Ce prototype aurait pu être écrit de la manière suivante à des fins de documentation.

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

Cependant, les compilateurs C ++ ignorent les noms de variables dans les prototypes. N'oubliez pas que le prototype indique au compilateur le nombre d'arguments et le type de chaque argument dans l'ordre dans lequel les arguments doivent apparaître.

Le programme de l'exemple suivant montre la différence entre passer un tableau entier et passer un élément de tableau.

Exemple

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

Résultat

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