簡體   English   中英

從數組中查找並刪除元素(可靠性)

[英]find and remove element from array (solidity)

我已經完成了一項任務:在工作表中找到特定地址,將其移至工作表末尾,然后通過 function 彈出消息將其刪除:這是代碼:

function removeAccount(address _account) external{
        uint counter = arrayOfAccounts.length;
        uint index;
        for(uint i; i < counter; i++) {
            if(arrayOfAccounts[i] == _account){
                index = i;
                break;
            }
        for(uint i = index; i < counter-1; i++){
                arrayOfAccounts[i] = arrayOfAccounts[i + 1];
            }
            arrayOfAccounts.pop();
        }
    }
        }
    }

交易到 Wote.removeAccount 錯誤:VM 錯誤:還原。

revert 交易已經恢復到最初的state。 注意:被叫function 應該是支付的,如果你發送價值並且你發送的價值應該小於你的當前余額。 調試事務以獲取更多信息。

如果您不關心地址順序

function removeAccount(address _account) external {
    if(arrayOfAccounts.length == 1) {
        arrayOfAccounts.pop();
    }
    else if(arrayOfAccounts[arrayOfAccounts.length - 1] == _account) {
        arrayOfAccounts.pop();
    }
    else {
        for (uint i = 0; i < arrayOfAccounts.length - 1; i++) {
            if(_account == arrayOfAccounts[i]) {
                arrayOfAccounts[i] = arrayOfAccounts[arrayOfAccounts.length - 1];
                arrayOfAccounts.pop();
            }
        }
        
    }
}

如果訂單很重要

function removeAccount(address _account) external{
        uint counter = arrayOfAccounts.length;
        for(uint i; i < counter; i++) {
            if(arrayOfAccounts[i] == _account){
                for(uint j = i; j < counter-1; j++){
                    arrayOfAccounts[j] = arrayOfAccounts[j + 1];
                }
                arrayOfAccounts.pop();
                break;
            }
        }
    }
}

否則如果順序無關緊要

function removeAccount(address _account) external{
    uint numAccounts = arrayOfAccounts.length;
    for(uint i = 0; i < numAccounts; i++) {
        if(arrayOfAccounts[i] == _account){    // if _account is in the array
            arrayOfAccounts[i] = arrayOfAccounts[numAccounts - 1];    // move the last account to _account's index
            arrayOfAccounts.pop();    // remove the last account
            break;
        }
    }
}

原因很簡單。 您在第一個for循環中使用了第二個for循環。 並且還請用counter初始化index

uint256 index = counter;

並且僅在index小於counter時彈出

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM