Problem beim Einfügen in ein Array innerhalb einer Struktur

Ich habe ein Problem mit dem folgenden SmartContract.

Ich habe eine Struktur definiert, die ein String-Array enthält. Und ich habe eine Zuordnung für diese Struktur definiert.

struct Stonedetails {

        uint stoneweight;
        string stoneimagehash;
        string stoneidbywholesaledealer;
        string[] stoneidsbycutter;


}

mapping (uint=>Stonedetails) public stonedetailsTable;

Ich habe die Werte in struct mit den folgenden Methoden in einer Funktion gespeichert, indem ich Parameter übergeben habe.

 stonedetailsTable[stoneid].stoneweight =stoneweight;
 stonedetailsTable[stoneid].stoneimagehash =stoneimagehash;
 stonedetailsTable[stoneid].stoneidbywholesaledealer =stoneidbywholesaledealer;

Wie kann ich die Werte in einem String-Array speichern? Ist es der Weg, die Werte einzeln zu speichern?

stonedetailsTable[stoneid1].stoneidsbycutter.push(stoneidbycuttervalue);

Wie kann ich die Länge des Arrays mit stoneidsbycutter.length finden?

Ich bin mir nicht sicher, was Ihre Frage ist. Funktioniert der von Ihnen geteilte Code nicht? Funktioniert stonedetailsTable[stoneid].stoneidsbycutter.lengthnicht?
@smarx Ich habe versucht, die Länge zu finden, aber es gibt den Wert '0' zurück ... Ist die Art der Einfügung, die ich verwendet habe, korrekt?
Es sieht für mich in Ordnung aus. Können Sie einen vollständigen Code teilen, der das Problem aufweist? (zB a pushgefolgt von einem Häkchen bei length.)

Antworten (1)

Dein Code sieht korrekt aus. Ich habe Folgendes getestet und wie erwartet eine Länge von 1 erhalten:

pragma solidity ^0.4.17;

contract Test {
    struct Stonedetails {
        uint stoneweight;
        string stoneimagehash;
        string stoneidbywholesaledealer;
        string[] stoneidsbycutter;
    }

    mapping (uint=>Stonedetails) public stonedetailsTable;

    function Test() public {
        stonedetailsTable[0].stoneidsbycutter.push("hello");
    }

    function getLength() public constant returns (uint256) {
        return stonedetailsTable[0].stoneidsbycutter.length; // returns 1
    }
}
Es hat erfolgreich funktioniert