2016-03-02 11 views
5

私は構造体のPurchaseを用意しています。しかし、makePaymentメソッドで新しいペイメント配列を追加しようとすると、solidityコンパイラからエラーが返されます。「内部コンパイルエラー:タイプメモリのペイメントメモリ[]メモリをまだサポートされていないストレージにコピーしています。 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); 
    } 
+0

私は取引に十分なガスを使用していなかったので、これが起こっている可能性があります。 – unflores

+0

[Ethereum SEベータ](http://ethereum.stackexchange.com/)がありますか? – default

答えて

6

支払い配列の長さを手動で変更する必要があります。

次のいずれかを使用します

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

または:購入における支払いの配列を設定し、代わりの配列を作成し、あなたが行うことができますPurchase.paymentsにそれを設定しようとするために

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

以下:

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)); 

購入の長さを延長すると、自動的に新しい属性値が作成されますes。その後、手動で設定することができます。

+0

この場合、 'payments'は' memory'キーワードを必要としますか? –

関連する問題