首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >返回数组内的结构数组

返回数组内的结构数组
EN

Ethereum用户
提问于 2018-12-27 07:30:47
回答 2查看 741关注 0票数 6
代码语言:javascript
运行
复制
pragma solidity >= 0.4.25 < 0.6;

contract Bank {
    struct Customer {
        uint age;
    }

    Customer[][] customers;

    function foo() public {
        if (customers.length > 0) {
            Customer[] storage northBranch = customers[0];
            if (northBranch.length > 1) {
                Customer storage customer = northBranch[1];
                customer.age = 23;
            }
        } else {
            Customer memory bob;
            bob.age = 34;
            customers.length += 1;
            customers[0].push(bob);
        }
    }
}

我正在寻找函数返回的例子和调用函数时的数组。有很多例子,但是我可以找到一个函数,它返回数组,数组在里面,结构在里面。

我试过这个,但不起作用。

代码语言:javascript
运行
复制
function get() external view returns (Customer[][]) {
    /*Customer[][] memory resCustomer;

    for(uint i = 0; i<customers.length;i++) {
        resCustomer[i][] = customers[i][];

    }*/

    return (customers);
}

错误:

TypeError:这种类型只支持在新的实验ABI编码器。使用“实用化实验ABIEncoderV2;”启用该特性。

对于如何穿越主数组以获得内部数组和内部结构,我有什么想法吗?

EN

回答 2

Ethereum用户

回答已采纳

发布于 2019-01-04 09:14:32

正如错误描述的那样,返回多维动态数组只支持作为使用ABIEncoderV2的实验特性(参见坚实性文件)。

将以下一行添加到您的合同顶部:

代码语言:javascript
运行
复制
pragma experimental ABIEncoderV2;

你的全部合同将是:

代码语言:javascript
运行
复制
pragma solidity >= 0.4.25 < 0.6;
pragma experimental ABIEncoderV2;

contract Bank {
    struct Customer {
        uint age;
    }

    Customer[][] customers;

    function foo() public {
        if (customers.length > 0) {
            Customer[] storage northBranch = customers[0];
            if (northBranch.length > 1) {
                Customer storage customer = northBranch[1];
                customer.age = 23;
            }
        } else {
            Customer memory bob;
            bob.age = 34;
            customers.length += 1;
            customers[0].push(bob);
        }
    }

    function get() external view returns (Customer[][] memory) {
        return (customers);
    }
}

请务必使用Web3.jsv1.0.0-beta.36来使用此功能,因为从该版本开始只添加了mutli维动态数组的完整解码(请参阅web3.js#1148)。尽管如此,仍然没有很好的保证它能像预期的那样工作,因为这是一个实验性的特性。

这是一个实验性的特性,因此不建议在生产环境中使用这样的功能。也许您可以重新评估您是否真的需要将数据存储在这样的结构中,或者是否也可以使用更简单的方法。

票数 3
EN

Ethereum用户

发布于 2019-01-07 10:35:26

因为返回双动态数组(如string[]或bytes[])或结构数组还不受支持,除非您没有在代码的顶部添加行pragma experimental ABIEncoderV2;,因此在get()函数中可以做的是通过解包装结构返回多个值(即有坚实支撑)。

例如,您有struct。

代码语言:javascript
运行
复制
Customer {
    uint age;
    address id;
    bytes32 name;
}

和状态

代码语言:javascript
运行
复制
Customer[] customers;

您可以编写get()函数如下:

代码语言:javascript
运行
复制
function get() external view returns (uint[] memory ages, uint[] memory ids, bytes32[] names) {

    ages = new uint[](customers.length);
    ids = new address[](customers.length);
    names = new bytes32[](customers.length);

    for(uint i = 0; i<customers.length;i++) {
        ages[i] = customers[i].age;
        ids[i] = customers[i].id;
        names[i] = customers[i].name;
    }
}

由于您有客户,所以undefined试图找到一种明智的方法来打开这个结构以满足您的需要。

希望能帮上忙!

票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/64644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档