我在Solidity^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;
}
}
提前感谢你的帮助。
发布于 2019-03-26 08:55:41
这是有意义的,因为您返回的是地址的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);
}
此错误是因为您将此函数标记为pure
。pure
和view
之间有一个很小但非常重要的区别。
view
意味着您无法更改约定的状态,而function.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);
}
我希望它能解决你所有的问题。谢谢
https://stackoverflow.com/questions/55345063
复制相似问题