Solidity

如何填充動態記憶體數組

  • March 16, 2022

由於某種原因,solidity 不允許將值推入記憶體數組

成員“push”在 bytes32 中不可用

$$ $$儲存之外的記憶體。

這是範例合約程式碼:

pragma solidity ^0.4.21;

contract Foo {
   function getRange(uint n) public pure returns(uint[]) {
       uint[] memory result;
       for (uint i = 0; i < n; i++)
           if (someCondition(i))
              result.push(i);
       return result;
   }
}

我可以分配最大可能的數組大小n,然後縮小它,但這可能會損害性能(n可能是100000結果的最終長度的數量級0..100)。例如,someCondition可能是isPrime。在這種情況下,我們有很大的 N(這使得不可能預先分配一個數組)和一個小的結果素數列表。

怎麼可能做到?


我最終得到了大小數組,n然後在我知道它的最終長度後將其縮小:

function getRange(uint n) public pure returns(uint[]) {
   uint tookCount = 0;
   uint[] memory result = new uint[](n);
   for (uint i = 0; i < n; i++)
       if (someCondition(i)) {
           result.push(i);
           tookCount++;
       }

   uint[] memory trimmedResult = new uint[](tookCount);
   for (uint j = 0; j < trimmedResult.length; j++) {
       trimmedResult[j] = result[j];
   }
   return trimmedResult;
}

動態數組僅在儲存中可用,在記憶體中不可用。在您的情況下,result數組的大小是預先知道的(n)。所以,你可以只聲明一個長度為n. 然後你可以使用 來填充它i,它從0n - 1

pragma solidity ^0.4.21;

contract Foo {
   function getRange(uint n) public pure returns(uint[]) {
       uint[] memory result = new uint[](n);
       for (uint i = 0; i < n; i++)
           result[i] = i;
       return result;
   }
}

我所知

push 僅適用於儲存陣列而不是記憶體陣列

來自文件:

push:動態儲存數組和字節(不是字元串)有一個名為 push 的成員函式,可用於在數組末尾追加一個元素。該函式返回新的長度。

嘗試

result[j]=keccak256(id);//declare j

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