Solidity inicializa matriz de memoria de tamaño fijo

Usando solidity 0.4.15, hay una función que toma un número y devuelve una matriz de longitud fija llamada traits:

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

Pero esta forma de inicializar traitsno compila, con los errores:

.../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];

Luego intenté seguir las sugerencias del mensaje y muchas otras formas de inicializar, pero la única forma en que podía hacer que funcionara era llenar una matriz de 12 ceros:

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

Entonces, ¿hay una forma más elegante de inicializar la matriz?

solo lo intentaste uint8[12] memory traits;?
¡Tienes razón @AchalaDissanayake! ¿Puedes poner eso como respuesta?

Respuestas (4)

Para inicializar una matriz vacía en lugar de uint8[12] memory traits = new uint8[12];usar uint8[12] memory traits;.

Luego puede modificar la matriz en la // alter values in traits ...sección.

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

Para inicializar una matriz desde la memoria, debe hacerlo así:

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

Donde el 12 dentro del paréntesis es la longitud de la matriz.

También puede inicializar la matriz de la siguiente manera:

function getTraits() constant returns (uint8[3]){
      uint8[3] memory traits = [1,2,3];
      return traits;
    }
Mi pregunta es init uint8[12], esta solución falla al devolver:TypeError: Return argument type uint8[] memory is not implicitly convertible to expected type (type of first return variable) uint8[12] memory. return traits;
Tienes que cambiar el tipo de retorno de la función a uint8[] para arreglar eso. Alternativamente, puede inicializar la matriz de tamaño fijo como acabo de escribir en mi respuesta actualizada.

Aquí hay dos formas de inicializar una matriz de memoria de tamaño fijo. En documentos de solidez, dice que necesitamos usar el operador "nuevo". Pero en realidad, así es como lo hice sin el operador "nuevo" (segunda forma). También otra ventaja, agregué declaraciones de devolución para ambos sentidos.

    // 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;
    }

Use la siguiente sintaxis si no conoce el valor correcto e inicialice usando una variable.

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