Пустой массив при добавлении элементов с отображением

У меня возник вопрос. У меня есть сопоставление, которое сопоставляется со структурой.

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

Но этот код не работает, я не могу добавить детали в allEntries. В массиве есть новая запись, но все его элементы равны 0, даже после addToStruct2возврата true. заранее спасибо

Ответы (1)

Я довольно запутался, когда впервые начал отлаживать это. Вложенные структуры кажутся излишне занятыми. Я бы склонялся к хорошо решенной схеме. Взгляните на некоторые основные шаблоны здесь: Существуют ли хорошо решенные и простые шаблоны хранения для Solidity?

Я думаю, вы можете использовать «сопоставление со структурами», «массив структур с уникальным идентификатором» или даже «сопоставление со структурами и удалением» - своего рода шаблон швейцарского армейского ножа для многих случаев.

Надеюсь, поможет.

Обновлять

Это позволит вам отправить ключ и два входа и сохранить данные. Вы можете получить количество ключей и получить ключи по номеру. Вы можете получить сохраненные входные данные, используя действительный ключ. Когда вы получите неизвестный ключ, isSetбудет 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;
  }

}
Это интересно! Я бы обязательно попытался изменить код после прочтения этого. Но есть ли какая-то конкретная причина, по которой я получал пустые записи. Сначала я подумал, что это из-за того, что использовал данные из другого контракта, затем, чтобы устранить эту проблему, я создал функцию, вернул все значения, которые хотел сохранить в strike2, и сохранил их в кортеже. а затем, чтобы инициализировать его, я использовал struct2 tempStruct = struct2(x,y,z,...);, а затем allEntries.push(tempStruct);, но до сих пор нет прогресса. Я понимаю, что это становится очень сложным, но должно быть что-то, чего мне не хватает. кстати еще раз спасибо :)
Насколько я могу судить, mapToStruct — это сопоставление, указывающее на структуры без членов (struct1). Никакое значение никогда и нигде не устанавливается. Устанавливается ли когда-нибудь struct2.input1? Кроме того, не кладите все внутрь всего остального. Предложите вам также выбрать место для размещения структур и использовать указатели ключей/строк для поддержки других индексов/списков по мере необходимости.
отвечая на ваш 1-й вопрос о сопоставлении, которое указывает на структуры без членов, в контракте при заполнении, но я не думаю, что это было необходимо для моего вопроса (извините, если это вызвало путаницу), и 2-й "struct2.input1 когда-либо устанавливается" я попробовал, но проблема, с которой я столкнулся, заключалась в том, что все элементы были равны нулю. Я усвоил уроки, и ваш ответ был очень полезен. Большое спасибо