Это имеет смысл, так как вы возвращаете массив адресов 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
означает, что вы не можете изменить состояние контракта в этой функции.
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);
}
Я надеюсь, что это решит все ваши проблемы. Спасибо