如何返回坚固的地址数组?

问题描述 投票:0回答:1

I am creating a smart contract in solidity ^0.5.1 in which I am getting Error.

给出错误。

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

在下面的函数我收到错误。

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;
}

}

在此先感谢您的帮助。

solidity smartcontracts
1个回答
0
投票

这是有道理的,因为你正在返回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);

}

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

© www.soinside.com 2019 - 2024. All rights reserved.