Solidity - 无效的BigNumber字符串(argument="value" value="" code=INVALID_ARGUMENT version=bignumber/5.4.2)

9

我是Solidity的新手。当我尝试读取people数组的值时,出现了错误:

调用SimpleStorage.people出错:错误编码参数: 错误: 无效的BigNumber字符串 (argument="value" value="" code=INVALID_ARGUMENT version=bignumber/5.4.2)

我的编译器版本是0.6.6,不确定怎么回事?有什么建议吗?

// SPD-License_Identifier: MIT

pragma solidity ^0.6.0;

contract SimpleStorage {
    uint256 favNum;
    
    struct People {
        uint256 favNum;
        string name;
    }
    
    People[] public people;
    
    function store(uint256 _favNum) public {
        favNum = _favNum;
    }
    
    function retrieve() public view returns(uint256) {
        return favNum;
    }
    
    function addPerson(string memory _name, uint256 _favNum) public {
        people.push(People(_favNum, _name));
    }
}
3个回答

8
出现错误的原因是在调用 people() 函数时(来自 Remix IDE),没有传递任何值。
由于 People[] public people 是一个公共属性,它在编译期间会自动生成一个getter函数。但由于它是一个数组,该getter函数需要一个uint256参数,指定要检索的数组索引。
当您传递空字符串时,Remix会尝试将其编码为BigNumber实例,但这样会失败。只有当您传递数组的(现有)索引时,它才能正确工作:

people() call


如果您想在一次调用中获取整个数组,则需要创建一个单独的getter函数:

function getAllPeople() public view returns (People[] memory) {
    return people;
}

getAllPeople() call


能否请您详细说明一下。实际上,我只想知道当我仅创建一个带有某些参数的构造函数时,默认构造函数将不会被创建...但问题是解决方法是什么...我需要显式地创建一个无参构造函数吗?如果是的话,该如何创建? - Just_chill
1
@dammn_man123 无论是普通函数还是构造函数,你都需要传递所有定义的值给它。从你在另一个问题中提供的代码来看,似乎你没有传递acc_id_balance - Petr Hejda
我解决了错误。代码现在成功运行。你是对的,最初我没有传递值。感谢您的帮助。 - Just_chill
@dammn_man123 你最开始如何传递值? - Sam Tseng
1
@SamTseng 如果您正在使用Remix IDE,转到“部署和运行交易”选项卡,然后单击“部署”旁边的下拉箭头。它应该会打开一个小表单,您可以在其中输入值。 - Seedorf
@vajad 如果您有两个参数要包含,但忘记传递一个参数,在这种情况下也会出现上述错误。 - vishal

7

你必须点击部署按钮右侧的小箭头,然后字段将会被展示,这样你就可以填写合约必须接收的数据。

enter image description here

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接