Как я могу получить структуру из вложенного массива в твердости? - PullRequest
0 голосов
/ 30 сентября 2018

Я хочу извлечь свой User из вложенного массива gameBoard, чтобы переместить его в новый набор индексов x и y.Remix IDE выдает эту ошибку: TypeError: type struct Game.User storage ref[] storage ref is not implicitly convertible to expected type struct Game.User memory.Первоначально я пытался сделать это без memory, но это не только противоречит цели не хранить его постоянно (если я правильно понимаю), но и приводило к менее полезным ошибкам.Пожалуйста, помогите!

pragma solidity ^0.4.0;

contract Game {
    struct User{
        address owner;
        uint currency;
        uint left;
        uint right;
        uint top;
        uint bottom;
    }
    User[][10][10] public gameBoard;

    function addUser (uint _x, uint _y) public {
        gameBoard[_x][_y].push(User(msg.sender, 10, 5, 5, 5, 5));
    }

    function moveUser (uint _fromX, uint _fromY, uint _toX, uint _toY) public {
        User memory mover = gameBoard[_fromX][_fromY];
        if (mover.owner != msg.sender)return;

        // once I have 'mover', I will check whether
        // I want its the msg.senders and then place
        // it where I want it to go
    }

}

1 Ответ

0 голосов
/ 01 октября 2018

Краткий ответ: Вы неправильно указали свой массив и нуждаетесь в другом наборе [скобок].

Итак, вы создали трехмерный массив пользователей, называемый «игровая доска».При добавлении пользователя вы правильно помещаете структуру в динамическое 3-е измерение вашего массива.Однако, когда вы получаете доступ к структурам, вы даете только два измерения, и поэтому Solidity возвращает динамический пользовательский массив.Поскольку вы пытаетесь сохранить его в структуре, а не в массиве структур, выдается ошибка.Самый простой способ исправить это - использовать:

User memory mover = gameBoard[_fromX][_fromY][0];

Однако при этом возвращается только первый пользователь в этой позиции на игровом поле, поэтому вам, вероятно, потребуется выполнить какое-то зацикливание (а это неидеал в контрактах).Лично я предпочитаю держаться подальше от многомерных массивов и, честно говоря, от всех массивов в целом (хотя они и используются) при работе с Solidity.Обычно с отображениями работать намного проще, особенно при работе с адресами.Не могли бы вы уточнить, что вы пытаетесь сделать, если есть лучший способ добиться этого?

...