Solidity

如何在solidity中初始化建構子內的數組?

  • January 6, 2021

我正在使用 remix IDE。我想在呼叫建構子時定義數組的大小。有人請幫忙。這是我嘗試過的:

pragma solidity >=0.7.0 <0.8.0;
contract Vote
{   
   struct Proposal
   {
       uint votecount;
   }
   Proposal[] proposal;   
           
   constructor(uint no)
   {           
       proposal=new Proposal[](no);     
   }    
}

錯誤:UnimplementedFeatureError:複製類型 struct Vote.Proposal 記憶體

$$ $$尚不支持記憶體到儲存。其他 :

pragma solidity >=0.7.0 <0.8.0;
contract Vote
{               
   struct Proposal
   {
       uint votecount;
   }
   Proposal[] proposal;
                       
   constructor(uint no)
   {               
       for(uint i=0;i<no;i++)
           proposal.votecount.push(0);
   }    
}

錯誤:TypeError:在 struct Vote.Proposal storage ref 中進行參數相關查找後,成員“votecount”未找到或不可見

$$ $$儲存參考 提議.votecount.push(0); ^—————-^

您的程式碼中的Proposal[] proposal聲明是一個儲存數組。

因此,您不需要使用proposal = new Proposal[](...);.

您可以簡單地將任意數量的項目推入其中。

唯一真正缺少的是訪問級別(public/ internal/ private)。


至於您的推送嘗試,只需更改以下內容:

proposal.votecount.push(0);

對此:

proposal.push(Proposal(0));

或者更好的是,對此:

proposal.push(Proposal({votecount: 0}));

更新:

通常您應該了解 4 種類型的數組:

  1. 靜態局部數組 - 在函式內部以恆定大小聲明
  2. 動態局部數組 - 在函式內部聲明,沒有固定大小
  3. 靜態全域數組 - 在所有函式之外以恆定大小聲明
  4. 動態全域數組 - 在所有函式之外聲明,沒有固定大小

類型 1 和 2 位於memory.

類型 3 和 4 位於storage.

類型 2 是您嘗試使用之前唯一需要分配的類型,例如:

function func(uint len) {
   uint[] memory arr = new uint[](len);
   ...
}

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