我有一个名为Meeting的结构,它包含一系列地址。我想在地址回复到会议之前检查地址是否不存在,所以我创建了一个名为hasRSVPed的映射。(我可以循环遍历地址数组,但效率很低)。
我试图将创建的会议推入一系列会议,但是如果会议包含映射,我该如何做呢?
当我尝试这样做时,我得到了下面的错误
TypeError: Uninitialized mapping. Mappings cannot be created dynamically, you have to assign them from a state variable. 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;
}发布于 2022-05-26 04:19:18
您正在尝试将动态映射推送到数组。据我所知,这可能是不可能的,因为数组本身在本质上是动态的。因此,如果一开始无法确定映射的大小,那么solidity就无法正确计算EVM中的存储槽。或者,这可能会导致汽油成本过高。
因此,我建议使用映射(uint => bool) hasRSVPed来跟踪具有唯一id的会议是否为RSVPed。
我有一个代码片段,用于实现我指出的代码。
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;
}https://ethereum.stackexchange.com/questions/128988
复制相似问题