#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() также нельзя использовать с элементами памяти. Этот обходной путь в приведенном выше примере приводит к нулевым значениям (заполнителям) в неактивных индексах в соответствии с вашим кодом…