Solidity
Solidity 2D 記憶體數組,大小由變數定義
我想定義一個記憶體中的二維數組,而不用完全硬編碼它的形狀。假設我想要一個 3xN 矩陣(並解釋 ill 還將其第 0 個元素設置為
[1, 2, 3]
):function makeArr (int n){ int[3][n] memory arr; arr[0] = [1, 2, 3] }
makeArr(1)
將失敗並顯示消息Invalid array length, expected integer literal or constant expression.
我嘗試像這樣定義數組:
int[3][] memory arr;
但這也行不通,因為數組不夠長:
reverted with panic code 0x32 (Array accessed at an out-of-bounds or negative index)
之前有人問過這個問題,但答案似乎沒有被接受:Creating a 2D in-memory array in Solidity。
在另一個類似的問題中,當時的答案說這根本不可能(3 歲)。從函式返回具有動態大小的二維數組
是否有答案或最佳實踐解決方法?
makeArr(1)
將失敗並顯示消息Invalid array length, expected integer literal or constant expression.
這正是消息所說的 - 您只能使用編譯時常量或文字來定義數組的長度。如果您在執行時只知道數組的大小,則必須使用動態大小的數組。
但這也行不通,因為數組不夠長:
reverted with panic code 0x32 (Array accessed at an out-of-bounds or negative index)
這就是你想要的。您只是沒有為數組分配任何記憶體,因此它的大小為零。此外,您的程式碼還有其他一些問題。這是正確的方法:
function makeArr(uint n) pure { int[3][] memory arr = new int[3][](n); arr[0] = [int(1), 2, 3]; }
我提到的問題:
- 數組大小必須是無符號整數。您始終可以將 convert 轉換
int
為,uint
但您必須對其進行驗證以確保它不是負數。你最好只改變n
to的類型uint
。- 對於數組字面量,類型基於所有元素可以適應的最小通用類型。所以對於
[1, 2, 3]
類型是uint8[3]
. 您需要int[3]
分配工作,因此需要顯式轉換。