как вернуть цикл и элемент массива | местоположение данных должно быть «памятью» для возвращаемого параметра в функции | динамическом массиве

#ethereum #solidity

#ethereum #надежность

Вопрос:

Я использую следующий код для возврата массива.

  function getActiveDepositIndexes() public view returns (uint256 [] storage) {
    User storage user = users[msg.sender];
    Deposit[] storage deposits = user.deposits;
    uint[] memory indices = new uint[](deposits.length);
    for(uint i = 0; i < deposits.length; i  ) {
        if(deposits[i].active amp;amp; !deposits[i].closed){
            indices.push(i);
        }
    }
    return indices;
 }
 

Но я получаю следующую ошибку,

 TypeError: Data location must be "memory" for return parameter in function, but "storage" was given.
     function getActiveDepositIndexes() public view returns (uint256 [] storage) {
                                                             ^----------------^
 

Окружающая среда:

 Truffle v5.1.20 (core: 5.1.20)
Solidity - 0.6.0 (solc-js)
Node v8.16.2
Web3.js v1.2.1
 

Комментарии:

1. И почему в возврате используется «хранилище», а не «память»?

Ответ №1:

Похоже, вы явно указываете storage для функции возвращаемое значение. Попробуйте заменить сигнатуру вашей функции следующим:

 function getActiveDepositIndexes() public view returns (uint[]) {...}
 

memory используется для возвращаемых значений по умолчанию

Ответ №2:

Вместо этого используйте следующий код:

 function getActiveDepositIndexes() public view returns (uint256[] memory) {
    User storage user = users[msg.sender];
    Deposit[] storage deposits = user.deposits;
    uint[] memory indices = new uint[](deposits.length);
    for(uint i = 0; i < deposits.length; i  ) {
        if(deposits[i].active amp;amp; !deposits[i].closed){
            indices[i] = i;
        }
    }
    return indices;
 }
 

Проблемы с такой логикой в EVM заключаются в том, что нет способа вернуть массивы памяти динамического размера, и, следовательно, push() также нельзя использовать с элементами памяти. Этот обходной путь в приведенном выше примере приводит к нулевым значениям (заполнителям) в неактивных индексах в соответствии с вашим кодом…