TypeError: Ausdruck muss ein Lvalue sein. Aber vorher funktionierte der Code perfekt!

Ich habe ein paar Dinge innerhalb der Funktion geändert, aber die Logik ist immer noch dieselbe. Geben Sie nun einen Fehler im Compiler aus. Ich VERWENDE TRÜFFEL mit VSC.

Ehemalige Funktion:

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;
}

Tatsächlich:

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;
}

Bekommen:

TypeError: Ausdruck muss ein Lvalue sein. array.length--; ^----------^

Irgendwelche Ideen? Danke!

Antworten (3)

Erinnerung ist vorübergehend. Die Speicherung ist dauerhaft. Beispielsweise würden Sie Zwischenberechnungen mit dem Speicher durchführen und das Ergebnis dann im Speicher speichern.

Je nachdem, um welchen Variablentyp es sich handelt, gibt es Vorgaben für den Speicherort:

  1. Zustandsvariablen sind immer im Speicher
  2. Funktionsargumente sind standardmäßig im Arbeitsspeicher
  3. Lokale Variablen vom Typ Struct, Array oder Mapping referenzieren standardmäßig
  4. Lokale Variablen vom Typ Wert (dh weder Array noch Struktur noch Mapping) werden im Stack gespeichert

Wenn Sie das Array address[] als Funktionsargument übergeben, speichert Solidity es im Speicher, dh es erstellt eine Kopie des Arrays. Vorgenommene Änderungen sind nicht dauerhaft.

Fügen Sie dem Argument „Speicher“ hinzu, um den Fehler zu beheben.

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;

}

Das ist meine Lösung:

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;
}

Das Problem ist, dass Sie es in Ihrer vorherigen Version mit einem Speicherarray zu tun hatten und jetzt ein Speicherarray verwenden.

Im Gegensatz zu Speicherarrays ist es nicht möglich, die Größe von Speicherarrays durch Zuweisung an das .length-Mitglied zu ändern.

Yep ... mir wurde klar, dass das vielleicht das Problem war. Also muss ich eine Entfernungsfunktion erstellen, um die Größe jedes Adressarrays zu ändern?