Тот же вопрос обсуждался здесь, но так и не пришел к какому-либо выводу.
Я думаю, что это происходит из-за new
ключевого слова при создании переменной string abcde
.
Я попробовал два примера контрактов для подтверждения.
pragma solidity ^0.4.24;
contract Foo {
uint256 n = 10;
function initArray() public view {
uint[10*10] memory result;
for (uint i = 0; i < n; i++){
for(uint j = 0; j < n; j++){
result[(i*9)+j]=1;
}
}
}
}
Для приведенного выше смарт-контракта remix не выдает предупреждение Is constant but potentially should not be
.
pragma solidity ^0.4.24;
contract Foo {
uint256 n = 10;
function initArray() public view {
uint[] memory result = new uint[](n*n);
for (uint i = 0; i < n; i++){
for(uint j = 0; j < n; j++){
result[(i*9)+j]=1;
}
}
}
}
Однако для вышеуказанного контракта ремикс выдает предупреждение:Is constant but potentially should not be.
Функция записывает в переменную состояния babcde[]
, определенную в другом месте. Поскольку он записывает в состояние, pure
модификатор только для чтения, вероятно, ошибочен.
Надеюсь, поможет.