Solidity 从入门到实战(二)

Solidity 从入门到实战(二)

注意:本专栏主要来自于https://www.bilibili.com/video/BV1St411a7Pk?p=11&spm_id_from=pageDriver的学习笔记以及https://blog.csdn.net/weixin_45067603/article/details/105751748

数组的相关操作

一维可变数组

结论:
1.可变数组在定义的时候必须初始化,否则,编译会报错
2.支持直接使用.length查看数组长度,也支持对数组长度做修改。 将数组长度缩小则会从前往后保留 将数组长度增长则后面原本没有值的位会被默认置0
3.支持直接通过.push方法在末尾添加数值

pragma solidity ^0.4.16;

contract testArray
{
     
    uint[] arr=[1,2,3,4,5];//定义数组arr
    //修改数组的第二个和第三个元素
    function changeArray() public
    {
     
        arr[1]=100;
        arr[2]=200;
    }
    //获取数组的元素
    function getArray() public view returns(uint[] arr)
    {
     
        return arr;
    }
    //求数组的数字和
    function getArrayCount() public view returns(uint)
    {
     
        uint grade=0;
        for(uint i=0;i<5;i++)
        {
     
            grade+=arr[i];
        }
        return grade;
    }
    //求数组的长度
    function getlength() public view returns(uint)
    {
     
        return arr.length;
    }
    //改变数组的长度
    //注:如果要改变数组的长度,数组在初始化的时候不应该是定义好的空间,例如: uint[5] arr=[1,2,3,4,5];这样子会报错,
    //应该 uint[] arr=[1,2,3,4,5];这样才是对的
    function changeLength() public
    {
     
       arr.length=1;
    }
    //添加内容,跟改变数组长度一样,数组初始化的时候不能声明具体大小
    function pushContenth() public
    {
     
       arr.push(10);
    }
    
}

固定长度二维数组

注意:solidity语言中的二维数组使用方式与其它语言有所不同。
1.初始化时,uint256[ i ] [ j ]表示有j个元素,每个元素包含i个值(和其他许多语言不同
2.二维数组可以直接获取长度,既可以获得所有元素个数,也可以获得单独元素有多少值
3.对二维数组进行增删改等操作时是与初始化时反过来的,即uint256[ i ] [ j ]表示第i个元素的第j个值(这个和其他许多语言一样
4.不支持push方法,也不支持对长度进行修改

pragma solidity ^0.4.16;
contract doubleArryTest{
     
    uint[2][4] testarr1=[[1,2],[3,4],[5,6]];
    function showlength1() public view returns (uint){
     
        return testarr1.length; //返回整个数组有多少值
    }
    
    function showlength2() public view returns (uint){
     
        return testarr1[0].length;  //返回单个元素的长度
    }
    
    function changevalue() public{
     
        testarr1[0][1]=10;  //给第1个元素的第2个值赋值10
        testarr1[2][0]=200;  //给第3个元素的第1个值赋值200
        
    }
    
    function showall() public view returns(uint[2][4]){
     
           return testarr1;  //可以看见直接返回时是横向排列的
    }
    
    //function pushtest() public{   不管怎样使用push方法均会报错
           //testarr1.push([7,8]);
           //testarr1.push(7,8);
    //}
    
    function inittest() public{
      
           //testarr1[0][3]=7;  
           testarr1[3][0]=7;  //可以给未赋值的位数赋值
           testarr1[3][1]=8;
           
    }
    function getsum() public view returns (uint){
     
        uint sum=0;
        for(uint i=0;i<testarr1.length;i++){
       
            for(uint j=0;j<testarr1[i].length;j++){
     
                sum+=testarr1[i][j];   //遍历数组求和
            }
        }
        return sum;
    }
}

未初始化剩余元素之前的运行为:

这里是引用

Solidity 从入门到实战(二)_第1张图片

初始化剩余元素之后为:
Solidity 从入门到实战(二)_第2张图片
改变元素之后为:
Solidity 从入门到实战(二)_第3张图片

可变二维数组

结论
支持对长度进行修改,修改后默认值为0
其它性质类似于固定二维数组

pragma solidity ^0.4.16;
contract dynamicDoubleArryTest{
     
    uint[][] testarr1=[[1,2],[3,4],[5,6]];
    function changevalue() public{
     
        testarr1[0][1]=10;
        testarr1[2][0]=200;
        
    }
   function initvalue1() public view returns(uint){
     
       return testarr1[0][2];
    }
    
   function initvalue2() public view returns(uint){
     
       return testarr1[0][3];
   }
    
    
    function getsum() public view returns (uint){
     
        uint sum=0;
        for(uint i=0;i<testarr1.length;i++){
     
            for(uint j=0;j<testarr1[i].length;j++){
     
                sum+=testarr1[i][j];
            }
        }
        return sum;
    }
    
    function changelengthtest1() public{
     
        testarr1.length=5;
    }
    
    function changelengthtest2() public{
     
        testarr1[0].length=5;
    }
    
    function getlength1() public view returns(uint){
     
        return testarr1.length;
    }
    
    function getlength2() public view  returns(uint){
     
        return testarr1[0].length;
    }
    
    function getdefaultvalue() public view  returns(uint){
     
        return testarr1[0][4];
    }
}

Solidity 从入门到实战(二)_第4张图片

大家可以自己运行一下看看效果,不在详细介绍。

数组字面量

如何使用?

  1. 当返回数组类型时,returns()括号里面的类型要与return的数据类型相同。return之后会选择默认最小数据类型,比如小于255的就默认为uint8类型, return [1,2,3]就是uint8,return[256,2,3]就默认为uint16等等,然而returns()里面的uint默认为uint256。
  2. 可以通过对return里面任意一个数值来进行强制转换来改变数据类型
  3. 可以直接接受参数来进行计算
pragma solidity ^0.4.16;
contract myFinalTest{
     
    function getArr1() public view returns(uint[3]){
     
    //    return [1,2,3];  报错,此处为uint8,而需要返回的是uint256
    }
    function getArr2() public view returns(uint[3]){
     
    //    return [256,2,3];报错,此处为uint16,而需要返回的是uint256
    }
    function getArr3() public view returns(uint8[3]){
     
        return [1,2,3];    //成功
    }
    function getArr4() public view returns(uint16[3]){
     
        return [256,2,3];  //成功
    }
    function getArr5() public view returns(uint32[3]){
     
        return [uint32(1),2,3]; //可以通过对return里面任意一个数值进行强制转换来改变最终的返回数据类型
                           
    }
    function getArr6(uint[] num) public view returns(uint){
     
        uint sum=0;
        for(uint i=0;i<num.length;i++){
     
            sum+=num[i]; //可以直接接受参数来进行计算,
           //参数需要按照格式来,此处就应该为[x1,x2,x3,x4,...,xn],使用字面量可以更好的与智能合约进行交互。
        }
        return sum;
    }
}

Solidity 从入门到实战(二)_第5张图片

你可能感兴趣的:(solidity,区块链,区块链,编程语言)