Solidity 0.8.10 无法通过更改storage 数组长度改变数组大小

2024-04-18 12:18

本文主要是介绍Solidity 0.8.10 无法通过更改storage 数组长度改变数组大小,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • Solidity 0.8.10 无法通过更改storage 数组长度改变数组大小
    • 场景
    • 解决

Solidity 0.8.10 无法通过更改storage 数组长度改变数组大小

场景

在写一个可便利,可以随机索引功能的ArraysList的时候,发现无法通过直接更改全局状态数组变量的长度来完成移除一个元素的操作。这让我十分疑惑,因为solidity的文档中描述的内容为
基本类型-数组

创建内存数组
可使用 new 关键字在内存中创建变长数组。 与 存储storage 数组相反的是,你 不能 通过修改成员变量 .length 改变 内存memory 数组的大小。

pragma solidity ^0.4.16;contract C {function f(uint len) public pure {uint[] memory a = new uint[](7);bytes memory b = new bytes(len);// 这里我们有 a.length == 7 以及 b.length == lena[6] = 8;}
}

文档中所描述的,storage数组是相反的,可以根据修改length来改变数组的容量。
但是当我在编译器中输入

//pool's infomapping(address => uint) public _poolIndexMap;address[] public _poolArray;function removePool(address _pool) public {require(isPool(_pool),'no exists');uint index = _poolIndexMap[_pool];require(index > 0,'invalid index');if(index < _poolArray.length){_poolArray[index - 1] = _poolArray[_poolArray.length - 1];_poolIndexMap[_poolArray[index - 1]] = index;index = _poolArray.length;}delete _poolIndexMap[_pool];_poolArray.length --; //这一行编译错误,错误提示memory 类型length为只读}

根据上面的错误提示我在想,不应该啊。全局变量 _poolArray 应该就是storage类型,于是我又换了个写法,address[] storage _poolArray_ = _poolArray;通过storage 关键字的方式把_poolArray_ 申明为storage但是发现还是不行。

解决

当我想到中文文档会落后,英文文档版本一段时间时,我把编译的版本从 pragma solidity >=0.7.0 <0.9.0;实际为0.8.11 改回了 pragma solidity 0.5.0 。随后错误消失了,逻辑功能测试正常。然后用google一会,发现在官方最新的例子中
数组例子remove的删除方式为调用.pop()

这篇关于Solidity 0.8.10 无法通过更改storage 数组长度改变数组大小的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/914759

相关文章

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

Python的pip在命令行无法使用问题的解决方法

《Python的pip在命令行无法使用问题的解决方法》PIP是通用的Python包管理工具,提供了对Python包的查找、下载、安装、卸载、更新等功能,安装诸如Pygame、Pymysql等Pyt... 目录前言一. pip是什么?二. 为什么无法使用?1. 当我们在命令行输入指令并回车时,一般主要是出现以

使用easy connect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题

《使用easyconnect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题》:本文主要介绍使用easyconnect之后,maven无法... 目录使用easGWowCy connect之后,maven无法使用,原来需要配置-DJava.net.pr

Java实现按字节长度截取字符串

《Java实现按字节长度截取字符串》在Java中,由于字符串可能包含多字节字符,直接按字节长度截取可能会导致乱码或截取不准确的问题,下面我们就来看看几种按字节长度截取字符串的方法吧... 目录方法一:使用String的getBytes方法方法二:指定字符编码处理方法三:更精确的字符编码处理使用示例注意事项方

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja

CentOS7更改默认SSH端口与配置指南

《CentOS7更改默认SSH端口与配置指南》SSH是Linux服务器远程管理的核心工具,其默认监听端口为22,由于端口22众所周知,这也使得服务器容易受到自动化扫描和暴力破解攻击,本文将系统性地介绍... 目录引言为什么要更改 SSH 默认端口?步骤详解:如何更改 Centos 7 的 SSH 默认端口1

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的