Solidity

如何從 Solidity 中的記憶體數組中彈出(減少長度)

  • December 14, 2019

我有一個從另一個合約中獲取地址數組的函式,有條件地從數組中刪除 msg.sender,然後將新數組保存回該合約。

因為數組 backerList 在記憶體中,所以我做不到backerList.length--;

但是我不能將 backerList 聲明為儲存數組,因為記憶體數組無法轉換為儲存數組。

我被困在這裡,我該怎麼辦?

address[] memory backerList = syndicate.getBackerList();

if(syndicate.individualTotalBacking(msg.sender) == 0){

       uint index;

       for(uint i=0; i<backerList.length; i++){
           if (backerList[i] == msg.sender){
               index = i;
           }

       //shifting array

           for(uint k=index; k<backerList.length-1; k++){
               backerList[k]=backerList[k+1];
           }

       }

       backerList.length--;
       syndicate.setBackerList(backerList);
   } else {}

這是一種backerList.length--;使用address[] memory backerList內聯彙編的方法:

assembly { mstore(backerList, sub(mload(backerList), 1)) }

需要記住的一些要點:

  • 確保此彙編程式碼在backerList.length == 0(不允許數組長度下溢)時永遠不會執行
  • 不要嘗試使用它來增加數組的大小(通過替換subadd
  • 僅在具有類似類型的變數上使用它...[] memory(例如,不要在 a address[10] memoryor上使用它address

免責聲明:通常不建議使用內聯彙編。謹慎使用,風險自負:)

引用自:https://ethereum.stackexchange.com/questions/51891