Solidit數(shù)組有什么用

這篇文章主要講解了“Solidit數(shù)組有什么用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Solidit數(shù)組有什么用”吧!

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名申請、虛擬主機、營銷軟件、網(wǎng)站建設(shè)、永勝網(wǎng)站維護、網(wǎng)站推廣。

數(shù)組(Arrays)

數(shù)組可以聲明時指定長度,也可以是動態(tài)變長。對storage存儲的數(shù)組來說,元素類型可以是任意的,類型可以是數(shù)組,映射類型,結(jié)構(gòu)體等。但對于memory的數(shù)組來說。如果作為public函數(shù)的參數(shù),它不能是映射類型的數(shù)組,只能是支持ABI的類型。

一個元素類型為T,固定長度為k的數(shù)組,可以聲明為T[k],而一個動態(tài)大?。ㄗ冮L)的數(shù)組則聲明為T[]。 還可以聲明一個多維數(shù)組,如聲明一個類型為uint的數(shù)組長度為5的變長數(shù)組(5個元素都是變長數(shù)組),可以聲明為uint[][5]。(注意,相比非區(qū)塊鏈語言,多維數(shù)組的長度聲明是反的。)

要訪問第三個動態(tài)數(shù)組的第二個元素,使用x[2][1]。數(shù)組的序號是從0開始的,序號順序與定義相反。

bytesstring是一種特殊的數(shù)組。bytes類似byte[],但在外部函數(shù)作為參數(shù)調(diào)用中,bytes會進行壓縮打包。string類似bytes,但不提供長度和按序號的訪問方式(目前)。 所以應(yīng)該盡量使用bytes而不是byte[]

可以將字符串s通過bytes(s)轉(zhuǎn)為一個bytes,可以通過bytes(s).length獲取長度,bytes(s)[n]獲取對應(yīng)的UTF-8編碼。通過下標(biāo)訪問獲取到的不是對應(yīng)字符,而是UTF-8編碼,比如中文編碼是多字節(jié),變長的,所以下標(biāo)訪問到的只是其中的一個編碼。 類型為數(shù)組的狀態(tài)變量,可以標(biāo)記為public,從而讓Solidity創(chuàng)建一個訪問器,如果要訪問數(shù)組的某個元素,指定數(shù)字下標(biāo)就好了。(稍后代碼事例)

創(chuàng)建內(nèi)存數(shù)組

可使用new關(guān)鍵字創(chuàng)建一個memory的數(shù)組。與stroage數(shù)組不同的是,你不能通過.length的長度來修改數(shù)組大小屬性。我們來看看下面的例子:

pragma solidity ^0.4.16;

contract C {
    function f(uint len) public pure {
        uint[] memory a = new uint[](7);
                
        //a.length = 100;  // 錯誤
        bytes memory b = new bytes(len);
        // Here we have a.length == 7 and b.length == len
        a[6] = 8;
    }
}

數(shù)組常量及內(nèi)聯(lián)數(shù)組

數(shù)組常量,是一個數(shù)組表達式(還沒有賦值到變量)。下面是一個簡單的例子:

pragma solidity ^0.4.16;

contract C {
    function f() public pure {
        g([uint(1), 2, 3]);
    }
    function g(uint[3] _data) public pure {
        // ...
    }
}

通過數(shù)組常量,創(chuàng)建的數(shù)組是memory的,同時還是定長的。元素類型則是使用剛好能存儲的元素的能用類型,比如[1, 2, 3],只需要uint8即可存儲,它的類型是uint8[3] memory。

由于g()方法的參數(shù)需要的是uint(默認(rèn)的uint表示的其實是uint256),所以需要對第一個元素進行類型轉(zhuǎn)換,使用uint(1)來進行這個轉(zhuǎn)換。

還需注意的一點是,定長數(shù)組,不能與變長數(shù)組相互賦值,我們來看下面的代碼:

//  無法編譯
pragma solidity ^0.4.0;

contract C {
    function f() public {
        // The next line creates a type error because uint[3] memory
        // cannot be converted to uint[] memory.
        uint[] x = [uint(1), 3, 4];
    }
}

已經(jīng)計劃在未來移除這樣的限制。當(dāng)前因為ABI傳遞數(shù)組還有些問題。

成員

length屬性

數(shù)組有一個.length屬性,表示當(dāng)前的數(shù)組長度。storage的變長數(shù)組,可以通過給.length賦值調(diào)整數(shù)組長度。memory的變長數(shù)組不支持。 不能通過訪問超出當(dāng)前數(shù)組的長度的方式,來自動實現(xiàn)改變數(shù)組長度。memory數(shù)組雖然可以通過參數(shù),靈活指定大小,但一旦創(chuàng)建,大小不可調(diào)整。

push方法

storage的變長數(shù)組和bytes都有一個push方法(string沒有),用于附加新元素到數(shù)據(jù)末端,返回值為新的長度。

限制情況

當(dāng)前在external函數(shù)中,不能使用多維數(shù)組。

另外,基于EVM的限制,不能通過外部函數(shù)返回動態(tài)的內(nèi)容。

contract C {
     function f() returns (uint[]) { ... }
      }

在這個的例子中,如果通過web.js調(diào)用能返回數(shù)據(jù),但從Solidity中調(diào)用不能返回數(shù)據(jù)。一種繞過這個問題的辦法是使用一個非常大的靜態(tài)數(shù)組。

pragma solidity ^0.4.16;

contract ArrayContract {
    uint[2**20] m_aLotOfIntegers;
    // 這里不是兩個動態(tài)數(shù)組的數(shù)組,而是一個動態(tài)數(shù)組里,每個元素是長度為二的數(shù)組。
    bool[2][] m_pairsOfFlags;
    // newPairs 存在 memory里,因為是函數(shù)參數(shù)
    function setAllFlagPairs(bool[2][] newPairs) public {
        m_pairsOfFlags = newPairs;
    }

    function setFlagPair(uint index, bool flagA, bool flagB) public {
        // 訪問不存在的index會拋出異常
        m_pairsOfFlags[index][0] = flagA;
        m_pairsOfFlags[index][1] = flagB;
    }

    function changeFlagArraySize(uint newSize) public {
        // 如果新size更小, 移除的元素會被銷毀
        m_pairsOfFlags.length = newSize;
    }

    function clear() public {
        // 銷毀
        delete m_pairsOfFlags;
        delete m_aLotOfIntegers;
        // 同銷毀一樣的效果
        m_pairsOfFlags.length = 0;
    }

    bytes m_byteData;

    function byteArrays(bytes data) public {
        // byte arrays ("bytes") are different as they are stored without padding,
        // but can be treated identical to "uint8[]"
        m_byteData = data;
        m_byteData.length += 7;
        m_byteData[3] = byte(8);
        delete m_byteData[2];
    }

    function addFlag(bool[2] flag) public returns (uint) {
        return m_pairsOfFlags.push(flag);
    }

    function createMemoryArray(uint size) public pure returns (bytes) {
        // Dynamic memory arrays are created using `new`:
        uint[2][] memory arrayOfPairs = new uint[2][](size);
        // Create a dynamic byte array:
        bytes memory b = new bytes(200);
        for (uint i = 0; i < b.length; i++)
            b[i] = byte(i);
        return b;
    }
}

感謝各位的閱讀,以上就是“Solidit數(shù)組有什么用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Solidit數(shù)組有什么用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

網(wǎng)站題目:Solidit數(shù)組有什么用
網(wǎng)頁地址:http://muchs.cn/article38/iehcpp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計公司、移動網(wǎng)站建設(shè)、App開發(fā)、微信公眾號軟件開發(fā)、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計公司