我想从嵌套的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
}
}
答案 0 :(得分:0)
简短的回答:您在为数组建立索引错误,并且需要另一组[括号]。
因此,您创建了一个称为“游戏板”的3维用户数组。添加用户时,将结构正确推入数组的动态第3维。但是,当您访问这些结构时,您仅给出两个维度,因此Solidity返回动态用户数组。由于您尝试将其存储到结构而不是结构数组中,因此会引发错误。解决该问题的最简单方法是使用:
User memory mover = gameBoard[_fromX][_fromY][0];
但是,这只会返回游戏板上该位置的第一个用户,因此您可能需要进行某种循环(这在合同中并不理想)。就我个人而言,我更喜欢在使用Solidity时避免使用多维数组,并且说实话,一般来说,所有数组都应使用(尽管它们有其用途)。映射通常更容易使用,尤其是在处理地址时。如果有更好的实现方法,您能否详细说明您要尝试做的事情?