当前位置: 代码迷 >> 综合 >> Solidity 从入门到实战(二)
  详细解决方案

Solidity 从入门到实战(二)

热度:63   发布时间:2023-12-26 01:32:03.0

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个值赋值10testarr1[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;}
}

在这里插入图片描述