首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将结构映射到数组?

如何将结构映射到数组?
EN

Ethereum用户
提问于 2022-05-26 03:34:11
回答 1查看 672关注 0票数 0

我有一个名为Meeting的结构,它包含一系列地址。我想在地址回复到会议之前检查地址是否不存在,所以我创建了一个名为hasRSVPed的映射。(我可以循环遍历地址数组,但效率很低)。

我试图将创建的会议推入一系列会议,但是如果会议包含映射,我该如何做呢?

当我尝试这样做时,我得到了下面的错误

代码语言:javascript
复制
TypeError: Uninitialized mapping. Mappings cannot be created dynamically, you have to assign them from a state variable.
代码语言:javascript
复制
 struct Meeting {
        address meeting_creator;
        uint256 meetingID;
        string name;
        string description;
        uint256 start_date;
        uint256 end_date;
        uint256 max_tickets;
        uint256 ticket_price;
        uint256 current_tickets_sold;
        address[] attendees;
        mapping(address => bool) hasRSVPed;

    }

Meeting[] public meetingArray;

function create_meeting(string memory _name, string memory _description, uint _startTime, uint _endTime, uint _maxTickets,
    uint256 _ticketPrice) public returns (uint256 meetingID) {

        address[] memory adr;
        mapping(address => bool) memory RSVPed;

        totalMeetings += 1;
        meetingID = totalMeetings;

        meetingArray.push(Meeting(msg.sender, meetingID, _name, _description, _startTime, _endTime, _maxTickets, _ticketPrice, 0, adr, RSVPed));

        Meeting storage m = meetings[totalMeetings];
        m.meeting_creator = msg.sender;
        m.meetingID = meetingID;
        m.name = _name;
        m.description = _description;
        m.start_date = _startTime;
        m.end_date = _endTime;
        m.max_tickets = _maxTickets;
        m.ticket_price = _ticketPrice;
        m.current_tickets_sold = 0;
        m.attendees = adr;
        m.hasRSVPed = RSVPed;
}
EN

回答 1

Ethereum用户

发布于 2022-05-26 04:19:18

您正在尝试将动态映射推送到数组。据我所知,这可能是不可能的,因为数组本身在本质上是动态的。因此,如果一开始无法确定映射的大小,那么solidity就无法正确计算EVM中的存储槽。或者,这可能会导致汽油成本过高。

因此,我建议使用映射(uint => bool) hasRSVPed来跟踪具有唯一id的会议是否为RSVPed。

我有一个代码片段,用于实现我指出的代码。

代码语言:javascript
复制
pragma solidity ^0.8.0;
contract meeting {
    uint totalMeetings;
    struct Meeting {
        address meeting_creator;
    }
    mapping(uint => bool) hasRSVPed;
    mapping(uint => Meeting) meetings;

Meeting[] private meetingArray;

function create_meeting(string memory _name, string memory _description, uint _startTime, uint _endTime, uint _maxTickets,
    uint256 _ticketPrice) public returns (uint256 meetingID) {

        address[] memory adr;
        totalMeetings += 1;
        Meeting storage m = meetings[totalMeetings];
        m.meeting_creator = msg.sender;
        hasRSVPed[totalMeetings] = true;
}
票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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