Leeres Array beim Hinzufügen von Mitgliedern mit Zuordnung

Ich hatte eine Frage. Ich habe eine Zuordnung, die struct zuordnet.

  contract A{

    struct struct1{
      //...members...
    }

    struct struct2{
      struct1 input1;
    }

    mapping (uint => struct1) mapToStruct;

    struct2[] allEntries;
      //...rest of the code for populating mapToStruct        
    }

  contract B is A{

    function addToStruct2(uint _mappingNumber) returns(bool status){
      struct2 memory newMember;
      struct1 memory newEntry;
      newEntry = mapToStruct[_mappingNumber];
      newMember.input1 = newEntry;
      allEntries.push(newMember);
      return true;
    }
  }

Aber dieser Code funktioniert nicht, ich kann die Details nicht hinzufügen allEntries. Das Array hat einen neuen Eintrag, aber alle seine Mitglieder sind 0, auch wenn addToStruct2es true zurückgibt. Vielen Dank im Voraus

Antworten (1)

Ich war ziemlich verwirrt, als ich anfing, dies zu debuggen. Die verschachtelten Strukturen scheinen unnötig beschäftigt zu sein. Ich würde zu einem gut gelösten Muster neigen. Schauen Sie sich hier einige Grundmuster an: Gibt es gut gelöste und einfache Speichermuster für Solidity?

Ich denke, Sie können "Mapping with structs", "array of structs with unique Id" oder sogar "mapping with structs and delete" verwenden - eine Art Schweizer Taschenmessermuster für viele Fälle.

Ich hoffe es hilft.

Aktualisieren

Auf diese Weise können Sie einen Schlüssel und zwei Eingaben senden und die Daten speichern. Sie können eine Schlüsselanzahl erhalten und die Schlüssel nach Nummer abrufen. Sie können die gespeicherten Eingaben mit einem gültigen Schlüssel abrufen. Wenn Sie einen unbekannten Schlüssel abrufen, isSetist false.

contract Simple {

  struct MyStruct {
    uint input1;
    uint input2;
    bool isSet;
  }

  mapping(bytes32 => MyStruct) public myStructs;
  bytes32[] public keys;

  function addToData(bytes32 key, uint input1, uint input2)
    public
    returns(bool success)
  {
    myStructs[key].input1 = input1;
    myStructs[key].input2 = input2;
    myStructs[key].isSet  = true;
    keys.push(key);
    return true;
  }

  function getKeyCount()
    public
    constant
    returns(uint keyCount)
  {
    return keys.length;
  }

}
Das ist interessant! Ich würde sicherlich versuchen, den Code zu ändern, nachdem ich dies gelesen habe. Aber gibt es einen bestimmten Grund, warum ich leere Einträge erhalten habe? Zuerst dachte ich, es läge daran, dass ich Daten aus einem anderen Vertrag verwende, dann habe ich, um dieses Problem zu beseitigen, eine Funktion erstellt, alle Werte zurückgegeben, die ich in Strike2 speichern wollte, und sie in einem Tupel gespeichert. und dann, um es zu initialisieren, habe ich struct2 tempStruct = struct2(x,y,z,...);und dann verwendet allEntries.push(tempStruct);, aber immer noch kein Fortschritt. Ich verstehe, dass es sehr komplex wird, aber es muss etwas geben, das ich vermisse. btw danke nochmal :)
Soweit ich das beurteilen kann, ist mapToStruct eine Zuordnung, die auf Strukturen ohne Mitglieder zeigt (struct1). Es wird nirgendwo ein Wert gesetzt. Wird struct2.input1 jemals gesetzt? Stecken Sie auch nicht alles in alles andere. Schlagen Sie vor, dass Sie auch einen Ort für die Struktur(en) auswählen und Schlüssel-/Zeilenzeiger verwenden, um andere Indizes/Listen nach Bedarf zu verwalten.
Beantwortung Ihrer 1. Frage zur Zuordnung, die auf Strukturen ohne Mitglieder verweist, die im Vertrag ausgefüllt werden, aber ich dachte nicht, dass dies für meine Frage nicht erforderlich ist (Entschuldigung, wenn es Verwirrung gestiftet hat) und 2. "struct2.input1 ever get set" I habe es versucht, aber das Problem, mit dem ich konfrontiert war, war, dass alle Elemente Null waren. Ich habe meine Lektionen gelernt und Ihre Antwort war sehr nützlich. Vielen Dank