Solidity
如何填充動態記憶體數組
由於某種原因,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
,它從0
到n - 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