Используя 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 = 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;
Вот два способа инициализации массива памяти фиксированного размера. В документах 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);
}
Ачала Диссанаяке
uint8[12] memory traits;
?Фабиано Сориани