如何在结构体中初始化数组

17

我有一个名为 Purchase 的结构体,其中包含一个支付数组。然而,当我尝试在我的 makePayment 方法中添加新的支付数组时,从 solidity 编译器返回了一个错误:“复制类型结构体 Payment memory[] memory 到存储器还不支持。” 当我将支付数组更改为 storage 或 memory 时,我得到相同的错误。我在下面添加了相关代码。

在 Solidity 中,我能否实现我想要的功能?文档中没有明确说明不能做到这一点,但我也没有看到任何示例来实现我所尝试的操作。:|

  struct Payment {
    address maker;
    uint amount;
  }

  struct Purchase {
    uint product_id;
    bool complete;
    Payment[] payments;
  }
  Purchase[] purchases;

  function makePayment(uint product_id, uint amt, uint purchase_id) returns (bool) {

      Payment[] payments;
      payments[0] = Payment(address, amt);
      purchases[purchase_id] = Purchase(product_id, false, payments);
  }

可能是因为我在交易中没有使用足够的燃气。 - unflores
你看到了Ethereum SE beta吗? - q9f
2个回答

12

在设置付款数组时,您需要手动更改其长度。

可以使用以下任一方法:

  Payment[] payments;
  payments[payments.length++] = Payment(address, amt);

或者:

Payment[] payments;
payments.push(Payment(address, amt));

为了设置 Purchase 中的 payments 数组,您可以执行以下操作,而不是创建数组并尝试将其设置为 Purchase.payments:

设置 Purchase.payments :

Purchase.payments = [{...}, {...}];

请注意,上面的代码示例仅用于说明目的,您需要将其替换为适合您代码的实际数据。

uint purchase_id = purchases.length++;
purchases[purchase_id].product_id = product_id;
purchases[purchase_id].complete   = false;
purchases[purchase_id].payments.push(Payment(msg.sender, amt));

扩展购买长度将自动创建新的属性,然后您可以手动设置它们。


2
在这种情况下,payments需要使用memory关键字吗? - Blake Regalia
2
在Solidity 8中,这个解决方案行不通,因为长度是只读的,但你可以简单地使用Purchase p = purchases.push(),而不是使用索引,你可以使用p.product_id = product_id等。 - Gall Annonim

0
我发现这是最佳解决方案。
  event OnCreateRoom(address indexed _from, uint256 _value);

   struct Room {
      address[] players;       
      uint256 whosTurnId;
      uint256 roomState;
   }  

   Room[] rooms;

   function createRoom() public{
       address[] adr;
       adr.push(msg.sender);
       Room memory room = Room(adr, 0, 0);   
       rooms.push(room);
       OnCreateRoom(msg.sender, 0);
   }

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接