2016-03-02 30 views
5

Bir ödeme aldığım bir struct satın alma yapıyorum. Ancak, makePayment yöntemimde yeni ödeme dizisini eklemeyi denediğimde, katılık derleyicisinden bir hata alıyorum: "İç derleyici hatası: Tip yapısının kopyalanması bellek [] belleğinin belleğe depolanması henüz desteklenmiyor." Mayment dizisini storage veya memory olarak değiştirdiğimde, aynı hatayı alıyorum. Aşağıda ilgili kodu ekledim.Bir yapıdaki bir diziyi nasıl başlatırım

Yapmaya çalıştığım şeyi sağlamlıkla yapmak mümkün mü? Belgelerin mümkün olmadığını açıkça belirten bir şey görmüyorum ama aynı zamanda yapmaya çalıştığım şeyi yapan hiçbir örnek görmüyorum. : |

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

Bunun gerçekleşmesi olasıydı, çünkü işlem için yeterince gaz kullanmıyordum. – unflores

+0

[Ethereum SE beta] (http://ethereum.stackexchange.com/) olduğunu gördünüz mü? – default

cevap

6

Ayarlama sırasında ödeme dizisinin uzunluğunu elle değiştirmeniz gerekir.

kullanım Ya:

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

Veya: Purchase ödemeler dizisini ayarlayarak, yerine bir dizi oluşturarak ve yapabileceğiniz Purchase.payments ayarlayın çalıştığım için

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

izleyen:

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

Alış uzunluğunu genişletmek otomatik olarak yeni özniteliği oluşturur es. Daha sonra bunları manuel olarak ayarlayabilirsiniz.

+0

Bu durumda 'ödemeler'' memory' anahtar sözcüğüne ihtiyaç duyar mı? –