Получение недействительного кода операции ошибки VM в солидности, какие-либо идеи? - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь протестировать этот простой контракт, чтобы удалить адрес из массива, но я получаю эту ошибку "неверный код операции".

contract C {
    address[] addrList;

    function addAddr(address addr) public{
       addrList.push(addr);
    }

    function deleteAddr(address addr)public {

        for(uint256 i = 0; i < addrList.length; i++) {
            if(addr == addrList[i]) {
                for(uint256 j = i; j < addrList.length; j++) 
                    addrList[j] = addrList[j + 1];

                     delete addrList[addrList.length - 1];
                     addrList.length--; // <== This gives Error: Expression has to be an lvalue.
             }

1 Ответ

0 голосов
/ 06 февраля 2019

Ошибка появляется, потому что вы перебираете переменную j с i до addrList.length-1.Это делает addrList[j+1] из индекса.

Вам необходимо выполнить итерацию j с i до addrList.length-2.Это может быть достигнуто путем обновления условия до j < addrList.length-1.

pragma solidity ^0.5.3;

contract C { 

    address[] addrList;

    function addAddr(address addr) public{
        addrList.push(addr);
    }

    function deleteAddr(address addr) public {

        for(uint256 i = 0; i < addrList.length; i++) {
             if(addr == addrList[i]) {
                 for(uint256 j = i; j < addrList.length-1; j++) {
                     addrList[j] = addrList[j + 1];
                 }
                 //delete addrList[addrList.length - 1]; 
                 addrList.length--;
             }
        }
    }

    function returnList() view public returns (address[] memory) {
        return addrList;
    }

}

Кроме того, вам не требуется использовать шаг удаления, так как компилятор самостоятельно очищает слоты памяти.

...