【问题标题】:Designated dynamic array initialization指定动态数组初始化
【发布时间】:2011-04-06 09:04:14
【问题描述】:

我需要找到一个解决方案来创建一个数组并在声明期间对数组进行指定的初始化。

以下代码在 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 的指针,并且它具有作为索引,是的,进程名称定义,P_procX。

不可能依赖 p_queue_table 中的条目顺序与定义的 P_XXX 进程名称的顺序完全相同。如果是,那我就不需要指定初始化表了。一种解决方案是只声明 p_queue_table 数组,然后稍后在函数中对其进行初始化,但这不是我们想要的。

必须可以扩展/创建宏以在创建表时进行表的初始化,即使需要创建另一个可以排序并稍后用于初始化 p_queue_table 的表,例如 procs[] [3] 用 {{proc3, 1, 2}, {proc2, 1, 2}, ...} 初始化。

有人能解答这个问题吗?

【问题讨论】:

  • AFAIKS 这是一个有效的策略。只是你没有解释 MSVC 不喜欢什么。
  • 嗨,詹斯。抱歉,我忘了把它放进去。MSVC 抱怨宏 =>“错误 C2059:语法错误:'['”中的 '[' 的语法错误。当我删除'[P_##PROC + INST - 1] ='时,MSVC很高兴,但是我有指向错误位置的指针,因为p_queue_table中的条目没有按正确的进程顺序排序,这将是表中的索引。 P_proc1 是定义的。为 0,但 p_queue_table[0][0] 保存指向 P_proc3 实例 1 的指针,而 p_queue_table[0][1] 保存指向 P_proc3 实例 2 的指针。

标签: c arrays initialization


【解决方案1】:

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

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

用于数组元素。此功能是由 C99 引入的,C99 是自 12 年以来的 C 有效标准。 AFAIK MSVC 不支持 C99,仅支持 C89。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    相关资源
    最近更新 更多