2014-07-20 1 views
2

다음은 n = 1, ..., 20에 대해 1에서 n까지의 합계를 인쇄하는 작은 스크립트입니다.컴파일 시간에 알 수없는 크기의 배열 클래스 인스턴스화

Main.cpp: In function ‘int test(long unsigned int)’: 
Main.cpp:9:13: error: ‘n’ is not a constant expression 
    array<int,n> myArray; 
     ^
Main.cpp:9:13: note: in template argument for type ‘long unsigned int’ 
Main.cpp:9:22: error: invalid type in declaration before ‘;’ token 
    array<int,n> myArray; 
       ^
Main.cpp:11:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] 
    for (int iii = 0; iii < n; iii++) 
        ^
Main.cpp:12:14: error: invalid types ‘int[int]’ for array subscript 
    myArray[iii] = iii+1; 
     ^
Main.cpp:16:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] 
    for (int iii = 0; iii < n; iii++) 
        ^
Main.cpp:17:22: error: invalid types ‘int[int]’ for array subscript 
    nSum += myArray[iii]; 
       ^
make: *** [Main.o] Error 1 

문제는 n는 상수 표현 아니라고 (무엇보다도) 것 같다, 나는 그 문제가 왜 얻을 : 물론

#include <iostream> 
#include <array> 

using namespace std; 

int test(int n) 
{ 
    array<int,n> myArray; 

    for (int iii = 0; iii < n; iii++) 
     myArray[iii] = iii+1; 

    int nSum; 

    for (int iii = 0; iii < n; iii++) 
     nSum += myArray[iii]; 

    return nSum; 
} 


int main() 
{ 
    for (int n = 1; n <= 20; n++) 
     cout << test(n) << endl; 

    return 0; 
} 

,이 컴파일되지 않습니다 , 그러나 나는 그것을 어떻게 풀 수 있는지 전혀 모른다.

새 함수를 사용하여 "일반"배열을 인스턴스화하는 방법을 알고 있지만 배열 클래스를 사용하여 가능하다는 것을 알지 못합니다.

test 함수를 n으로 처리하려면 어떻게해야합니까?

+2

'std :: vector'의 용도입니다. – leemes

답변

4

기본적으로 두 가지 옵션이 있습니다.

  1. 이미 언급했듯이 std::array에는 컴파일 타임 크기가 필요합니다. 컴파일시에 알리십시오! 이는 템플릿 매개 변수으로 변환하여 수행 할 수 있습니다.

    변경

    int test(int n) 
    

    template<int n> 
    int test() 
    

    에 문제는 다음 대신 test(n)test<n>() 호출되어야한다는 것입니다 이것은 다시 컴파일에 알려지게 호출 코드에서 n이 필요 또한 for -loop의 경우에는 해당되지 않습니다. 컴파일 타임에 루프의 상한을 알고 있다면 (현재 코드 스 니펫 에서처럼) 수행 할 수 있지만 약간 복잡합니다. 사용자 입력 등의 정보가 알려지지 않은 경우이 솔루션을 전혀 사용할 수 없습니다.

    여기는 좋은 옵션이 아닙니다.

  2. std::array을 사용하지 말고 컴파일 할 때 크기가 필요없는 컨테이너 유형 인 런타임을 사용하십시오. 언급 한대로 힙 할당 된 원시 배열 (new int[n])은 옵션이지만 C++이 아닙니다. std::vector 대신! 이를 위해

    단순히

    array<int,n> myArray; 
    

    vector<int> myArray(n); 
    

    PS로 변경. 앞으로는 std::dynarray (proposed container type)이 현재 정확히 std::vector보다 조금 더 나은 목적에 부합 할 것입니다.이것은 new int[n]의 목적을 반영합니다. n은 런타임에 알려져 있지만 배열 수명 동안 일정하므로 std::arraystd::vector 사이의 간격을 채 웁니다. 그러나 거의 모든 경우에 std::vector은 잘 할 것입니다!

+0

이것은 좋은 대답입니다.하지만 현재 문제를 해결할 방법이 없다는 것을 위에서 분명히해야합니다. 어떤 식 으로든 'n'을 상수로 처리 할 수는 없습니다. – Undreren

+0

또한 템플릿이 "컴파일러 트릭"이기 때문에 이것이 불가능한 이유는 무엇입니까? 기술적으로 런타임에 배열의 새 버전을 "컴파일"해야만 내 방법이 작동하지 않을까요? – Undreren

+0

Rapperswil (2014 년 6 월)의 ISO C++ 회의에서 일부 여행 보고서를 읽은 후에는 언제든지 'dynarray'가 곧 추가 될 것 같지 않습니다. 확실한 답이 없으면 질문이 너무 많습니다. – pmr

1

대신 vector을 사용할 수 있습니다.

#include <vector> 

vector<int> myArray (n); // n zero-initialized elements 

배열을 사용하는 것처럼 operator[]을 사용하십시오.

관련 문제