Solidity

如何儲存包含結構數組的結構數組?

  • January 3, 2018

我正在嘗試創建一個包含結構數組的結構數組。

https://gist.github.com/anonymous/65260d973a5640741a7d6174bf8fe7e6

從各種搜尋看來,似乎不可能用要推送到儲存數組的結構數組來初始化結構,而且最好的方法似乎只是在外部數組的某個位置設置一個非結構數組變數.

不幸的是,我似乎無法讓它發揮作用。我嘗試了各種各樣的東西,但主要是在上面。

如果我跑步,truffle test我會得到:

Error: VM Exception while processing transaction: revert

如果我嘗試在控制台中執行 createBar 函式,我會得到稍微不同的結果:

Error: VM Exception while processing transaction: invalid opcode

我不確定我做錯了什麼。任何燈棚或指針將不勝感激。

數組有一個長度,您只能使用 0 y 數組長度 - 1 之間的項目。

如果要添加新元素,則必須增加數組大小。

function createBar(uint barNum)
 public
 returns (uint)
{
 uint barId = bars.length;
 bars.length += 1;
 bars[barId].barNum = barNum;
 return barId;
}

這很有趣。

我不相信這種嵌套對於大多數情況來說是理想的,因為無序列表對隨機訪問沒有用處。您可能會發現帶有索引的映射結構更靈活一些。

Solidity 是否有很好解決且簡單的儲存模式?

你要求的是可行的,所以我玩了一下。沒有保修。;-)

pragma solidity ^0.4.18;

contract ArrayOfStructsContainsArrayOfStructs {

 struct InnerStruct {
   uint x;
 }

 struct OuterStruct {
   InnerStruct[] innerStructs;
 }

 // This can't be public because the "free" getter is too complex for the compiler to work out a default
 OuterStruct[] outerStructs;

 event LogAppendedOuterStruct(address sender, uint outerStructRow);
 event LogAppendedInnerStruct(address sender, uint outerStructRow, uint innerStructRow);
 event LogSetInnerStructValue(address sender, uint outerStructRow, uint innerStructRow, uint value);

 function appendOuterStruct() public returns(uint row) {
   LogAppendedOuterStruct(msg.sender, outerStructs.length);
   outerStructs.length++;
   return outerStructs.length-1;
 }

 // The outer structs are in an array, so specify the outerStructRow
 function appendInnerStruct(uint outerStructRow) public returns(uint row) {
   LogAppendedInnerStruct(msg.sender, outerStructRow, outerStructs[outerStructRow].innerStructs.length);
   outerStructs[outerStructRow].innerStructs.length++;
   return outerStructs[outerStructRow].innerStructs.length-1;
 }

 function setInnerStructValue(uint outerStructRow, uint innerStructRow, uint value) public returns(bool success) {
   outerStructs[outerStructRow].innerStructs[innerStructRow].x = value;
   LogSetInnerStructValue(msg.sender, outerStructRow, innerStructRow, value);
   return true;
 }

 function getInnerStructValue(uint outerStructRow, uint innerStructRow) public view returns(uint value) {
   return outerStructs[outerStructRow].innerStructs[innerStructRow].x;
 }

}

希望能幫助到你。

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