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创建的字节数组,长度不可变,但内容可修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值