본문 바로가기
WEB3 Error

[Solidity ERROR] Invalid array length, expected integer literal

by 개발이 체질인 나그네 2022. 12. 17.
반응형

 

* 본 게시글은, 개발 과정에서 발생한 애러를 개인적으로 정리한 내용입니다.

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://borntodevelop.tistory.com/entry/Solidity-Array-Memory%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-Solidity-08

 

[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

 

 


 

반응형

댓글