Невозможно создать массив структур внутри другой структуры в приложении для голосования ethereum. - PullRequest
0 голосов
/ 11 января 2019

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

UnimplementedFeatureError: Копирование типа struct Vote.Candidate memory [] memory в хранилище еще не поддерживается.

Candidate[] public candidates;
uint public candidateCount;

function addCandidate(string memory name) public {
    candidates.length += 1;
    Candidate memory newCandidate;
    candidateCount++;
    newCandidate.name = name;
    newCandidate.id = candidateCount;
    newCandidate.voteCount = 0;
    candidates[candidateCount] = newCandidate;
}

struct Candidate  {
    uint id;
    string name;
    uint voteCount;
}

constructor () public {
    addCandidate("Cand1");
}

Это должно сохранить структуру 'Cand1' в массиве кандидатов.

Есть что-то, что я пропускаю? Заранее спасибо. Я не могу найти какую-либо информацию в Интернете!

1 Ответ

0 голосов
/ 12 января 2019

Массивы в Solidity содержатся в storage вместо memory. Просьба ссылаться на эту статью для лучшего понимания разницы между ними. Поскольку хранилище является динамическим, вы не можете напрямую добавить элемент в индекс, так как этот индекс может не существовать в хранилище. Если вы хотите добавить элемент в динамический массив хранения, вы должны использовать push() примерно так:

function addCandidate(string memory name) public {
    Candidate memory newCandidate = Candidate(candidateCount, name, 0);
    candidates.push(newCandidate);
}

Второй вариант - использовать отображение, так как отображения более выгодны, чем массивы в Solidity, из-за меньшей сложности и стоимости. Однако при использовании сопоставления вам, возможно, придется отслеживать длину и индексы в зависимости от ваших конкретных требований к реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...