배열을 만들고 선언 중에 배열 초기화를 지정하는 솔루션을 찾아야합니다.지정된 동적 배열 초기화
다음 코드는 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}, ...}로 초기화됩니다.
누구나이 문제에 대한 답변을 제공합니까?
AFAIKS 이것은 유효한 전략입니다. MSVC가 뭘 좋아하지 않는지 설명하지 않았다. –
안녕하세요 옌스입니다. 죄송합니다, 그걸 잊어 버렸습니다. 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에 대한 포인터를 보유합니다. –