【区块链2.0 以太坊学习笔记3】可变长度数组/二维数组/最小类型匹配原则

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处! https://sp4rkw.blog.csdn.net/article/details/85839528

可变长度数组

pragma solidity ^0.4.0;

contract uintArray {
  uint[] num = [1,2,3,4];//初始化一个uint数组

  //构造函数GetAttribute获得uint数组的相关属性
  function GetAttribute() view public returns (uint[],uint) {
    return (num,num.length);
  }

  //构造函数ChangeLength1验证缩短可变长度数组缩短长度直接从有往左删去相应长度
  function ChangeLength1() public {
    num.length = 2;
  }

  //构造函数ChangeLength2验证增加可变长度数组增加长度直接给新增位置补0
  function ChangeLength2() public{
    num.length = 6;
  }

  //构造函数TestPush验证可变长度数组push的方式是从末尾直接增加
  function TestPush() public{
    num.push(100);
  }

  //构造函数ChangeValue验证可变长度数组的单个元素可以直接修改
  function ChangeValue(uint data) public{
    num[0] = data;
  }
}

可变长度数组可以直接读取相应位置的元素的值,并可以直接读取长度,这与string类型有很大区别

二维数组

pragma solidity ^0.4.0;

contract TwoArray {
  //solidity和其他语言在二维数组这里有一个非常大的不同,定义定长二维数组的时候uint[i][j],i表示列,而j表示行
  uint[2][3] num = [[1,2],[2,3],[3,4]];

  //构造函数outputOneLine,outputOneValue验证当输出数组的时候,第一个下表i表示第几行,第二个下边j表示第几列
  function outputOneLine() view public returns (uint[2]) {//solidity有一个非常恶心的地方就是定长的返回值必须也对应为定长
    return num[0];
  }

  function outputOneValue() view public returns (uint) {
    return num[0][1];
  }
}

二维数组与其他语言最大的区别就是:

  • 当定义的时候,第一个下表表示有几列,第二个下表表示有几行;
  • 当读值的时候,第一个下表又表示有几行,第二个下表表示有几列。

还有一个值得注意的地方就是,solidity的返回值十分依赖returns的标注,当定义的是已经定长的数组时,返回值一定要与其长度对应,否则会发生报错

二维的这种数组固定长度数组毫无疑问也是可以修改长度的

长度控制问题

pragma solidity ^0.4.0;

contract TpyeControl {

  function back1() view returns (uint8[3]) {
    return [1,2,3];
  }

  function back2() view returns (uint16[3]) {//这里如果是uint8[3]就会报错,因为uint8最大可以表示255
    return [1,2,256];
  }

  function back3() view returns (uint[3]) {//如果使用uint,需要将类型转换过来
    return [uint(1),2,3];
  }

  function OperateSum(uint8[] num) public returns (uint) {
    uint sum = 0;//这里讲sum定义成uint型防止和越界
    for(uint i = 0;i < num.length;i++){
      sum = sum+num[i];
    }
  }
}

  • solidity的性质,默认返回值最小匹配原则,所以才会有第一组只能用uint8,第二组只能用uint16
  • uint定长以8为步长直到uint256
  • uintI的这个I表示的是位数,而bytesI的这个I表示的是字节数,一个字节需要四位来表示

总结

  1. 可变长度数组其实就是未定义初始长度的数组,比如bytesuint[]stringuint[][];固定长度数组就是在定义的时候已经初始定了其长度的范围,比如bytes1uint[2]uint[2][3]
  2. 固定长度数组可以通过修改length属性来改变其长度,增加长度均为在末尾补0,减小长度均是删去长度外的值。
  3. solidity最小类型匹配原则。
展开阅读全文

没有更多推荐了,返回首页