Как вернуть массив адресов в солидности? - PullRequest
0 голосов
/ 25 марта 2019

Я создаю умный контракт с прочностью ^ 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;
}

}

, заранее спасибо за помощь.

1 Ответ

0 голосов
/ 26 марта 2019

Это имеет смысл, так как вы возвращаете массив адресов 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);

}

Я надеюсь, что это решит все ваши проблемы. Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...