반응형
* 본 게시글은, 개발 과정에서 발생한 애러를 개인적으로 정리한 내용입니다.
Invalid array length, expected integer literal
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract ReturnsArray {
mapping(address => uint) public balance;
function getBalanceByAddressList(address[] calldata users) public view returns(uint[] memory) {
uint _length = users.length;
uint[_length] memory results; // ERROR !!
for(uint i = 0; i < _length; i++) {
// results.push(balance[users[i]]);
results[i] = balance[users[i]];
}
return results;
}
}
위와 같이 배열을 정적으로 설정하는 과정에서 발생했습니다.
uint[] 안에 숫자가 아닌 지정한 변수를 넣었을때, 발생했습니다. 원인을 파악하기 위해 공식문서와 커뮤니티를 찾아봤습니다.
Memory arrays with dynamic length can be created using the new operator. As opposed to storage arrays, it is not possible to resize memory arrays (e.g. the .push member functions are not available). You either have to calculate the required size in advance or create a new memory array and copy every element.
by.Solidity Docs https://docs.soliditylang.org/en/v0.8.17/types.html?highlight=memory#allocating-memory-arrays
공식 문서에 따르면 new 연산자를 통해 정적 배열을 만들 수 있다고 한다.
문제해결
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract ReturnsArray {
mapping(address => uint) public balance;
function getBalanceByAddressList(address[] calldata users) public view returns(uint[] memory) {
uint _length = users.length;
// uint[_length] memory results; // ERROR !!
uint[] memory results = new uint[](_length); // GOOD !!
for(uint i = 0; i < _length; i++) {
// results.push(balance[users[i]]);
results[i] = balance[users[i]];
}
return results;
}
}
Before :
uint[_length] memory results; // ERROR !!
After :
uint[] memory results = new uint[](_length); // GOOD !!
위 처럼 코드를 짜야한다고 한다.
오늘도 지식이 늘었다.
https://ethereum.stackexchange.com/questions/12433/invalid-array-length-expected-integer-literal
반응형
'WEB3 Error' 카테고리의 다른 글
[Solidity ERROR] Member "push" is not available in uint256[] memory outside of storage (0) | 2022.12.17 |
---|
댓글