

* 본 게시글은, 개발 과정에서 발생한 애러를 개인적으로 정리한 내용입니다.
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 !!
위 처럼 코드를 짜야한다고 한다.
오늘도 지식이 늘었다.
[Solidity] Array Memory에서 사용하는 방법 || Solidity 0.8 ||
안녕하세요. 스마트 컨트렉트 개발자 개발이 체질의 최원혁입니다. Solidity는 변수를 정할 때, 데이터가 저장되는 위치를 정의해야 합니다. EVM은 상태(States) 변수와 지역(Local) 변수 두 종류로 나
borntodevelop.tistory.com
https://ethereum.stackexchange.com/questions/12433/invalid-array-length-expected-integer-literal
Invalid array length, expected integer literal
I'm trying to declare an in-memory array with a fixed length: uint length = 10; uint[length] memory priorityList; However, it just displays this error message: Invalid array length, expected i...
ethereum.stackexchange.com
'WEB3 Error' 카테고리의 다른 글
[Solidity ERROR] Member "push" is not available in uint256[] memory outside of storage (0) | 2022.12.17 |
---|
댓글