`

solidity数组

 
阅读更多
在 Solidity 中,只有 storage 类型有动态数组。memory 类型的数组必须有固定长度,并且不允许使用push()来附加元素。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract MyArray {
    int256 [] intArr;
    int256 [3] intArr2; 
    int256 [2][] intArr3;

    constructor(){
        intArr3 = new int[2][](1);//2维数组,每个数组最多有2个元素,但只有一行
    }

    function addInt(int256 i) public {
        intArr.push(i);
        intArr2[0] = 100;
    }    

    function removeInt(uint index) public {
       delete intArr[index];
    }    

    function popInt(uint index) public {
        intArr[index] = intArr[intArr.length-1];
        intArr.pop();
    }

    function getIntArr()  public view returns (int256[] memory){
        return intArr;
    }

    function getIntArr2()  public view returns (int256){
        return intArr2[0];
    }

    function getLength() public view returns(uint){
        return intArr.length;
    }

    function newArr() public view returns(uint){
        int[] memory a = new int[](3);
        uint len = a.length;
        return len;
    }

    function setFlagPair(uint index) public {
        intArr3[index][0] = 1;
        intArr3[index][1] = 2;
        //intArr3[1][0] = 3;
    }

    function getFlagPair(uint index) public view returns(int,int ) {
        return (intArr3[index][0],intArr3[index][1]);
    }
}


const { expect } = require("chai");
const { ethers } = require("hardhat");

describe("contract", function () {
  it("test", async function () {
    const MyContract = await ethers.getContractFactory("MyArray");
    const myContract = await MyContract.deploy();
    await myContract.deployed();
    await myContract.addInt(1)
    await myContract.addInt(2)
    await myContract.addInt(3)
    arr = await myContract.getIntArr();
    console.log("result:",arr.toString())
    await myContract.removeInt(0)
    arr = await myContract.getIntArr();
    console.log("after remove:",arr.toString());
    len = await myContract.getLength();
    console.log("len:",len.toString());
    await myContract.popInt(0)
    arr = await myContract.getIntArr();
    console.log("after pop:",arr.toString());

    arr2 = await myContract.getIntArr2();
    console.log("arr2:",arr2.toString());    

    arrLen = await myContract.newArr();
    console.log("arrLen:",arrLen.toString());    

    await myContract.setFlagPair(0);
    i= await myContract.getFlagPair(0);
    console.log("i:",i.toString()); 
  });
});




  contract
result: 1,2,3
after remove: 0,2,3
len: 3
after pop: 3,2
arr2: 100
arrLen: 3
i: 1,2
分享到:
评论

相关推荐

    以太坊solidity字符串拼接实现

    在早期版本的Solidity(0.4.x及之前),字符串被视作字节数组。这意味着在字符串之间进行拼接,你需要将字符串转换为字节,使用字节拼接的手段,然后再将结果转换回字符串。例如,可以通过`bytes`类型将字符串转换为...

    Solidity 官方文档中文版

    Solidity提供了一系列的数据类型,包括基本类型(如uint、int、bool等)、地址类型(address)、固定大小的数组和动态数组、映射(mapping)以及合约类型。映射是一种非常特殊的类型,它允许键值对的存储,但不支持...

    solidity2.pdf

    Solidity是用于编写智能合约的编程语言,特别是在以太坊区块链上运行。文档中提及的Solidity智能合约编写教程包含了一系列知识点,涵盖了从基础语法到高级特性,以及如何在以太坊平台上部署和管理智能合约。 ### ...

    Solidity开发基础

    ### Solidity开发基础 #### 知识点概览 1. **Solidity语言介绍与历史** 2. **Solidity语法特点** 3. **Solidity数据类型** 4. **Solidity函数定义** 5. **Solidity合约示例** 6. **Solidity中的变量声明** 7. **...

    Solidity教程

    在Solidity教程中,我们将深入理解这种以太坊智能合约编程语言的基础——变量类型。Solidity是一种静态类型语言,这意味着每个变量必须在编译时指定其类型。它提供了丰富的基本类型,可以组合成复杂的结构。 首先,...

    以太坊Solidity未初始化存储指针安全风险浅析.pdf

    在区块链技术以及智能合约开发领域中,以太坊是一个广受关注的平台,而Solidity作为以太坊上最主要的编程语言,其安全性问题一直受到行业内外的广泛研究。本文档《以太坊Solidity未初始化存储指针安全风险浅析》将...

    solidity-coverage:Solidity智能合约的代码覆盖率

    将此包添加到truffle-config.js ( Truffle docs )中的插件数组中 module . exports = { networks : { ... } , plugins : [ "solidity-coverage" ] } 跑步 truffle run coverage [command-options] 安全帽 从...

    基于FISCO BCOS 开发的solidity 智能合约DEMO

    - `Collections.sol`:Collections可能是指集合类型的智能合约,它可能包含了数组、映射等数据结构,用于存储和管理多种类型的数据。 - `TestCRUD.sol`:与`TestCRUDMultiParameter.sol`相似,可能是一个基础的...

    solidity基础学习材料

    对solidity的编译环境、基础语法进行介绍,包括数据类型、状态变量与临时变量、block对象和msg对象、函数和函数修饰符、数组、mapping、自定义结构、事务控制与异常处理、自定义修饰符、storage与memory等进行全面...

    solidity

    3. **类型系统**:Solidity支持多种数据类型,如`uint`(无符号整数)、`int`(有符号整数)、`address`(账户地址)、`bool`(布尔值)等,以及固定大小的数组和动态数组。 4. **事件(Events)**:用于与前端应用...

    cryptofin-solidity:一组Solidity库,用于在以太坊上构建安全且节气的智能合约

    Solidity库的集合,最初侧重于数组。 文档是从Natspec生成的。 快速开始 npm install --save cryptofin-solidity 在项目中使用 import "cryptofin-solidity/contracts/array-utils/AddressArrayUtils.sol"; contract...

    区块链实战(3):用Solidity实现投票智能合约

    在本课程中,我们将深入探讨如何使用Solidity这一专门用于以太坊区块链的编程语言来构建一个具有投票功能的智能合约。智能合约是区块链技术的核心组成部分,它允许在分布式网络上执行自动化的、可信的代码,无需任何...

    古老的Solidity智能合约错误代码编写

    在Solidity0.4.23版本的时候,有人在GitHub上列举了一些使用Solidity编写智能合约时常见的错误用法。虽然现在大家基本上都不会再写同样的问题代码,但是重新学习一下仍然有着借鉴意义。 1、tx.origin 错误用法:...

    multicall:用于静态多次调用的Solidity Contract和Typescript库

    @ indexed-finance / multicall 用于静态多次调用的Solidity Contract和Typescript库。 MultiCall.sol合同在其构造函数内执行多个调用,并将结果作为ABI编码的字节数组返回。 当初始化代码作为eth_call操作发送到0...

    serialize-solidity

    总之,"serialize-solidity"是一个强大的工具,它填补了Solidity在处理复杂数据序列化上的空白,使得在以太坊智能合约中处理字符串数组变得更加便捷。对于任何涉及到大量字符串数据交换的以太坊项目,这个库都是一个...

    solidity-bytesutil:字节扩展功能可增强稳定性

    solidity-bytesutil 用于处理字节的Solidity库。 快速开始 导入BytesUtil.sol并将此行添加到合同的开头 using BytesUtil for bytes; 职能 函数切片(字节bs,uint起始,uint长度) 将字节数组的一部分复制到新的...

    silidity 官方文档中文版PDF

    Solidity 支持多种数据类型,如地址(用于存储其他账户的地址)、整数(int和uint)、布尔(bool)、字节串(string)、数组和映射(mapping)。此外,还有固定大小的字节数组(bytesN)和动态字节数组(bytes)。 ...

    solidity_homework

    例如,避免循环和不必要的计算,使用映射(mapping)代替数组等。 **9. 静态分析工具** 为了检测潜在的安全问题和编码错误,开发人员可以使用Solhint和 Remix IDE 进行静态分析。这些工具可以提供编码规范和可能的...

    memArray:动态内存阵列

    - **删除元素**:Solidity不提供直接的删除元素操作,但可以通过重新分配数组来实现,这通常涉及创建一个新的数组并复制旧数组中需要保留的部分。 - **数组长度**:使用`length`属性获取数组的长度,如`uint length...

    truffle-debugger:调试使用Truffle构建的Solidity文件的核心功能

    松露调试器 ... contracts -合同对象数组,具有以下属性: contractName名称 source -完整的密实度的源代码 sourcePath (可选)磁盘上Solidity文件的路径 ast -Solidity编译器的输出AST(新样式,不是lega

Global site tag (gtag.js) - Google Analytics