2013-05-15 3 views
1

.wav 파일 ... * ptr_8 및 * ptr_16 - 샘플 배열에 대한 포인터.오류 : '부호없는'앞에 예상 표현

내가 (---> 선언 * ptr_8 8 bitsPerSample ... 경우)

if (hdr.S1.BitsPerSample == 8)  // Declaring array for samples. Depending 
             // on header's data (8 or 16 bits). 
    unsigned char *ptr_8; 
else 
    if (hdr.S1.BitsPerSample == 16) 
     unsigned short *ptr_16; 

문제 그것이 기록이다 헤더의 데이터에 따라 이러한 포인터를 선언 할 수있는 프로그램을 만들어 원하는 :

(이 경우, *ptr_8*ptr_16을 선언해야 함) 이러한 종류의 동작이 나타나는 이유는 알 수 없지만. 무엇이 잘못되었는지 말해주십시오.


UPDATE : 그것을 알고 보니

, 선언은 컴파일 시간 개념 (아래 허용 대답 참조).

변수가 컴파일 중 선언되어 시스템의 리소스를 한 번 사용한 다음 (컴파일 된 응용 프로그램을 만들 때) 모두 이미 선언되어 있습니다. 프로그램을 최적화하는 최악의 방법 중 하나였습니다. ...

+0

'hdr.S1.BitsPerSample == 8'을'true'로 대체하면 어떨까요? –

+0

다음과 같이 씁니다 :''true '는 선언되지 않았습니다 (함수에서 처음 사용됨)'. – yulian

답변

5

런타임 조건에 따라 변수 선언을 조건부로 만들 수 없습니다. 두 코드는 나머지 코드가 진행 중이지만 무조건 선언해야합니다. 그 중 하나만 사용하십시오.

선언을 조건부로 만드는 유일한 방법은 프리 프로세서의 조건부 컴파일을 사용하는 것입니다. 조건부 컴파일은 조건이 파일의 헤더를 기반으로하므로 명확하게 런타임에 적용됩니다.

if (hdr.S1.BitsPerSample == 16) { 
    unsigned short *ptr_16; 
    // Use ptr_16 here 
} else if (hdr.S1.BitsPerSample == 8) { 
    unsigned char *ptr_8; 
    // Use ptr_8 here 
} 
// Neither ptr_16 nor ptr_8 is available here 
+0

간단히 말하면 프로그램을 컴파일하는 동안 모든 변수가 선언된다는 의미입니까? 내가 알기로 이것은 모든 변수가 프로그램을 컴파일하는 동안 선언하고 프로그램을 실행하는 동안 선언 할 수 없기 때문에 프로그램을 최적화하는 방법이 매우 다양합니다 ... 감사의 말을 감사드립니다! – yulian

+1

@Julian 올바른 선언은 컴파일 타임 개념입니다. 전 처리기는 컴파일러보다 먼저 프로그램에 접근하므로 일부 선언을 숨길 수 있지만 컴파일러는 코드에서 사용하는 모든 선언을 확인해야합니다. 선언의 범위를 중괄호로 묶어 선언 범위를 제한 할 수는 있지만 닫는 중괄호는 변수의 가용성을 끝냅니다. – dasblinkenlight

1

왜 그냥 어쨌든 모두 포인터를 선언 할 수 없습니다와 만 사용하려는 하나를 채울 :

이처럼 if의 두 지점에서 처리를 넣을 수 있습니다? 어쨌든 문제는 범위와 관련이 있습니다. if 블록 내에 변수를 선언하려면 중괄호가 있어야하고 그 변수는 해당 중괄호 블록 내에서만 유효해야합니다.