可变长度数组
pragma solidity ^0.4.0;
contract uintArray {
uint[] num = [1,2,3,4];//初始化一个uint数组
//构造函数GetAttribute获得uint数组的相关属性
function GetAttribute() view public returns (uint[],uint) {
return (num,num.length);
}
//构造函数ChangeLength1验证缩短可变长度数组缩短长度直接从有往左删去相应长度
function ChangeLength1() public {
num.length = 2;
}
//构造函数ChangeLength2验证增加可变长度数组增加长度直接给新增位置补0
function ChangeLength2() public{
num.length = 6;
}
//构造函数TestPush验证可变长度数组push的方式是从末尾直接增加
function TestPush() public{
num.push(100);
}
//构造函数ChangeValue验证可变长度数组的单个元素可以直接修改
function ChangeValue(uint data) public{
num[0] = data;
}
}
可变长度数组可以直接读取相应位置的元素的值,并可以直接读取长度,这与string
类型有很大区别
二维数组
pragma solidity ^0.4.0;
contract TwoArray {
//solidity和其他语言在二维数组这里有一个非常大的不同,定义定长二维数组的时候uint[i][j],i表示列,而j表示行
uint[2][3] num = [[1,2],[2,3],[3,4]];
//构造函数outputOneLine,outputOneValue验证当输出数组的时候,第一个下表i表示第几行,第二个下边j表示第几列
function outputOneLine() view public returns (uint[2]) {//solidity有一个非常恶心的地方就是定长的返回值必须也对应为定长
return num[0];
}
function outputOneValue() view public returns (uint) {
return num[0][1];
}
}
二维数组与其他语言最大的区别就是:
- 当定义的时候,第一个下表表示有几列,第二个下表表示有几行;
- 当读值的时候,第一个下表又表示有几行,第二个下表表示有几列。
还有一个值得注意的地方就是,solidity
的返回值十分依赖returns
的标注,当定义的是已经定长的数组时,返回值一定要与其长度对应,否则会发生报错
二维的这种数组固定长度数组毫无疑问也是可以修改长度的
长度控制问题
pragma solidity ^0.4.0;
contract TpyeControl {
function back1() view returns (uint8[3]) {
return [1,2,3];
}
function back2() view returns (uint16[3]) {//这里如果是uint8[3]就会报错,因为uint8最大可以表示255
return [1,2,256];
}
function back3() view returns (uint[3]) {//如果使用uint,需要将类型转换过来
return [uint(1),2,3];
}
function OperateSum(uint8[] num) public returns (uint) {
uint sum = 0;//这里讲sum定义成uint型防止和越界
for(uint i = 0;i < num.length;i++){
sum = sum+num[i];
}
}
}
solidity
的性质,默认返回值最小匹配原则,所以才会有第一组只能用uint8
,第二组只能用uint16
。uint
定长以8为步长直到uint256
uintI
的这个I
表示的是位数,而bytesI
的这个I
表示的是字节数,一个字节需要四位来表示
总结
- 可变长度数组其实就是未定义初始长度的数组,比如
bytes
,uint[]
,string
,uint[][]
;固定长度数组就是在定义的时候已经初始定了其长度的范围,比如bytes1
,uint[2]
,uint[2][3]
。 - 固定长度数组可以通过修改
length
属性来改变其长度,增加长度均为在末尾补0,减小长度均是删去长度外的值。 solidity
最小类型匹配原则。