Das Zuordnungselement wird beim Erstellen einer Struktur nicht initialisiert

 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 ]); 
     } 
 } 

Wenn ich makeNew wiederholt in Browser-Solidität makeNew , erwarte ich, jedes Mal das Ereignis Output(1) . Stattdessen erhalte ich Output(1) , Output(2) , Output(3) usw.

Wenn ich ein neues MyObject erstelle, wird die Karte MyObject nicht erneut erstellt.

Eine andere Frage bezieht sich darauf, dass eine frisch initialisierte Struktur in allen ihren Mitgliedern den Wert "Null" haben sollte. Dies scheint für uint 's usw. zu gelten, aber da sich das Mapping an seine alten Werte zu "erinnern" scheint, scheint dies nicht der Fall zu sein.

Irgendwelche Ideen?

Antworten (2)

Stimmen Sie mit Guiseppe überein. Der Code "initialisiert" kein neues Objekt, sondern verweist nur auf das vorhandene.

Hier ist eine Möglichkeit, viele Zuordnungen zu erstellen, die nicht so kollidieren. Möglicherweise werden Sie einige Ideen geben.

 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 ]; 
     } 
 } 

Lassen Sie uns " makeNewObject " erstellen, um neue Zuordnungen zu erstellen, und " incCounter ", um eine bestimmte Zuordnung aus dem Array herauszusuchen und eine bestimmte Position innerhalb der Zuordnung zu erhöhen.

Ich hoffe es hilft.

Der Code wurde nur ein wenig geändert (Formatierung) und im Remix von Hand getestet, damit er funktioniert.

Die Zuordnung ist ein ganz bestimmter Typ und unterscheidet sich von einem einfachen Array. Aus der offiziellen Dokumentation :

Zuordnungen können als Hashtabellen angesehen werden, die virtuell so initialisiert werden, dass jeder mögliche Schlüssel vorhanden ist und einem Wert zugeordnet wird, dessen Byte-Darstellung alle Nullen sind: dem Standardwert eines Typs. Die Ähnlichkeit endet hier jedoch: Die Schlüsseldaten werden nicht tatsächlich in einem Mapping gespeichert, sondern nur der keccak256-Hash, der zum Nachschlagen des Werts verwendet wird.

Aus diesem Grund haben Zuordnungen keine Länge oder kein Konzept dafür, dass ein Schlüssel oder Wert „gesetzt“ wird.

Dies bedeutet im Wesentlichen, dass Sie nie wirklich eine vollständige Zuordnungsvariable initialisieren (in Ihrem Fall initialisieren Sie mit MyObject() die Struktur, nicht die map ).

Wenn Sie das zweite Mal auf map[0] verweisen, zeigt es korrekt auf dieselbe Position wie zuvor, und Sie finden den alten Wert.