如何return solidity 中的地址数组?
How to return array of address in solidity?
我在 solidity ^0.5.1 中创建一个智能合约,但我在其中遇到错误。
给出错误。
数据位置必须是函数中return参数的内存,但已给出none。
在下面的函数中出现错误。
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;
}
}
在此先感谢您的帮助。
这是有道理的,因为您正在 returning storage
地址数组,您不能 return 它原样,因为它会尝试 return 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
表示您无法更改该函数中的合约状态。
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);
}
我希望它能解决您所有的问题。谢谢
我在 solidity ^0.5.1 中创建一个智能合约,但我在其中遇到错误。
给出错误。
数据位置必须是函数中return参数的内存,但已给出none。
在下面的函数中出现错误。
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;
}
}
在此先感谢您的帮助。
这是有道理的,因为您正在 returning storage
地址数组,您不能 return 它原样,因为它会尝试 return 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
表示您无法更改该函数中的合约状态。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);
}
我希望它能解决您所有的问题。谢谢