Solidity

創建結構時未初始化映射成員

  • December 16, 2017
pragma solidity ^0.4.0;
contract TestcaseResetObject {

   MyObject ob;

   struct MyObject {
       mapping(uint8 => uint) map;
   }

   event Output(uint number);

   function makeNew() {
       ob = MyObject();
       ob.map[0] += 1;
       Output(ob.map[0]);
   }
}

當我在browser-soliditymakeNew中反復執行時,我希望每次都能得到 event 。相反,我得到, ,等。Output(1)``Output(1)``Output(2)``Output(3)

似乎當我創建一個新MyObject的時,地圖實際上並沒有再次創建。

另一個問題涉及新初始化的結構在其所有成員中應該具有“零”值。這對於uint’s 等似乎是正確的,但由於映射似乎“記住”了它的舊值,所以情況似乎並非如此。

有任何想法嗎?

同意吉塞佩的觀點。該程式碼不是“初始化”新的 ob,只是引用現有的。

這是一種讓許多映射不會像那樣碰撞的方法。可能會給你一些想法。

pragma solidity ^0.4.0;
contract TestcaseResetObject {

   uint public objectCount;

   struct MyObjectStruct {
       mapping(uint => uint) map;
   }

   MyObjectStruct[] myObjects;

   event LogOutput(uint number);

   function makeNewObject() public returns(uint count) {

       MyObjectStruct memory mo;
       objectCount = myObjects.push(mo);
       return objectCount;
   }

   // object numbers start at 0 when objectCount is 1
   function incCounter(uint objectNumber, uint index) public returns(uint newValue) {
       myObjects[objectNumber].map[index] += 1;
       LogOutput(myObjects[objectNumber].map[index]);
       return myObjects[objectNumber].map[index];
   }
}

讓您用“ makeNewObject”創建新的映射,用“ incCounter”從數組中挑出一個特定的映射,並在映射內的一個特定位置遞增。

希望能幫助到你。

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