Solidity initialisiert Speicher-Array fester Größe

Mit Solidity 0.4.15 gibt es eine Funktion, die eine Zahl akzeptiert und ein Array mit fester Länge namens zurückgibt traits:

function splitN(uint256 n) constant returns (uint8[12]) {
    uint8[12] memory traits = new uint8[12];
    // alter values in traits ...
    return traits;
}

Aber diese Art der Initialisierung traitskompiliert nicht mit den Fehlern:

.../Genes.sol:28:39: TypeError: Length has to be placed in parentheses after the array type for new expression.
        uint8[12] memory traits = new uint8[12];
                                      ^-------^
,.../Genes.sol:28:9: TypeError: Type function (uint256) returns (uint8[12] memory) is not implicitly convertible to expected type uint8[12] memory.
        uint8[12] memory traits = new uint8[12];

Dann habe ich versucht, den Nachrichtenhinweisen und einer Reihe anderer Initialisierungsmöglichkeiten zu folgen, aber die einzige Möglichkeit, wie ich es zum Laufen bringen konnte, bestand darin, tatsächlich ein Array mit 12 Nullen zu füllen:

    uint8 z = 0;
    uint8[12] memory traits = [z, z, z, z, z, z, z, z, z, z, z, z];

Gibt es also eine elegantere Möglichkeit, das Array zu initialisieren?

hast du es gerade versucht uint8[12] memory traits;?
Du hast Recht @AchalaDissanayake ! Kannst du das als Antwort geben?

Antworten (4)

Um ein leeres Array zu initialisieren, uint8[12] memory traits = new uint8[12];verwenden Sie uint8[12] memory traits;.

Dann können Sie das Array im // alter values in traits ...Abschnitt ändern.

function splitN(uint256 n) constant returns (uint8[12]) {
    uint8[12] memory traits;
    // alter values in traits ...
    return traits;
}

Um ein Array aus dem Speicher zu initialisieren, müssen Sie es wie folgt machen:

uint8[] memory theArray = new uint8[](12) 

Wobei die 12 in der Klammer die Array-Länge ist.

Sie können das Array auch wie folgt initialisieren:

function getTraits() constant returns (uint8[3]){
      uint8[3] memory traits = [1,2,3];
      return traits;
    }
Meine Frage ist, init uint8[12]diese Lösungsfehler zurückzugeben:TypeError: Return argument type uint8[] memory is not implicitly convertible to expected type (type of first return variable) uint8[12] memory. return traits;
Sie müssen den Rückgabetyp der Funktion in uint8[] ändern, um das zu beheben. Alternativ können Sie das Array mit fester Größe initialisieren, wie ich es gerade in meiner aktualisierten Antwort geschrieben habe.

Hier sind zwei Möglichkeiten, ein Speicherarray mit fester Größe zu initialisieren. In Solidity-Dokumenten heißt es, dass wir den "neuen" Operator verwenden müssen. Aber eigentlich ist hier, wie ich auf "neuen" Operator (zweiter Weg) verzichtet habe. Auch ein weiterer Bonus, ich habe Rückgabeerklärungen für beide Wege hinzugefügt.

    // Way 1: by using the "new" operator
    function createArr1(uint _n, uint _m, uint _k) external pure returns(uint[] memory) {
        uint[] memory a = new uint[](3);
        a[0] = _n;
        a[1] = _m;
        a[2] = _k;
        return a;
    }
    // Way 2: without "new" operator.
    function createArr2(uint _n, uint _m, uint _k) external pure returns(uint[3] memory) {
        uint[3] memory a = [_n, _m, _k];
        return a;
    }

Verwenden Sie die folgende Syntax, wenn Sie den richtigen Wert nicht kennen und mit einer Variablen initialisieren.

function abc(uint[] a) public {
    uint[] memory c = new uint[](a.length);
}