我试图使用这个函数,但我得到一个模棱两可的错误。我得到的是"errorCode":"32"
是否有不工作的原因?我错过什么了吗?
function generatePoints(uint256 pointsCount) public view returns (uint256[][1] memory) {
uint256[][1] memory points;
for(uint256 i; i < pointsCount; i++) {
points[i][0] = 1;
}
return points;
}
这似乎也不工作
function _generateXPoints(uint256 pointsCount) public view returns (uint256[] memory) {
uint256[] memory points;
for(uint256 i; i < pointsCount; i++) {
points[i] = 1
}
return points;
}
当您尝试访问索引超出范围的数组时,生成错误代码0x32
(solididity文档)
实际上,这个动态内存数组是在没有分配长度的情况下创建的:
// this will have zero length
uint256[] memory points;
请注意,不可能调整内存数组(文档)的大小,因此必须在声明期间指定长度。在我们的例子中,这应该可以工作:
function _generateXPoints(uint256 pointsCount) public view returns (uint256[] memory) {
uint256[] memory points = new uint256[](pointsCount);
for(uint256 i; i < pointsCount; i++) {
points[i] = 1;
}
return points;
}
返回到多维数组。在固体度中,uint256[x][y]
表示长度为x
的y
数组。同样重要的是要记住,索引是在与声明相反的方向上访问的。所以我们的数组可以生成为:
uint256[][1] memory points;
points[0] = new uint256[](pointsCount);
通过生成"外部"首先是数组(长度固定为1),然后是内部数组。结论:
function generatePoints(uint256 pointsCount) public view returns (uint256[][1] memory) {
uint256[][1] memory points;
points[0] = new uint256[](pointsCount);
for(uint256 i; i < pointsCount; i++) {
points[0][i] = 1;
}
return points;
}