如何返回struct的数组?

时间:2017-09-26 12:31:53

标签: ethereum solidity

功能getBets()给出了错误:error: Failed to decode output: Error: Unsupported or invalid type: tuple。我错过了什么?

pragma solidity ^0.4.11;

contract Casino {

    struct Bet {
        address by;
        uint number;
    }

    address owner;
    Bet[] bets;

    event BetPlaced(Bet bet);

    function Casino() {
        owner = msg.sender;
    }

    function bet(uint number) {
        Bet memory bet;
        bet.by = msg.sender;
        bet.number = number;

        bets.push(bet);

        BetPlaced(bet);
    }

    function getBets() constant returns (Bet[]) {
        return bets;
    }

    function getCount() constant returns (uint length) {
        return bets.length;
    }
}

2 个答案:

答案 0 :(得分:0)

目前如果我是正确的,除了整数数组之外你不能返回任何内容,因为不支持返回多维数据存储;

您可以使用以下实验库:

pragma experimental ABIEncoderV2;

取代:

pragma solidity ^0.4.11;

如果您目前正在使用它,并且它是实验性的,那么它在Remix上不可用,因此它可能永远不会成为Solidity源的一部分:https://github.com/ethereum/solidity/issues/2948

如果你确实想要返回一个结构数组,你可以将整个数组转换为字节并返回字节。这有点极端,我不建议。

如果您只需要在内部而非外部访问该方法,则可以通过存储来传递,例如

function getBets() internal returns (Bet[] storage _r) {
    _v = bets;
}

答案 1 :(得分:0)

您可能希望将结构切换为另一个合约。这样您就可以返回一组地址。我发现使用结构只对存储和检索“那”数据有用。合同最好返回地址集。另外,我还没有使用过实验编码器,所以只关注当前的可靠性版本。