首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在实心中返回地址数组?

如何在实心中返回地址数组?
EN

Stack Overflow用户
提问于 2019-03-26 03:23:32
回答 1查看 14.5K关注 0票数 7

我在Solidity^0.5.1中创建了一个智能合约,在该合约中我遇到错误。

给出错误。

数据位置必须是函数中返回参数的内存,但未给出任何值。

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

代码语言:javascript
复制
function getCitizen()public returns(address[]){
    return citizenArray;
}

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

代码语言:javascript
复制
  pragma solidity ^0.5.1;

合同公民{

代码语言:javascript
复制
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;
}

}

提前感谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-26 08:55:41

这是有意义的,因为您返回的是地址的storage数组,您不能直接返回它,因为它将尝试返回协定存储中citizenArray的实际地址。您可以通过在memory中生成数组来发送数组。就像这样。

代码语言:javascript
复制
function getCitizenAddress()public view returns( address  [] memory){
    return citizenArray;
}

一旦你把它设置为memory,你就会得到这样的警告,因为你没有改变函数中的任何状态,你应该把它标记为view,我已经在上面的代码中这样做了。

最后,当您解决此错误时,您将在此函数中获得另一个错误:

代码语言:javascript
复制
function getCitizen(address _address) public pure returns(uint,string memory ,string memory ){
            return(citizenMap[_address].age,citizenMap[_address].fName,citizenMap[_address].lName);
}

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

  • view意味着您无法更改约定的状态,而function.
  • pure意味着您无法更改函数中的状态,甚至无法读取状态或存储变量。

在上面的getCitizen函数中,您实际上是在return语句中执行读取操作。您可以通过只放置view而不是pure来修复此问题。如下所示:

代码语言:javascript
复制
function getCitizen(address _address) public view returns(uint,string memory ,string memory ){
    return(citizenMap[_address].age,citizenMap[_address].fName,citizenMap[_address].lName);

}

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

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55345063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档