Matriz vacía al agregar miembros con mapeo

tenía una pregunta Tengo un mapeo que mapea a struct.

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

Pero este código no funciona, no puedo agregar los detalles a allEntries. La matriz tiene una nueva entrada pero todos sus miembros son 0, incluso después de que addToStruct2devuelve verdadero. gracias de antemano

Respuestas (1)

Me enredé bastante cuando comencé a depurar esto. Las estructuras anidadas parecen innecesariamente ocupadas. Me inclinaría por un patrón bien resuelto. Eche un vistazo a algunos patrones básicos aquí: ¿ Existen patrones de almacenamiento sencillos y bien resueltos para Solidity?

Creo que puede usar "mapeo con estructuras", "matriz de estructuras con ID único" o incluso "mapeo con estructuras y eliminar", una especie de patrón de navaja suiza para muchos casos.

Espero eso ayude.

Actualizar

Esto le permitirá enviar una clave y dos entradas y almacenar los datos. Puede obtener un recuento de claves y obtener las claves por número. Puede recuperar las entradas guardadas con una clave válida. Cuando obtenga una clave desconocida, isSetserá falsa.

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

}
¡Esto es interesante! Seguramente intentaría cambiar el código después de leer esto. Pero, ¿hay alguna razón específica por la que estaba recibiendo entradas en blanco? Primero pensé que era porque estaba usando datos de otro contrato, luego, para eliminar este problema, creé una función, devolví todos los valores que quería almacenar en strike2 y los guardé en una tupla. y luego para iniciarlo usé struct2 tempStruct = struct2(x,y,z,...);y luego allEntries.push(tempStruct);, pero aún no hubo progreso. Entiendo que se está poniendo muy complejo, pero debe haber algo que me falta. por cierto gracias de nuevo :)
Por lo que puedo decir, mapToStruct es un mapeo que apunta a estructuras sin miembros (struct1). Nunca se establece ningún valor en ninguna parte. ¿Alguna vez se establece struct2.input1? Además, no pongas todo dentro de todo lo demás. Le sugerimos que también elija un lugar para que vivan las estructuras y use punteros clave/de fila para mantener otros índices/listas según lo requiera.
respondiendo a su primera pregunta sobre el mapeo que apunta a estructuras sin miembros, en el contrato se rellena, pero no pensé que no fuera necesario para mi pregunta (disculpas si causó confusión) y la segunda "struct2.input1 nunca se establece" I Lo intenté, pero el problema al que me enfrentaba era que todos los elementos eran cero. He aprendido mis lecciones y su respuesta fue muy útil. Muchas gracias