2012-04-04 5 views
0

조건에 따라 부호없는 short 배열을 할당하려고합니다.조건에 따라 배열 크기 할당

오류 C2057 : I가 발생하는 문제는 다음 (아래의 코드)에 따라 상수 식 예상
오류 C2466 '패킷': 알 크기

일정한 크기 0
오류 C2133와 배열을 할당하는 것이 불가능
unsigned int length=4; 
if(...) 
{ 
    length = 8; 
} 
else if(...) 
{ 
    length = 6; 
} 
else 
{ 
    length = 4; 
} 

unsigned short packet[length/2]; 

나는 배열 선언하기 전에이를 추가하고 배열의 크기를 사용하여 같은 일부 헛소리를하려고 노력하지만 트릭하지 않습니다

const unsigned int halfLength=length/2; 

벡터를 사용하여 배열을 대체 할 수 없습니다. 너는 어떤 생각을 가지고 있니?

+1

해당 if에 조금 달려 있습니다.컴파일 시간에 평가할 수 있다면 템플릿 메타 프로그래밍을 사용하여 길이를 선택할 수 있습니다. – visitor

+1

** 왜 벡터를 사용할 수 없습니까? – delnan

+0

@delnan : 나는 Windows에서 STL이 어떤 DLL 인터페이스에도 존재하지 않는다는 생각을 가지고있다. [이 내용을 확인하십시오!] (http://msdn.microsoft.com/en-us/library/3tdb471s%28v=vs.80%29.aspx) – Naszta

답변

4

그래, 동적으로 할당 된 배열 :

unsigned short* packet = new unsigned short[length/2]; 

당신은 실행시 자동 저장 할당 된 배열의 크기를 지정할 수 없습니다.

또한 메모리를 직접 확보해야한다 :

delete[] packet; 
+0

알았어. 그런 다음 사용 후 삭제해야합니다. 왜이 코드가 XP에서 Visual이 아닌 Linux에서 작동했는지 알고 있습니까? – djfoxmccloud

+0

@visitor 그는 벡터를 사용할 수 없다. 질문에 언급되어있다. –

+0

@djfoxmccloud gcc 확장 프로그램이어야하지만 표준이 아닙니다. –

-3

동적 배열의 크기를 할당 할 수 없습니다. 배열의 동적 크기를 할당하기위한 포인터를 사용할 수 있습니다.

int * t = malloc(a * sizeof(int)) 
나는 메모리 누수 방지하기 위해 클래스에 걸릴 것
+1

(1)'malloc'은 C++에서 피해야합니다. (2) 당신의 스 니펫은 C++에서 작동하지 않을 것입니다. 왜냐하면'void * '에 관한 더 엄격한 타이핑 때문입니다. – delnan

+0

예 .. 당신은 C++에서 new 연산자를 사용할 수 있습니다 –

0

: C 프로그래머를위한

template <class T1> class array 
{ 
public: 
    array(size_t size) 
    : addr(0) 
    { 
    if (size > 0) 
     this->addr = new T1[size]; 
    }; 
    ~array(void) 
    { 
    if (this->addr != 0) 
    { 
     delete [] this->addr; 
     this->addr = 0; 
    } 
    }; 
    T1 & operator[](size_t index) 
    { 
    return this->addr[index]; 
    }; 
    bool empty(void) { return (this->addr != 0); }; 
private: 
    T1 * addr; 
}; 

array<unsigned short> packet(length/2); 
+0

... 기본적으로 가난한 사람의'std :: vector'입니다. – delnan

+0

@delman : 사실입니다. 그러나'std :: vector'가 아닙니다. :) – Naszta

+0

사실,하지만 당신이 내게 묻는다면 그것은 유리하지 않을 것입니다. 왜 당신은이 바퀴를 다시 발명해야한다고 생각합니까? – delnan

-2

을 :

//length value is dynamically assigned 
int length=10; 

//runtime allocation 
unsigned short * f = (unsigned short *) malloc (length/2 * sizeof(unsigned short)); 

//use the vector 
f[0]=1; 

... 

//free the memory once the program does not need more 
free(f); 
f=NULL; 
+0

C는 C++이 아닙니다. C에서 관용적 인 것은 C++에서는 해를 끼치 지 않습니다. 게다가, 당신의 코드는 C에서조차도 나쁘다. (malloc의 결과를 캐스팅하라.) (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)). – delnan

0

는 C 스타일 배열의 요소의 수는 필수적인해야합니다 constant C++의 표현식입니다. (C90은 비 상수 표현 인 을 여기에서 지원하지만, 익숙하지는 않습니다.) 분명한 대답은 std::vector입니다.하지만 당신은 그것을 사용할 수 없다고 말합니다. 그렇다면 동적 할당을 사용할 수 없습니다. 그렇지 않으면, 포인터 및 new unsigned short[length/2] 당신이 에있는 당신의 당신이 결국 예외 —를 통해 범위를두면 을 포함하여, 그것과 함께 할 때 delete[]가 발생합니다 수 있도록하겠습니다 있지만, 사용할 수 있습니다, 당신은 지금까지 아니에요 로컬로 std::vector의 약 절반을 구현하지 못했습니다.

이 코드 추출물이 너무 단순화되어 있지 않은 경우 : 왜 그냥 최대 길이를 예약하지, 예를 들면 :

당신의 예에서
unsigned short packet[8/2]; 

, 가장 큰 length가 8, 항상 8 ISN에 대한 예약 ' 어떤 문제가 생길 것입니다. (실제로 length 이 외부 함수 등에서 오는 값에 따라 달라질 수 있습니다.이 은 현실적인 해결책이 아닐 수도 있습니다. 그렇다면 ... 왜 복잡합니까? 간단 할 수있을 때

관련 문제