Solidity

Solidity 2D 記憶體數組,大小由變數定義

  • October 10, 2021

我想定義一個記憶體中的二維數組,而不用完全硬編碼它的形狀。假設我想要一個 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但您必須對其進行驗證以確保它不是負數。你最好只改變nto的類型uint
  • 對於數組字面量,類型基於所有元素可以適應的最小通用類型。所以對於[1, 2, 3]類型是uint8[3]. 您需要int[3]分配工作,因此需要顯式轉換。

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