2014-11-09 2 views
2

헤더 파일에 정의 된 A라는 상수가 있습니다. 항상 짝수입니다.C 헤더 파일에 특정 배열 크기를 할당하는 방법

I은 ​​길이가 예를 들어 A.

의 값에 따라 동일한 헤더 파일 어레이 B를 선언하고자;

A가 32 인 경우 배열 크기를 4 (2,4,8,16을 요소로, A/2까지의 모든 거듭 제곱)로 지정합니다.

A가 48 인 경우 배열 크기를 5로하고 싶습니다 (2,4,8,16,24는 요소입니다 .A/2와 A/2가 될 때까지 2의 모든 제곱) .

위의 논리를 사용하여 A의 값이 주어진 B의 배열 크기를 계산하는 우아한 방법은 무엇입니까?

+0

왜 정적으로 배열을 선언해야합니까?이것은 계산과 동적 할당이 필요한 것과 같습니다. – eyalm

+0

헤더에 선언 된 배열을 원한다. becuse를 여러 개의 c 파일에 걸쳐 사용할 것이다. – gforce89

+0

하나의 모듈에서 정의하고 'extern'을 사용하여 내보낼 수 있습니다. –

답변

3

,하지만 당신은 그렇게 주어진, 당신은 다음과 같이 몇 가지 방식을 사용하여 관리 할 수 ​​있습니다

#define A 384 

#define B_SIZE (A <= 16 ? 3 : A <= 32 ? 4 : A <= 64 ? 5 : A <= 128 ? 6 : \ 
       A <= 256 ? 7 : A <= 512 ? 8 : A <= 1024 ? 9 : -1) 

extern int B[B_SIZE]; 

꼬리 값으로 -1을 사용하는 것은 우연한 일이 아닙니다. 음수 크기의 배열을 가질 수 없기 때문에 컴파일 오류가 발생하므로 A이 너무 크면 코드가 컴파일되지 않습니다. 너는 너무 작은 크기를 배제하기 위해 같은 트릭을 사용할 수있다. 정의하고 배열을 초기화하는 코드에서

, 당신은 사용

int B[B_SIZE] = 
{ 
    2, 4, 
#if A > 16 
    8, 
#endif 
#if A > 32 
    16, 
#endif 
#if A > 64 
    32, 
#endif 
#if A > 128 
    64, 
#endif 
#if A > 256 
    128, 
#endif 
#if A > 512 
    256, 
#endif 
    A/2 
}; 

이 우아한 아니지만, 내가 할 수있는 깔끔한 방법이 확실하지 않다. A 값이 범위를 벗어날 경우 다시 컴파일 오류를 확인하기 위해 B_SIZE을 다시 명시 적으로 사용합니다. 그렇지 않으면 B_SIZE을 배열 사양에서 벗어나게 할 수 있습니다.

주어진 크기까지 코드를 생성하기 위해 쉘 (Awk, Perl, Python, ...) 스크립트를 쉽게 작성할 수 있습니다.

2

아마도 뭔가를 놓치고 있습니다. 왜 당신은 단순히 배열을 정의하지 : 당신은 A에 대한 #define를 사용할 필요가

int array[] = { 
    2,4,8,16 
#if A == 48 
    ,24 
#endif 
}; 

#define DIM_OF_ARRAY (sizeof(array)/sizeof(array[0])) 
+1

그러나이 방법은 C 소스 파일에서 정의해야합니다. 헤더는'int array [];'만 포함해야합니다. – Jens

1

A을 항상 2의 거듭 제곱으로 제한하면 다른 문제와 관련이 있습니다. "컴파일 할 때 정수 유형의 값 비트 수는 어떻게 계산합니까?"이 문제는 십여 년 전 Hallhaard B Furuseth Hallbard B Furuseth에 의해 아름답게 해결되었습니다. 참고 : 다음과 같이 Hallvard의 솔루션을 사용하여 https://stackoverflow.com/a/4589384/3478852

, 우리가 배열의 크기를 계산할 수 있습니다 :

#include <stdio.h> 

/* Number of bits in inttype_MAX, or in any (1<<k)-1 where 0 <= k < 2040 */ 
#define IMAX_BITS(m) ((m)/((m)%255+1)/255%255*8 + 7-86/((m)%255+12)) 

#define A 1073741824 

int B[IMAX_BITS(A/2-1)]; 

int main (void) 
{ 
    printf ("%d\n", (int)(sizeof B/sizeof B[0])); 
    return 0; 
} 

참고 :

  • 수는 A 2의 거듭 제곱이어야합니다.
  • 이 코드는 2039 비트까지의 정확한 매크로 버전을 사용합니다. 이 기사에는 엄청나게 많은 수의 다른 버전이 있습니다.
+0

흥미 롭습니다. 그러나 그 질문은 A가 2의 거듭 제곱이 아닌 48을 가질 수 있다고 명시 적으로 언급했기 때문에 관련성이있는 것은 아닙니다. –

+0

@JonathanLeffler : Dang, 그 부분을 놓쳤습니다. 사실 나는 그것을 읽었지만 그것에 대해 모든 것을 잊어 버렸다. –

+0

답안에서 추정을 바 꾸었습니다. –

관련 문제