如何在结构中初始化数组

unf*_*res 9 arrays struct ethereum solidity

我有一个结构购买,其中我正在进行一系列付款.但是,当我尝试在我的makePayment方法中添加新的payment数组时,我从solidity编译器返回错误:"内部编译器错误:将类型struct Payment memory []内存复制到尚不支持的存储." 当我将mayment数组更改为storage或时memory,我得到相同的错误.我在下面添加了相关代码.

有可能做我想做的事情吗?我没有看到任何明确说明它在文档中不可能但我也没有看到任何示例正在做我正在尝试做的事情.:|

  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);
  }
Run Code Online (Sandbox Code Playgroud)

unf*_*res 7

您需要在设置时手动更改付款阵列的长度.

使用:

  Payment[] payments;
  payments[payments.length++] = Payment(address, amt);
Run Code Online (Sandbox Code Playgroud)

要么:

Payment[] payments;
payments.push(Payment(address, amt));
Run Code Online (Sandbox Code Playgroud)

要在Purchase中设置付款数组,而不是创建数组并尝试将其设置为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));
Run Code Online (Sandbox Code Playgroud)

延长购买长度将自动创建新属性.然后您可以手动设置它们.

  • 在这种情况下,“付款”是否需要“内存”关键字? (2认同)
  • 在 Solidity 8 中,这个解决方案不起作用,因为 length 是只读的,但你可以简单地执行 `Purchase p =purchasing.push()` ,而不是有索引,你可以执行 `p.product_id = Product_id` 和很快 (2认同)