TypeError: выражение должно быть lvalue. Но раньше код работал отлично!

Я изменил несколько вещей внутри функции, но логика осталась прежней. Теперь выдайте ошибку в компиляторе. Я ИСПОЛЬЗУЮ ТРЮФЕЛЬ с 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. массив.длина--; ^----------^

Есть идеи? Спасибо!

Ответы (3)

Память временна. Хранение постоянное. Например, вы могли бы выполнять промежуточные вычисления с использованием памяти, а затем сохранять результат в хранилище.

Существуют значения по умолчанию для места хранения в зависимости от того, к какому типу переменной оно относится:

  1. переменные состояния всегда находятся в памяти
  2. аргументы функции по умолчанию находятся в памяти
  3. локальные переменные структуры, массива или хранилища ссылок типа сопоставления по умолчанию
  4. локальные переменные типа значения (т.е. ни массив, ни структура, ни отображение) не хранятся в стеке

Когда вы передаете массив 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.

Да ... я понял, может быть, это была проблема. Итак, мне нужно создать функцию удаления для изменения размера каждого массива адресов?