Я изменил несколько вещей внутри функции, но логика осталась прежней. Теперь выдайте ошибку в компиляторе. Я ИСПОЛЬЗУЮ ТРЮФЕЛЬ с VSC.
Бывшая функция:
function remove(uint ind) internal returns(address[]) {
delete addressStorage[ind];
for (uint j = ind; j<addressStorage.length;j++) {
if (j==addressStorage.length-1) {
break;
}else {
addressStorage[j] = addressStorage[j+1];
}
}
addressStorage.length--;
return addressStorage;
}
Действительный:
function remove(uint ind, address[] array) internal returns(address[]) {
delete array[ind];
for (uint j = ind; j<array.length;j++) {
if (j==array.length-1) {
break;
}else {
array[j] = array[j+1];
}
}
array.length--;
return array;
}
Получающий:
TypeError: выражение должно быть lvalue. массив.длина--; ^----------^
Есть идеи? Спасибо!
Память временна. Хранение постоянное. Например, вы могли бы выполнять промежуточные вычисления с использованием памяти, а затем сохранять результат в хранилище.
Существуют значения по умолчанию для места хранения в зависимости от того, к какому типу переменной оно относится:
Когда вы передаете массив address[] в качестве аргумента функции, Solidity сохранит его в памяти, т.е. сделает копию массива. Внесенные изменения не будут постоянными.
Добавьте «хранилище» в аргумент, чтобы устранить ошибку.
function remove(uint ind, address[] storage array) internal returns(address[]) {
delete array[ind];
for (uint j = ind; j<array.length;j++) {
if (j==array.length-1) {
break;
}else {
array[j] = array[j+1];
}
}
array.length--;
return array;
}
Это мое решение:
function _pullFromArray(uint[] storage arr, uint index) internal returns(uint[]) {
for(uint i = index; i < arr.length - 1; i++) {
arr[i] = arr[i+1];
}
if (index < arr.length) {
delete arr[arr.length - 1];
arr.length--;
}
return arr;
}
Проблема в том, что в предыдущей версии вы имели дело с массивом хранения, а теперь используете массив памяти.
В отличие от массивов хранения, невозможно изменить размер массивов памяти, назначив члену .length.
Хорхе