Solidity инициализирует массив памяти фиксированного размера

Используя Solidity 0.4.15, есть функция, которая принимает число и возвращает массив фиксированной длины, называемый traits:

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

Но этот способ инициализации traitsне компилируется с ошибками:

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

Затем я попытался следовать подсказкам сообщений и множеству других способов инициализации, но единственный способ заставить его работать — заполнить массив из 12 нулей:

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

Итак, есть ли более элегантный способ инициализации массива?

ты просто пробовал uint8[12] memory traits;?
Вы правы @AchalaDissanayake! Можете ли вы поставить это как ответ?

Ответы (4)

Чтобы инициализировать пустой массив вместо uint8[12] memory traits = new uint8[12];использования uint8[12] memory traits;.

Затем вы можете изменить массив в // alter values in traits ...разделе.

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

Чтобы инициализировать массив из памяти, вы должны сделать это следующим образом:

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

Где 12 в скобках — это длина массива.

Вы также можете инициализировать массив следующим образом:

function getTraits() constant returns (uint8[3]){
      uint8[3] memory traits = [1,2,3];
      return traits;
    }
Мой вопрос заключается в том uint8[12], чтобы init это решение возвращало ошибки:TypeError: Return argument type uint8[] memory is not implicitly convertible to expected type (type of first return variable) uint8[12] memory. return traits;
Вы должны изменить тип возвращаемого значения функции на uint8[], чтобы исправить это. В качестве альтернативы вы можете инициализировать массив фиксированного размера, как я только что написал в своем обновленном ответе.

Вот два способа инициализации массива памяти фиксированного размера. В документах Solidity говорится, что нам нужно использовать «новый» оператор. А на самом деле, вот как я обходился без "нового" оператора (второй способ). Также еще один бонус, я добавил операторы возврата для обоих способов.

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

Используйте следующий синтаксис, если вы не знаете правильное значение и инициализируйте с помощью переменной.

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