ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Solidity基础语法结构 - 个人笔记(2)

2021-12-19 15:00:46  阅读:177  来源: 互联网

标签:function return Solidity 笔记 语法结构 returns uint public view


 加入public自动返回get

bytes  length方法 , string无length属性,可先转回bytes

bytes  push方法

 修改string类型

pragma solidity ^0.4.0;
contract stringtest1{
    string testword='helloworld'; //68656c6c6f776f726c64为这串字符的16进制
    
    function stringlength() public view returns (uint){
        //return testword.length;  直接返回长度会报错
        return bytes(testword).length;  //强制类型转换之后可以
    }
    
    function stringchange() public  {
        //testword[0]='A'; 直接进行变更会报错
        bytes(testword)[0]='A'; //41为A的16进制值,强制类型转换之后可以修改
    }
    
    function getname() public view returns(bytes){
        return bytes(testword); //查看16进制的string
    }
    
    function stringchangetest() public view returns(byte){
        return bytes(testword)[0]; //查看第一位是否被修改
    }
    
}

 String类型中中文按utf-8存储占3个字节

字节数组可以进行大小比较

pragma solidity ^0.4.0;

contract helloworld {
    bytes1 public num1 = 0x12;  
    bytes4 public num2 = 0x12121212;
    uint8 num3 = 0x12;
    uint8 num4 = 12;
    function compare1() public view returns(bool){
        return num1<num2;
    }
    function compare2() public view returns(bool){
        return num1>num2;
    }
    function compare3() public view returns(bool){
        //return num1>num3;不管是16进制还是二进制,编译器都会报错,
        //return num1>num4;说明无法进行byte和int之间的比较
    }
}

说明无法进行byte和int之间的比较

将固定长度数组变为可变长度数组 

contract arrtranstest{
    bytes10 testword=0x68656c6c6f776f726c64;
    bytes transarr = new bytes(testword.length);
    
    function setvalue() public {
       for(uint i=0;i<testword.length;i++){
           transarr[i]=testword[i];
        }
    }
    function showtransarr() public view returns(bytes){
        return transarr;
    }
}

 将可变长度字节数组bytes转化为可以显示字符的string

contract bytestostring{
    bytes testword = new bytes(10);
    
    function setvalue() public {
       testword.push(0x68);
       testword.push(0x4d);
    }
    function showtransarr() public view returns(string){
        return string(testword);
    }
}

将固定长度字节数组转化为string类型

contract bytes32tostring{
    bytes10 testword=0x68656c6c6f776f726c64; //为helloworld
    
    function bytes32tostringF() public view returns(string){
        uint count=0; //这里必须初始为uint,否则报错
    for(uint i=0;i<testword.length;i++){
        bytes1 tester=testword[i];
        if(tester!=0x00){//此步计算出所有不为空值的位数
            count++;
        }
    }
    bytes memory transarr=new bytes(count);//声明一个新的可变数组,长度为之前的count,
                                           //这样就不会导致转化后后面过多的方框了
    for(uint j=0;j<count;j++){//重新对可变数组进行赋值
        transarr[j]=testword[j];      
    }
    return string(transarr);//强制转化即可
    }
}

 固定长度数组

1.如果不赋值,那么默认所有位均为0
2.支持直接使用.length查看数组长度,但不支持对数组长度做修改
3.不支持通过.push添加数据

contract fixedarrtest{
    uint[3] testarr1;//不进行赋值直接声明数组
    uint[3] testarr2=[1,2,3];//声明数组并进行赋值
    
    function showarr1() public view returns(uint[3]){
        return testarr1; //如果不赋值,那么默认所有位均为0
    }
    
    function showarr2() public view returns(uint[3]){
        return testarr2;
    }
    
    function initarr() public{
        testarr1[0]=12;//进行赋值操作
    }
    
    function lengthtest() public view returns(uint){
        return testarr1.length;//solidity支持直接查看数组长度
    }
    
    function changelengthtest() public view returns(uint){
        //testarr1.length=testarr1.length+3;//solidity不支持直接修改数组长度
    }
    
    function pushtest() public view {
        //testarr2.push(2);//solidity不支持直接push数据到数组
    }
    
}

 可变长度二维数组

1.初始化时,uint[ i ] [ j ]表示有j个元素,每个元素包含i个值(和其他许多语言不同)
2.可变长度二维数组可以直接获取长度,既可以获得所有元素个数,也可以获得单独元素有多少值
3.对二维数组进行增删改等操作时时是与初始化时反过来的,即uint[ i ] [ j ]表示第i个元素的第j个值(和其他许多语言一样)
4.不支持push方法
5.支持对长度进行修改,修改后默认值为0
6.未声明的值不能直接赋值,修改长度之后默认有值才可以
 

contract dynamicdoublearrtest{
    uint[][] testarr1=[[1,2],[3,4],[5,6]];
    function changevalue() public{
        testarr1[0][1]=10;
        testarr1[2][0]=200;
        
    }
    
    //function showall() public view returns(uint[][]){
    //       return testarr1;
    //}
    
    //function pushtest() public{
           //testarr1.push([7,8]);
           //testarr1.push(7,8);
    
    function inittest() public{
           //testarr1[0][3]=7;
          testarr1[0][2]=7; //未声明的值仍然不支持直接赋值
          testarr1[0][3]=8;
           //testarr1.push(7,8);
    }
    
   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];
    }
}

数组字面量

contract finaltest{
    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;
    }
}

标签:function,return,Solidity,笔记,语法结构,returns,uint,public,view
来源: https://blog.csdn.net/vacatin/article/details/121936838

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有