Solidity 从入门到实战(二)

Solidity 从入门到实战(二)

注意:本专栏主要来自于https://www.bilibili.com/video/BV1St411a7Pk?p=11&spm_id_from=pageDriver的学习笔记以及https://blog.youkuaiyun.com/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;
    }
}

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

这里是引用

在这里插入图片描述

初始化剩余元素之后为:
在这里插入图片描述
改变元素之后为:
在这里插入图片描述

可变二维数组

结论
支持对长度进行修改,修改后默认值为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];
    }
}

在这里插入图片描述

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

数组字面量

如何使用?

  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;
    }
}

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟逆袭之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值