Solidity-アレイ

配列はデータ構造であり、同じタイプの要素の固定サイズの順次コレクションを格納します。配列はデータのコレクションを格納するために使用されますが、配列を同じタイプの変数のコレクションと考える方が便利な場合がよくあります。

number0、number1、...、number99などの個々の変数を宣言する代わりに、numbersなどの1つの配列変数を宣言し、numbers [0]、numbers [1]、...、numbers [99]を使用して表現します。個々の変数。配列内の特定の要素は、インデックスによってアクセスされます。

Solidityでは、配列はコンパイル時の固定サイズまたは動的サイズにすることができます。ストレージアレイの場合、さまざまなタイプの要素を含めることもできます。メモリ配列の場合、要素タイプをマッピングすることはできません。関数パラメータとして使用する場合は、要素タイプをABIタイプにする必要があります。

すべてのアレイは、連続したメモリ位置で構成されています。最小アドレスは最初の要素に対応し、最大アドレスは最後の要素に対応します。

配列の宣言

Solidityで固定サイズの配列を宣言するために、プログラマーは要素のタイプと配列に必要な要素の数を次のように指定します。

type arrayName [ arraySize ];

これは、1次元配列と呼ばれます。ザ・arraySize ゼロより大きい整数定数である必要があり、 type任意の有効なSolidityデータ型にすることができます。たとえば、uint型のバランスと呼ばれる10要素の配列を宣言するには、次のステートメントを使用します。

uint balance[10];

Solidityで動的サイズの配列を宣言するために、プログラマーは要素のタイプを次のように指定します。

type[] arrayName;

配列の初期化

Solidity配列要素は、次のように1つずつ、または1つのステートメントを使用して初期化できます。

uint balance[3] = [1, 2, 3];

中括弧[]の間の値の数は、角括弧[]の間の配列に対して宣言する要素の数より大きくすることはできません。以下は、配列の単一の要素を割り当てる例です。

配列のサイズを省略すると、初期化を保持するのに十分な大きさの配列が作成されます。したがって、あなたが書く場合-

uint balance[] = [1, 2, 3];

前の例で作成したのとまったく同じ配列を作成します。

balance[2] = 5;

上記のステートメントは、配列の3番目の要素番号に値5を割り当てます。

動的メモリ配列の作成

動的メモリ配列は、newキーワードを使用して作成されます。

uint size = 3;
uint balance[] = new uint[](size);

配列要素へのアクセス

要素には、配列名にインデックスを付けることでアクセスします。これは、配列名の後に角括弧内に要素のインデックスを配置することによって行われます。例-

uint salary = balance[2];

上記のステートメントは、配列から3番目の要素を取得し、その値を給与変数に割り当てます。以下は、上記の3つの概念すべてを使用する例です。宣言、割り当て、配列へのアクセス-

メンバー

  • length− lengthは、配列のサイズを返します。lengthを使用して、設定する動的配列のサイズを変更できます。

  • push− pushを使用すると、最後に動的ストレージ配列に要素を追加できます。配列の新しい長さを返します。

次のコードを試して、Solidityで配列がどのように機能するかを理解してください。

pragma solidity ^0.5.0;

contract test {
   function testArray() public pure{
      uint len = 7; 
      
      //dynamic array
      uint[] memory a = new uint[](7);
      
      //bytes is same as byte[]
      bytes memory b = new bytes(len);
      
      assert(a.length == 7);
      assert(b.length == len);
      
      //access array variable
      a[6] = 8;
      
      //test array variable
      assert(a[6] == 8);
      
      //static array
      uint[3] memory c = [uint(1) , 2, 3];
      assert(c.length == 3);
   }
}