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];}
}
大家可以自己运行一下看看效果,不在详细介绍。
数组字面量
如何使用?
- 当返回数组类型时,returns()括号里面的类型要与return的数据类型相同。return之后会选择默认最小数据类型,比如小于255的就默认为uint8类型, return [1,2,3]就是uint8,return[256,2,3]就默认为uint16等等,然而returns()里面的uint默认为uint256。
- 可以通过对return里面任意一个数值来进行强制转换来改变数据类型
- 可以直接接受参数来进行计算
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;}
}