1. 程式人生 > >Solidify實現一個智慧合約10(一維陣列和二維陣列)

Solidify實現一個智慧合約10(一維陣列和二維陣列)

固定長度的陣列

固定長度型別陣列的宣告及其通過length方法獲取陣列長度求和。

pragma solidity ^0.4.4;
/*
陣列一旦建立,長度不可變
但裡面的內容可變
*/
contract Sz {

  //定義長為5的陣列,並對其初始化。
  uint[5] T = [1,2,3,4,5];

  //計算陣列中所有數的和。
  function numbers() constant returns (uint) {
    uint count = 0;
    for(uint i=0;i<T.length;i++){
      count = count + T[i];
      // count += T[i]; //同上
    }
    return count;
  }
}

宣告陣列時,一旦長度固定,將不能再修改陣列的長度,可以修改其內容。

可變長度的陣列

宣告方式

pragma solidity ^0.4.4;

contract Sz {

  //定義可變陣列,並對其初始化。
  uint[] T = [1,2,3,4,5];

  //因為上步中初始化5個元素,所有預設長度為5
  function Tlength() constant returns (uint) {
    return T.length;
  }
}

修改長度

function setLength(uint len) {
    T.length = len;
  }

修改值的兩種方法

//修改值
  function setIndexValue() {
    T[0] =5;
  }
  function pushValue() {
    T.push(10);
  }

另外的一種建立方式

uint[] T1 = new uint[](5);//5是初始長度,預設值為[0,0,0,0,0]
  //進行賦值
  function Sz() {
    for(uint i=0;i<5;i++){
      //  T1.push(i);  //push後長度會發生變化
      T1[i] = i+1;
    }  
  }

二維陣列

定義方法1

pragma solidity ^0.4.4;

contract Sz {

  //定義長為3的二維陣列,並對其初始化。
  uint[2][3] T = [[1,2],[3,4],[5,6]];

  //計算陣列中所有數的和。
  function Sz_length() constant returns (uint) {
    return T.length; //3
  }
}

注意:與一般二維陣列(行列)相反。

定義方法2

uint[2][] T1= new uint[2][](0);

修改值

// 修改值
  function pushToT1(uint[2] t) {
    T1.push(t);
  }
  // 檢視修改後的長度變化
  function T1length() constant returns (uint) {
    return T1.length;
  }

memory型別陣列

建立方式

pragma solidity ^0.4.4;

contract Sz {

  function f(uint len) {

    uint[] memory a = new uint[](7);
    bytes memory b = new bytes(len);

    a[6] = 4;
    b[1] = 0x68;
  }
}

注意:建立一個長度為length的memory型別的陣列可以通過new關鍵字來建立,memory陣列一旦建立,它不可通過length修改其長度,但可以改變其內容。(若不加memory關鍵字,預設的是storage型別)

型別轉換問題

pragma solidity ^0.4.4;

contract Sz {

  function f() {
  //  g([1,2,3]);  //直接呼叫會報錯,因為g函式中預設的是uint256,而此處預設的是uint8,因此需要強轉
    g([uint(1),2,3]);
  }

  function g(uint[3] data) {
    //....
  }
}

memory型別的固定長度陣列不可直接賦值給storage/memory型別的可變陣列

總結:

bytes1~32建立的是固定位元組大小的位元組陣列,長度不可變,內容不可修改。而string是特殊的可變位元組陣列,它可以轉換為bytes以通過length你方法獲取它的位元組長度,亦可通過索引修改相對於的位元組內容。

建立可變位元組陣列除了可以通過bytes b = new bytes(len)來建立之外,還可以通過byte[] b來建立。

而bytes1~32我們可以通過byte[len] b 來建立,len的範圍為1~32。不過這 兩種方式建立的不可變位元組陣列有一點小區別:bytes1~32直接宣告的不可變位元組陣列中,長度不可變,內容不可變。而byte[len] b建立的位元組陣列,長度不可變,但內容可修改。