Arduino: passaggio di array a funzioni

Per passare un argomento di matrice a una funzione, specificare il nome della matrice senza parentesi. Ad esempio, se un arrayhourlyTemperatures è stata dichiarata come funzione, la chiamata passa l'array hourlyTemperatures e la sua dimensione alla funzione modifyArray.

Punti importanti

Ecco un elenco di alcuni punti importanti che devi conoscere mentre passi gli array alle funzioni:

  • Quando si passa un array a una funzione, normalmente viene passata anche la dimensione dell'array, quindi la funzione può elaborare il numero specifico di elementi dell'array. Altrimenti, avremmo bisogno di costruire questa conoscenza nella funzione chiamata stessa o, peggio ancora, inserire la dimensione dell'array in una variabile globale.

  • Il C ++ passa gli array alle funzioni per riferimento, cioè le funzioni chiamate possono modificare i valori degli elementi negli array originali dei chiamanti.

  • Il valore del nome dell'array è l'indirizzo nella memoria del computer del primo elemento dell'array. Poiché viene passato l'indirizzo iniziale dell'array, la funzione chiamata sa esattamente dove l'array è archiviato nella memoria. Pertanto, quando la funzione chiamata modifica gli elementi dell'array nel suo corpo della funzione, modifica gli elementi effettivi dell'array nelle loro posizioni di memoria originali.

  • Sebbene gli interi array vengano passati per riferimento, i singoli elementi dell'array vengono passati per valore esattamente come lo sono le variabili semplici.

  • Per passare un elemento di un array a una funzione, usa il nome con indice dell'elemento dell'array come argomento nella chiamata alla funzione.

  • Affinché una funzione riceva un array tramite una chiamata di funzione, l'elenco dei parametri della funzione deve specificare che la funzione prevede di ricevere un array.

  • Ad esempio, l'intestazione della funzione per la funzione modifyArray potrebbe essere scritta come -

void modifyArray( int b[], int arraySize )
  • L'istruzione indica che modifyArray si aspetta di ricevere l'indirizzo di una matrice di numeri interi nel parametro be il numero di elementi della matrice nel parametro arraySize. La dimensione dell'array non è richiesta tra le parentesi dell'array. Se è incluso, il compilatore lo ignora; quindi, array di qualsiasi dimensione possono essere passati alla funzione.

  • Il C ++ passa gli array alle funzioni per riferimento. Quando la funzione chiamata utilizza il nome dell'array b, si riferisce all'array effettivo nel chiamante (cioè, arrayhourlyTemperatures discusso all'inizio di questa sezione).

Notare lo strano aspetto del prototipo della funzione per modifyArray.

void modifyArray( int [] , int ) ;

Questo prototipo avrebbe potuto essere scritto nel modo seguente a scopo di documentazione.

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

Tuttavia, i compilatori C ++ ignorano i nomi delle variabili nei prototipi. Ricorda, il prototipo dice al compilatore il numero di argomenti e il tipo di ogni argomento nell'ordine in cui ci si aspetta che appaiano gli argomenti.

Il programma nel prossimo esempio dimostra la differenza tra il passaggio di un intero array e il passaggio di un elemento di array.

Esempio

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

Risultato

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