2013-01-02 4 views
3

Possible Duplicate:
Variable length arrays in C++?선언 가변 길이 배열

나는 크기가 사용자에 의해 공급 다른 변수에 의해 지배되는 배열을 형성하기 위해 노력하고 있습니다. 저는 C++ 코딩의 초보자이고 Visual Studio 2008 전문 컴파일러를 사용하고 있습니다.

double kplus2(double a, double ks, double kr) 
{ 
    int n = (ks-1)*100000; 
    double x[n]; 

오류가

Error 2 error C2057: expected constant expression
Error 3 error C2466: cannot allocate an array of constant size 0
Error 4 error C2133: 'x' : unknown size

+4

사용'(n)의 표준 : : 벡터 X,' – WhozCraig

+0

[첫 번째 구글 결과 (HTTP : // 유래 .com/questions/1887097/variable-length-arrays-in-c) – thecoshman

+0

이 질문에 대한 정말 끔찍한 대답의 수는 우울합니다. – Puppy

답변

3

당신은 동적으로 다음과 같이 메모리를 할당해야합니다입니다 : 이 컴파일러는 오류 표시 코드입니다

double *p = new double[n]; 

당신 C++의 포인터 구문을 사용하면 편리하게 사용할 수 있으므로 배열처럼 사용할 수 있습니다.

p[0] = 3.14; 
p[n-1] = 1.14; 

당신이 그것을 사용 완료 후에는 delete 연산자를 사용하여 메모리를 버려야합니다 : 우리는 우리가의 벡터 버전을 사용하기 때문에 delete 연산자의 벡터 [] 버전을 사용

delete [] p; 

new 연산자.

일부 컴파일러에는 코드 작성을 시도한 것처럼 동적으로 크기가 조정 된 로컬 배열을 허용하는 확장 기능이 있습니다. gcc는 그러한 컴파일러 중 하나입니다. 언어 표준의 일부가 아닙니다. 언젠가는 될 지 모르지만.

+4

-1을 읽으십시오. – Puppy

+0

@DeadMG 왜 그렇게 나쁜지 궁금합니다. – dutt

+0

@dutt : [RAII] (http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization) –

14

I am trying to form an array whose size is governed by another variable fed in by the user.

C++에는 이미이 기능이 있습니다. std::vector라고하며 머리글 <vector>에 있습니다.

double kplus2(double a, double ks, double kr) 
{ 
    int n = (ks-1)*100000; 
    std::vector<double> x(n); 
+0

C++에 대한 적절한 C-VLA 대체에 +1. – WhozCraig

1

벡터를 사용할 수 있습니다. 또한 런타임에 크기를 조정할 수 있으므로 더 많은 데이터를 추가하려는 경우 원하는 크기의 새로운 배열을 만들고 그 안에 현재 데이터를 복사하는 것에 대해 걱정할 필요가 없습니다.

벡터 &을 사용하면 문제를 해결하는 데 더 나은 접근 방법이므로 위험이 적습니다.

double kplus2(double a, double ks, double kr) 
{ 
    int n = (ks-1)*100000; 

    vector<double> x(n); // you don't have to worry about deallocating it cuz its a container. It can grow in size at run time 

    ... 

return 0; 

} 

당신은이 작업을 수행 할 수 있습니다 그러나 :

double kplus2(double a, double ks, double kr) 
{ 
    int n = (ks-1)*100000; 

    double *x=new double[n]; // array of size i 

    // you should also deallocate this dynamically allocated array at the end 


    ..... 

    delete []x; 

    return 0; 

}

+0

두 번째 예제에서'new'와'delete' 사이에 예외가 발생하면 어떻게 될까요? 수동 메모리 관리를 가르치는 것은 좋지만 어떻게 제대로 수행되어야하는지 가르쳐주십시오. –