2011-04-06 6 views
0

배열을 만들고 선언 중에 배열 초기화를 지정하는 솔루션을 찾아야합니다.지정된 동적 배열 초기화

다음 코드는 ARM11 C 컴파일러에서 작동하지만 항상 MSVC 컴파일러에서 작동하지 않습니다. Win32에서 임베디드 SW를 테스트 한 후 고객에게 제공하기 위해 단위 테스트를 작성하려고합니다.

/* In some header file: */ 
... 
/* Module1 */ 
#define P_proc1  0 

/* Module2 */ 
#define P_proc2  (P_proc1 + 1) 
#define P_proc3  (P_proc2 + 1) 
#define P_proc4  (P_proc3 + 1) 

/* Module3 */ 
#define P_proc5  (P_proc4 + 1) 
#define P_proc6  (P_proc5 + 1) 
#define P_proc7  (P_proc6 + 1) 
#define Q_proc2_2nd_inst (P_proc7 + 1) 
#define Q_proc3_2nd_inst (Q_proc2_2nd_inst + 1) 
#define Q_proc5_2nd_inst (Q_proc3_2nd_inst + 1) 
#define P_Last  (Q_proc5_2nd_inst + 1) 
... 
/* End of some header file */ 

그리고

/* The source file */ 
#include "some header file" 
... 
/* MACRO declarations */ 
/* For the following macro: PROC = base process name, 
          INSTANCE = base number of instance 
          GROUP = extended num of instances for this instance*/ 
#define PQ_ENTRY(PROC, INSTANCE, GROUP) \ 
    [P_##PROC + INST - 1] = { queue_table + P_##PROC + INSTANCE - 1, \ 
           queue_table + (GROUP == 1 ? \ 
           P_##PROC : \ 
           Q_##PROC##_2nd_inst) \ 
           + INST - 1 } 

/* GLOBAL VARIABLE declarations */ 
/* queue definitions for tasks */ 
t_queue queue_table[P_last + 1]; 

t_queue *const p_queue_table[][2] = 
{ 
    PQ_ENTRY(proc3, 1, 2), 
    PQ_ENTRY(proc2, 1, 2), 
    PQ_ENTRY(proc7, 1, 1), 
    PQ_ENTRY(proc5, 1, 2), 
    PQ_ENTRY(proc6, 1, 1), 
    PQ_ENTRY(proc1, 1, 1), 
    PQ_ENTRY(proc4, 1, 1) 
}; 
... 
/* End of source file */ 

P_proc *의 정의

또한 테이블 (배열) queue_table에 대한 인덱스이다 : 다음과 같은

코드 보인다. 이 예제에서 프로세스 (기본) 이름은 소수의 프로세스만으로 쉽게 만들었지 만 실제 코드에는 더 많은 프로세스가 있고 (기본) 이름은 무엇이든 될 수 있습니다.

p_queue_table의 개념은 프로세스의 다른 인스턴스에 대한 queue_table에 대한 포인터를 보유 할 테이블을 가지며 index에는 예를 들어 프로세스 이름 def., P_procX가 있습니다.

P_XXX 프로세스 이름이 정의 된 것과 동일한 순서로 p_queue_table의 항목 순서에 의존 할 수 없습니다. 만약 그렇다면, 나는 테이블의 초기화를 초기화 할 필요가 없다. 한 가지 해결책은 p_queue_table 배열을 선언 한 다음 나중에 함수에서 초기화하는 것이지만 원하는 것은 아닙니다.

테이블을 만들 때 매크로를 확장/생성 할 수 있어야합니다. 나중에 테이블을 정렬하고 나중에 p_queue_table (예 : procs [ ] [3]은 {{proc3, 1, 2}, {proc2, 1, 2}, ...}로 초기화됩니다.

누구나이 문제에 대한 답변을 제공합니까?

+0

AFAIKS 이것은 유효한 전략입니다. MSVC가 뭘 좋아하지 않는지 설명하지 않았다. –

+0

안녕하세요 옌스입니다. 죄송합니다, 그걸 잊어 버렸습니다. MSVC는 '['in the macro => '에 대한 구문 오류에 대해 불평합니다. "오류 C2059 : 구문 오류 :'[ '". '[P _ ## PROC + INST - 1] ='을 제거하면 MSVC가 만족스럽지 만 p_queue_table의 항목이 올바른 순서로 정렬되지 않으므로 잘못된 위치에 대한 포인터가 생깁니다. 테이블에 대한 인덱스. P_proc1은 def입니다. 0으로 설정하지만 p_queue_table [0] [0]은 P_proc3의 인스턴스 1에 대한 포인터를 보유하고 p_queue_table [0] [1]은 P_proc3의 인스턴스 2에 대한 포인터를 보유합니다. –

답변

1

당신은 배열 요소의 지정 초기화 기능

double A[10] = { [1] = 32.0, [5] = 43.0 }; 

을 사용하고 있습니다. 이 기능은 12 년 이래 C에 대한 유효한 표준 인 C99에 의해 도입되었습니다. AFAIK MSVC는 C99를 지원하지 않지만 C89 만 지원합니다.