Solidify實現一個智慧合約10(一維陣列和二維陣列)
阿新 • • 發佈:2018-12-15
固定長度的陣列
固定長度型別陣列的宣告及其通過length方法獲取陣列長度求和。
pragma solidity ^0.4.4; /* 陣列一旦建立,長度不可變 但裡面的內容可變 */ contract Sz { //定義長為5的陣列,並對其初始化。 uint[5] T = [1,2,3,4,5]; //計算陣列中所有數的和。 function numbers() constant returns (uint) { uint count = 0; for(uint i=0;i<T.length;i++){ count = count + T[i]; // count += T[i]; //同上 } return count; } }
宣告陣列時,一旦長度固定,將不能再修改陣列的長度,可以修改其內容。
可變長度的陣列
宣告方式
pragma solidity ^0.4.4;
contract Sz {
//定義可變陣列,並對其初始化。
uint[] T = [1,2,3,4,5];
//因為上步中初始化5個元素,所有預設長度為5
function Tlength() constant returns (uint) {
return T.length;
}
}
修改長度
function setLength(uint len) {
T.length = len;
}
修改值的兩種方法
//修改值
function setIndexValue() {
T[0] =5;
}
function pushValue() {
T.push(10);
}
另外的一種建立方式
uint[] T1 = new uint[](5);//5是初始長度,預設值為[0,0,0,0,0]
//進行賦值
function Sz() {
for(uint i=0;i<5;i++){
// T1.push(i); //push後長度會發生變化
T1[i] = i+1;
}
}
二維陣列
定義方法1
pragma solidity ^0.4.4; contract Sz { //定義長為3的二維陣列,並對其初始化。 uint[2][3] T = [[1,2],[3,4],[5,6]]; //計算陣列中所有數的和。 function Sz_length() constant returns (uint) { return T.length; //3 } }
注意:與一般二維陣列(行列)相反。
定義方法2
uint[2][] T1= new uint[2][](0);
修改值
// 修改值
function pushToT1(uint[2] t) {
T1.push(t);
}
// 檢視修改後的長度變化
function T1length() constant returns (uint) {
return T1.length;
}
memory型別陣列
建立方式
pragma solidity ^0.4.4;
contract Sz {
function f(uint len) {
uint[] memory a = new uint[](7);
bytes memory b = new bytes(len);
a[6] = 4;
b[1] = 0x68;
}
}
注意:建立一個長度為length的memory型別的陣列可以通過new關鍵字來建立,memory陣列一旦建立,它不可通過length修改其長度,但可以改變其內容。(若不加memory關鍵字,預設的是storage型別)
型別轉換問題
pragma solidity ^0.4.4;
contract Sz {
function f() {
// g([1,2,3]); //直接呼叫會報錯,因為g函式中預設的是uint256,而此處預設的是uint8,因此需要強轉
g([uint(1),2,3]);
}
function g(uint[3] data) {
//....
}
}
memory型別的固定長度陣列不可直接賦值給storage/memory型別的可變陣列
總結:
bytes1~32建立的是固定位元組大小的位元組陣列,長度不可變,內容不可修改。而string是特殊的可變位元組陣列,它可以轉換為bytes以通過length你方法獲取它的位元組長度,亦可通過索引修改相對於的位元組內容。
建立可變位元組陣列除了可以通過bytes b = new bytes(len)來建立之外,還可以通過byte[] b來建立。
而bytes1~32我們可以通過byte[len] b 來建立,len的範圍為1~32。不過這 兩種方式建立的不可變位元組陣列有一點小區別:bytes1~32直接宣告的不可變位元組陣列中,長度不可變,內容不可變。而byte[len] b建立的位元組陣列,長度不可變,但內容可修改。