Arduino - Pasando matrices a funciones

Para pasar un argumento de matriz a una función, especifique el nombre de la matriz sin corchetes. Por ejemplo, si una matrizhourlyTemperatures se ha declarado como la función, la llamada pasa la matriz hourlyTemperatures y su tamaño a la función modifyArray.

Puntos importantes

Aquí hay una lista de algunos puntos importantes que debe conocer al pasar matrices a funciones:

  • Cuando se pasa una matriz a una función, normalmente también se pasa el tamaño de la matriz, por lo que la función puede procesar el número específico de elementos en la matriz. De lo contrario, necesitaríamos incorporar este conocimiento en la función llamada en sí o, peor aún, colocar el tamaño de la matriz en una variable global.

  • C ++ pasa matrices a funciones por referencia, es decir, las funciones llamadas pueden modificar los valores de los elementos en las matrices originales de los llamadores.

  • El valor del nombre de la matriz es la dirección en la memoria de la computadora del primer elemento de la matriz. Dado que se pasa la dirección inicial de la matriz, la función llamada sabe con precisión dónde se almacena la matriz en la memoria. Por lo tanto, cuando la función llamada modifica elementos de la matriz en su cuerpo de función, está modificando los elementos reales de la matriz en sus ubicaciones de memoria originales.

  • Aunque todas las matrices se pasan por referencia, los elementos individuales de la matriz se pasan por valor exactamente como lo hacen las variables simples.

  • Para pasar un elemento de una matriz a una función, use el nombre subindicado del elemento de la matriz como argumento en la llamada a la función.

  • Para que una función reciba una matriz a través de una llamada de función, la lista de parámetros de la función debe especificar que la función espera recibir una matriz.

  • Por ejemplo, el encabezado de función para la función modificarArray podría escribirse como:

void modifyArray( int b[], int arraySize )
  • La declaración indica que modifiedArray espera recibir la dirección de una matriz de enteros en el parámetro b y el número de elementos de la matriz en el parámetro arraySize. El tamaño de la matriz no es necesario en los corchetes de la matriz. Si está incluido, el compilador lo ignora; por lo tanto, se pueden pasar matrices de cualquier tamaño a la función.

  • C ++ pasa matrices a las funciones por referencia. Cuando la función llamada usa el nombre de matriz b, se refiere a la matriz real en el llamador (es decir, arrayhourlyTemperatures discutido al principio de esta sección).

Tenga en cuenta la extraña apariencia del prototipo de función para modificarArray.

void modifyArray( int [] , int ) ;

Este prototipo podría haberse escrito de la siguiente manera con fines de documentación.

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

Sin embargo, los compiladores de C ++ ignoran los nombres de variables en los prototipos. Recuerde, el prototipo le dice al compilador el número de argumentos y el tipo de cada argumento en el orden en el que se espera que aparezcan.

El programa en el siguiente ejemplo demuestra la diferencia entre pasar una matriz completa y pasar un elemento de matriz.

Ejemplo

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