我怎样才能从嵌套数组中检索结构?

时间:2018-09-30 20:00:48

标签: multidimensional-array typeerror solidity

我想从嵌套的User数组中提取我的gameBoard,以便可以将其移到xy的新索引集中。 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 :(得分:0)

简短的回答:您在为数组建立索引错误,并且需要另一组[括号]。

因此,您创建了一个称为“游戏板”的3维用户数组。添加用户时,将结构正确推入数组的动态第3维。但是,当您访问这些结构时,您仅给出两个维度,因此Solidity返回动态用户数组。由于您尝试将其存储到结构而不是结构数组中,因此会引发错误。解决该问题的最简单方法是使用:

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

但是,这只会返回游戏板上该位置的第一个用户,因此您可能需要进行某种循环(这在合同中并不理想)。就我个人而言,我更喜欢在使用Solidity时避免使用多维数组,并且说实话,一般来说,所有数组都应使用(尽管它们有其用途)。映射通常更容易使用,尤其是在处理地址时。如果有更好的实现方法,您能否详细说明您要尝试做的事情?