2011-04-06 77 views
0

我需要找到一個解決方案來創建一個數組,並在聲明過程中指定數組的初始化。指定的動態數組初始化

以下代碼在ARM11 C編譯器下工作,但一如既往,它在MSVC編譯器下不起作用。我試圖在Win32下創建一個單元測試來測試嵌入式軟件,然後再將它交付給客戶。

代碼看起來像如下:

/* 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中,用於進程的不同實例,並且具有索引,是,進程名稱爲def。,P_procX。

無法依賴p_queue_table中的條目順序與定義P_XXX流程名稱的順序完全相同。如果是這樣,那麼我不需要指定表的初始化。一種解決方法是隻聲明p_queue_table數組,然後在函數中初始化它,但這不是我們想要的。

在創建表時,必須可以擴展/創建宏以執行表的初始化,即使需要創建另一個表,可以對其進行排序並稍後用於初始化p_queue_table,ex procs [ ] [3],它用{{proc3,1,2},{proc2,1,2},...}初始化。

有沒有人有這個問題的答案?

+0

AFAIKS這是一個有效的策略。只是你沒有解釋MSVC不喜歡什麼。 – 2011-04-06 14:00:33

+0

你好Jens。對不起,我忘了把它放進去。MSVC抱怨'['在宏=>「錯誤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的指針。 – 2011-04-08 14:20:21

回答

1

您正在使用的指定初始化功能

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

的數組元素。該功能是C99自12年以來C的有效標準引入的。 AFAIK MSVC不支持C99,但僅支持C89。