Arduino-passing-arrays-to-functions

提供:Dev Guides
移動先:案内検索

Arduino-配列を関数に渡す

関数に配列引数を渡すには、角括弧なしで配列の名前を指定します。 たとえば、配列 hourlyTemperatures が関数として宣言されている場合、呼び出しは配列hourlyTemperaturesとそのサイズを関数 modifyArray に渡します。

重要なポイント

ここに配列を関数に渡すときに知っておく必要があるいくつかの重要なポイントのリストがあります-

  • 配列を関数に渡すとき、通常は配列サイズも渡されるため、関数は配列内の特定の数の要素を処理できます。 そうでなければ、この知識を呼び出された関数自体に組み込むか、さらに悪いことに、配列サイズをグローバル変数に配置する必要があります。
  • C ++は、参照によって関数に配列を渡します。 呼び出された関数は、呼び出し元の元の配列の要素値を変更できます。
  • 配列の名前の値は、配列の最初の要素のコンピューターのメモリ内のアドレスです。 配列の開始アドレスが渡されるため、呼び出された関数は、配列がメモリのどこに格納されているかを正確に認識します。 したがって、呼び出された関数がその関数本体の配列要素を変更すると、元のメモリ位置にある配列の実際の要素が変更されます。
  • 配列全体は参照によって渡されますが、個々の配列要素は単純な変数とまったく同じように値によって渡されます。
  • 配列の要素を関数に渡すには、関数呼び出しで引数として配列要素の添え字付きの名前を使用します。
  • 関数が関数呼び出しを介して配列を受け取るには、関数のパラメーターリストで、関数が配列を受け取ることを指定する必要があります。
  • たとえば、関数modifyArrayの関数ヘッダーは次のように記述できます-
void modifyArray( int b[], int arraySize )
  • このステートメントは、modifyArrayがパラメーターbの整数の配列のアドレスと、パラメーターarraySizeの配列要素の数を受け取ることを示しています。 配列のサイズは、配列の角かっこでは必要ありません。 含まれている場合、コンパイラはそれを無視します。したがって、任意のサイズの配列を関数に渡すことができます。 *C ++は、参照によって関数に配列を渡します。 呼び出された関数が配列名bを使用する場合、呼び出し元の実際の配列(つまり、このセクションの冒頭で説明したarrayhourlyTemperatures)を参照します。

modifyArrayの関数プロトタイプの奇妙な外観に注意してください。

void modifyArray( int [] , int ) ;

このプロトタイプは、文書化のために次の方法で作成できます。

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

ただし、C ++コンパイラはプロトタイプの変数名を無視します。 プロトタイプは、引数が現れると予想される順序で、引数の数と各引数の型をコンパイラに伝えます。

次の例のプログラムは、配列全体を渡すことと配列要素を渡すことの違いを示しています。

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

結果

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