基于以太坊的智能合约开发Solidity(数组提升篇)

参考教程:【数据存储篇】1、string内存原理——特殊动态数组_哔哩哔哩_bilibili

1、语法——字符串:

//声明版本号(程序中的版本号要和编译器版本号一致)
pragma solidity ^0.5.17;
//合约
contract DynamicString
{string name = "lalalalalalala啦啦啦";function getLength() public returns(uint){return bytes(name).length;  //要想获取字符串的长度,需要先将其强制转换成动态长度字节数组(string不提供长度属性)}function getPartName() public returns(bytes1){return bytes(name)[0];  //返回字符串第一个字符(1个字节)的二进制形式(不能直接通过数组下标的形式获取其中的字符)}function changeName() public {bytes(name)[0] = 'T';  //对字符串的某一个字符进行修改//一个英文字母(以及特殊字符和数字等)占1个字节,一个中文汉字占3个字节}
}

(1)要想获取字符串的长度,需要通过bytes()先将其强制转换成动态长度字节数组(string不提供长度属性)。

(2)对于string,不能通过数组下标的形式获取其中的某个字符

(3)一个汉字占3个字节,这是因为汉字在内存中是通过UTF8类型存储的,至于一些特殊字符和数字则是占用一个字节

2、语法——字节数组转换:

(1)固定长度字节数组转为固定长度字节数组:

//声明版本号(程序中的版本号要和编译器版本号一致)
pragma solidity ^0.5.17;
//合约
contract DynamicString
{bytes12 name =  0x7a68656e676a69616e78756e;function changeBytes1() public view returns(bytes1){return bytes1(name);  //返回的结果为“0x7a”,后面的内容全部丢失}function changeByte2() public view returns(bytes2){return bytes2(name);  //返回的结果为“0x7a68”,后面的内容全部丢失}function changeByte3() public view returns(bytes16){return bytes16(name);  //返回的结果为“0x7a68656e676a69616e78756e00000000”,强制转换后多余的空间由0填充}
}

(2)固定长度字节数组转为动态长度字节数组:

//声明版本号(程序中的版本号要和编译器版本号一致)
pragma solidity ^0.5.17;
//合约
contract DynamicString
{bytes12 name =  0x7a68656e676a69616e78756e;function fixBytesToDynamicBytes() public view returns(bytes memory){//return bytes(name);  不允许直接将字符串的强制类型转换返回,需要借助for循环将固定长度字节数组复制到动态长度字节数组中bytes memory newName = new bytes(name.length);  //方法内的动态长度字节数组要加“memory”,这里暂时不做解释for(uint i = 0; i < name.length; i++)  //数组元素下标的数据类型只能是uint,除此之外for循环的使用与c语言基本相同(if语句、while语句以及相关关键字的用法也基本相同){newName[i] = name[i];  //复制行为}return newName;}
}

(3)动态长度字节数组转为字符串:

//声明版本号(程序中的版本号要和编译器版本号一致)
pragma solidity ^0.5.17;
//合约
contract Bytes2String
{bytes name =  new bytes(2);function init() public{name[0] = 0x7a;name[1] = 0x68;}function bytesToString() public view returns(string memory){return string(name);  //允许将动态长度字节数组强制转换字符串的结果直接返回}
}

(4)固定长度字节数组转为字符串:

//声明版本号(程序中的版本号要和编译器版本号一致)
pragma solidity ^0.5.17;
//合约
contract Bytes32ToString
{function byts32ToString(bytes32 inputName)  public view returns(string memory){uint count = 0;  //定义一个无符号变量记录字节数组的实际长度,否则转换而得的字符串尾部会有不定量的NUT字符for(uint i = 0; i < inputName.length; i++)  //利用for循环计算inputName数组的实际长度{if(inputName[i] != 0){count++;}}bytes memory finalName = new bytes(count);  //动态长度字节数组的初始长度为inputName数组的实际长度//利用for循环将固定长度字节数组转换为动态长度字节数组,再强制转换为字符串for(uint j = 0; j<count; j++){finalName[j] = inputName[j];  //复制行为}return string(finalName);}}

3、语法——数组与函数结合使用:

(1)固定长度数组:

//声明版本号(程序中的版本号要和编译器版本号一致)
pragma solidity ^0.5.17;
//合约
contract FixArray
{//(定义语法:数据类型[元素个数] 数组名)uint[5] arr = [1,2,3,4,5];  //定义时可以不进行初始化,那么初值将会全部置为0function init() public{arr[0] = 100;  //可以对单个元素值进行修改arr[1] = 200;}function sumArr() public view returns(uint){uint sum = 0;for(uint i = 0; i < arr.length; i++)  //除了数组元素下标是uint类型以外,其它地方和c语言基本相同{sum += arr[i];}return sum;}//固定长度数组可以通过length获取其长度,但是不能对其长度进行更改,也不能进行push操作
}

(2)可变长度数组:

//声明版本号(程序中的版本号要和编译器版本号一致)
pragma solidity ^0.5.17;
//合约
contract DynamicArray
{uint[] arr = [1,2,3,4,5];  //在定义数组时不写出元素个数,就是定义可变长度数组function changeLength() public{arr.length = 1;  //对可变长度数组的长度进行缩短,原数组的多余部分会丢失}function changeLength2() public{arr.length = 10;  //对可变长度数组的长度进行增长,多余部分用0填充}function getContent() public view returns(uint[] memory){return arr;  //可以直接将数组(不管长度是否可变)作为返回值返回(也可以将数组作为参数传入)}function getLength() public view returns(uint){return arr.length;}function push() public{arr.push(6);  //在可变长度数组末尾追加元素6}}

可以直接将数组(不管长度是否可变)作为返回值返回(也可以将数组作为参数传入),作为返回值时,需注意returns声明的数据类型要与返回值严格相同(对于固定长度数组,声明的元素个数要与返回的元素个数相同,作为参数传入函数时也同理)。

4、语法——二维数组:

(1)固定长度二维数组:

//声明版本号(程序中的版本号要和编译器版本号一致)
pragma solidity ^0.5.17;
//合约
contract TwoArray
{uint[2][3] arr = [[1,2],[3,4],[5,6]];  //与大多数编程语言不同,solidity定义二维数组时先声明列数再声明行数(个人认为比较别扭)function getLength() public view returns(uint){return arr.length;  //该例中返回3,代表有3个元素(其中每个元素自己又由2个元素组成)}function getContent() public view returns(uint[2][3] memory){return arr;  //可以将二维数组作为返回值直接返回(输出“unit256[2][3]:1,2,3,4,5,6”,是线性表示的)}function add() public view returns(uint){uint sum = 0;//遍历二维数组需要借助嵌套循环for(uint i = 0; i<arr.length; i++)  //arr.length代表arr中有3行{for(uint j=0; j<arr[0].length; j++)  //arr.length[0]代表arr中每一行有2个元素(即2列){sum += arr[i][j];  //虽然二维数组的声明比较别扭,但使用时和c语言基本也完全一样}}return sum;}
}

(2)可变长度二维数组:

//声明版本号(程序中的版本号要和编译器版本号一致)
pragma solidity ^0.5.17;
//合约
contract DynamicTwoArray
{uint[][] arr = [[1,2],[3,4],[6,7]];  //可变长二维数组初始化时不允许每个一维数组长度不相同/*function getContent()  public view returns(uint[][] memory){return arr;  //动态长度数组不支持直接返回}*/function changeLength() public{arr.length = 10;  //修改二维数组的行数}function getLength() public view returns(uint){return arr.length;  //二维数组的行数}function getContntLength() public view returns(uint) {return arr[0].length;  //二维数组的列数}}

5、语法——数组字面量(数组常量):

//声明版本号(程序中的版本号要和编译器版本号一致)
pragma solidity ^0.5.17;
//合约
contract ArrayLiterals
{/* function getArrayLiterals() public returns(uint[3] memory){return [1,2,3];  //uint默认为256位,但是1、2、3都是uint8类型,类型不匹配,会报错}function getArrayLiterals2() public returns(uint[3] memory){return [256,255,3];  //uint默认为256位,但是256是uint16类型,类型不匹配,会报错(255、3是uint8类型)}*/function getArrayLiterals1() public view returns(uint16[3] memory){return [256,2,3];  //解决办法1:让声明的返回值类型和实际返回值匹配(将返回值参数中的类型改为数组元素中最大值的类型)}function getArrayLiterals2() public view returns(uint[3] memory){return [uint(256),2,3];  //解决办法2:让实际返回值类型和声明返回值匹配}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法】递归、搜索与回溯算法

文章目录 一. 名词解释1. 递归1.1 什么是递归&#xff1f;1.2 为什么会用到递归&#xff1f;1.3 如何理解递归&#xff1f;1.4 如何写好一个递归&#xff1f; 2. 遍历和搜索3. 回溯和剪枝 二. 递归系列专题1. 汉诺塔问题2. 合并两个有序链表3. 反转链表4. 两两交换链表中的节点…

3DSEE:AI驱动的3D模型语义搜索引擎

3DSEE &#xff08;3D SEmantic Engine&#xff09;是基于 AI 技术的 3D 模型语义搜索引擎&#xff0c;可以自动提取 3D 模型内涵的语义信息并存储入库&#xff0c;以帮助用户使用自然语言或关键字高效地检索 3D 模型。3DSEE 提供完善的二次开发 API&#xff0c;无论使用Java、…

大数据技术6:大数据技术栈

前言&#xff1a;大数据相关的技术名词特别多&#xff0c;这些技术栈之间的关系是什么&#xff0c;对初学者来说很难找到抓手。我一开始从后端转大数据的时候有点懵逼&#xff0c;整体接触了一遍之后才把大数据技术栈给弄明白了。 一、大数据技术栈 做大数据开发&#xff0c;无…

linux课程第二课------命令的简单的介绍2

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

如何用idm下载迅雷 2024最新详细解析

有许多小伙伴日常习惯用迅雷处理或者下载文件&#xff0c;对于普通用户&#xff0c;由于迅雷平台的限速&#xff0c;下载速度仅有几十kb。此外&#xff0c;还有一些小伙伴安装idm后软件界面是英文&#xff0c;那么如何用idm下载迅雷&#xff0c;idm怎么设置中文呢&#xff1f;今…

9:00面试,9:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到12月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40…

C++写文件时主动刷新磁盘文件大小

一.效果 如下图所示,test.log是我正在写入的文件。 二.实现 #include <fstream> #include <io.h> #include <iostream> #include <stdio.h>class OfSteamImmediately : public std::ofstream { public:OfSteamImmediately(){}~OfSteamImmediately()…

【项目小结】优点分析

一、 个人博客系统 一&#xff09;限制强制登录 问题&#xff1a;限制用户登录后才能进行相关操作解决&#xff1a; 1&#xff09;前端&#xff1a; ① 写一个函数用于判断登录状态&#xff0c;如果返回的状态码是200就不进行任何操作&#xff0c;否则Ajax实现页面的跳转操作…

ArkTS布局

布局 通过Row和Column容器来实现布局 通用属性 justifyContent 设置子元素在主轴方向的对齐格式 Column容器参数如下&#xff08;Row容器只是改变主轴方向&#xff0c;将每个图横过来理解即可&#xff09; alignItems 设置子元素在交叉轴方向的对齐格式 Row容器使用VerticalA…

【清晰明了】Jenkins邮件发送配置

自带邮件插件 首先要知道的是jenkins是自带邮件插件的&#xff0c;且不支持卸载。 下面开始配置自带邮件插件。 配置默认邮件管理员 系统管理 --> 系统配置&#xff0c;进行如下配置&#xff1a; 不配置管理员邮件地址报错如下 jakarta.mail.internet.AddressException:…

成绩统计(oj题)

一道考验细节的题 最后是&#xff1f;&#xff1a;运算符用错了 代码如下&#xff1a; #include<stdio.h> #include<string.h> typedef struct Grade{int num;int inv; }Grade; Grade tmp[10]; int n, m, g, interval[10] {0};int main(void) {scanf("%d%d…

SPRD Android 13 下拉状态栏菜单添加静音快捷键简单记录

SPRD Android 13 下拉状态栏菜单添加静音快捷键简单记录 需要修改文件具体修改补丁吐槽需要修改文件 frameworks/base/packages/SystemUI/res/values/config.xml frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java frameworks/base…

【Python】手把手教你用tkinter设计图书管理登录UI界面(四)

上一篇&#xff1a;【Python】手把手教你用tkinter设计图书管理登录UI界面&#xff08;三&#xff09;-CSDN博客 下一篇&#xff1a; 本文主要阐述完成“用户密码找回”&#xff0c;诸位且看我如何实现吧&#xff01; 为了方便使用“已注册用户数据库.txt”的数据&#xff0…

qt有哪些常用控件

Qt 是一个跨平台的应用程序开发框架&#xff0c;提供了许多不同类型的控件来构建用户界面。以下是一些常见的 Qt 控件&#xff1a; 按钮&#xff08;Button&#xff09;&#xff1a;用于执行操作或触发事件。文本框&#xff08;TextBox&#xff09;&#xff1a;用于输入和显示文…

Windows 11安装xray

需要先安装python&#xff0c;我这里已经安装好了&#xff0c;在命令行里边使用python --version可以看到自己的python版本。 xray的下载网址为https://github.com/chaitin/xray/releases&#xff0c;我根据自己的笔记本电脑配置&#xff0c;选择下载xray_windows_amd64.exe.…

静态代理,JDK动态代理,CGLIB代理原理详解

学习代理前要对反射有一定的了解 代理&#xff1a; 代理是一种设计模式&#xff0c;代理模式是一种结构型设计模式&#xff0c;它允许通过创建一个代理对象来控制对另一个对象的访问。代理对象充当了客户端与真实对象之间的中介&#xff0c;它可以在客户端和真实对象之间添加…

MySQL笔记-第08章_聚合函数

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第08章_聚合函数1. 聚合函数介绍1.1 AVG和SUM函数1.2 MIN和MAX函数1.3 COUNT函数 2. GROUP BY2.1 基本使用2.2 使用多个列分组2.3 GROUP BY中…

100天精通Python(可视化篇)——第110天:Pyecharts绘制可视化大屏项目(附上完整源码)

文章目录 专栏导读1. 数据准备2. 绘制地图3. 绘制折线图4. 绘制柱状图5. 绘制饼图6. 创建网格组合所有图标7. 创建时间轴8. 完整代码书籍推荐专栏导读 🔥🔥本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教学,…

现代雷达车载应用——第2章 汽车雷达系统原理 2.2节

经典著作&#xff0c;值得一读&#xff0c;英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.2 汽车雷达架构 从顶层来看&#xff0c;基本的汽车雷达由发射器&#xff0c;接收器和天线组成。图2.2给出了一种简化的单通道连续波雷达结构[2]。这…

代码随想录算法训练营第五十二天| 300 最长递增子序列 674 最长连续递增子序列 718 最长重复子数组

目录 300 最长递增子序列 674 最长连续递增子序列 718 最长重复子数组 300 最长递增子序列 class Solution { public:int lengthOfLIS(vector<int>& nums) {vector<int>dp(nums.size(),1);//以i结尾的最长递增子序列的长度for(int i 0;i < nums.size()…