如何可靠地返回地址数组?

Posted

技术标签:

【中文标题】如何可靠地返回地址数组?【英文标题】:How to return array of address in solidity? 【发布时间】:2019-08-16 02:57:09 【问题描述】:

我正在创建一个可靠的智能合约 ^0.5.1,其中出现错误。

给出错误。

数据位置必须是函数中返回参数的内存,但没有给出。

在下面的函数中我遇到了错误。

function getCitizen()public returns(address[])
    return citizenArray;

到目前为止我尝试过的智能合约。

  pragma solidity ^0.5.1;

契约公民

struct Citizens

    uint age;
    string fName;
    string lName;



mapping(address => Citizens) citizenMap;

address [] citizenArray;

function setCitizen(address _address,uint _age,string memory _fName,string memory _lName) public

    //creating the object of the structure in solidity 
     Citizens storage citizen=citizenMap[_address];


    citizen.age=_age;
    citizen.fName=_fName;
    citizen.lName=_lName;

    citizenArray.push(_address) -1;



function getCitizen(address _address) public pure returns(uint,string memory ,string memory )
    return(citizenMap[_address].age,citizenMap[_address].fName,citizenMap[_address].lName);



function getCitizenAddress()public returns(address[])
    return citizenArray;



提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

这是有道理的,当您返回地址数组 storage 时,您不能按原样返回它,因为它会尝试在合约存储中返回 citizenArray 的实际地址。您可以通过在memory 中发送数组。像这样。

function getCitizenAddress()public view returns( address  [] memory)
    return citizenArray;

一旦你把它写成memory,你会得到一个警告,说明你没有改变函数中的任何状态,你应该把它标记为view,我已经在上面的代码中做到了.

最后,当你解决了这个错误时,你会在这个函数中得到另一个错误:

function getCitizen(address _address) public pure returns(uint,string memory ,string memory )
            return(citizenMap[_address].age,citizenMap[_address].fName,citizenMap[_address].lName);

此错误是因为您将此函数标记为purepureview 之间有一点但非常重要的区别。

view 表示您无法在该函数中更改合约的状态。 pure 表示您无法更改函数中的状态,甚至无法读取状态或存储变量。

getCitizen 的上述函数中,您实际上是在return 语句中执行读取操作。您可以通过输入view 而不是pure 来解决此问题。像这样:

function getCitizen(address _address) public view returns(uint,string memory ,string memory )
    return(citizenMap[_address].age,citizenMap[_address].fName,citizenMap[_address].lName);


我希望它能解决您的所有问题。谢谢

【讨论】:

以上是关于如何可靠地返回地址数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何可靠地进行 API 调用?

如何可靠地获取 C 样式数组的大小?

如何可靠地确定Passbook是否可用?

如何可靠地检查对象是 EcmaScript 6 Map/Set?

如何可靠地使 send(2) 进行短发送?

如何使用 Python 从 Google Pub/Sub 可靠地提取消息?