首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C用循环初始化结构

C用循环初始化结构
EN

Stack Overflow用户
提问于 2018-07-23 22:59:13
回答 3查看 389关注 0票数 1

下面我在我正在编写的程序中有一个结构的代码。我希望能够在某种循环中初始化这些参数,但我似乎不知道如何配置.water/.air/.purge属性以使用循环进行更新。nozzle_count是16岁,所以我想找到一种方法来实现下面的代码,而不需要复制和粘贴它16次。如有任何意见,我将不胜感激。谢谢!

代码语言:javascript
复制
static nozzle nozzles[nozzle_count] = {
    {
        .water = C1_WATER, .air = C1_AIR, .purge = C1_PURGE,
        .interval = 15*60*1000, .cycle = 0*3*5*1000, .purge_length = 0*4*1000,
        .state = WAIT
    },
    {
        .water = C2_WATER, .air = C2_AIR, .purge = C2_PURGE,
        .interval = 2*60*1000, .cycle = 1*3*1000, .purge_length = 0*4*1000,
        .state = WAIT
    },
    {
        .water = C3_WATER, .air = C3_AIR, .purge = C3_PURGE,
        .interval = 2*60*1000, .cycle = 0*1*5*1000, .purge_length = 0*4*1000,
        .state = WAIT
    }
    {
        .water = C4_WATER, .air = C4_AIR, .purge = C4_PURGE,
        .interval = 2*60*1000, .cycle = 0*1*5*1000, .purge_length = 0*4*1000,
        .state = WAIT
    }
    {
        .water = C5_WATER, .air = C5_AIR, .purge = C5_PURGE,
        .interval = 2*60*1000, .cycle = 0*1*5*1000, .purge_length = 0*4*1000,
        .state = WAIT
    }
};
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-23 23:36:51

我认为您的代码看起来非常好,即使数组的长度从5增加到16。有两个可能的建议。

如果您删除了C99初始化的绒毛,那么所有内容都可以放在一行中:

代码语言:javascript
复制
static nozzle nozzles[nozzle_count] = {
//    water     air     purge     interval    cycle       purge_length state
//    --------  ------  --------  ----------  ----------  ------------ ----
    { C1_WATER, C1_AIR, C1_PURGE, 15*60*1000, 0*3*5*1000, 0*4*1000,    WAIT },
//  ...
};

这是一个简单的表,只有16行长,这是清楚和明显的,而且易于维护。

其次,如果您需要保持每个成员的初始化,您可以将其括在一个宏中,这有助于实现DRY:

代码语言:javascript
复制
#define FOO(a, b, c, d, e, f, g)                                 \
    {                                                            \
       .water = (a), .air = (b), .purge = (c),                   \
       .interval = (d), .cycle = (e),  .purge_length = (f),      \
       .state = (b)                                              \
    }

static nozzle nozzles[nozzle_count] = {
//    water     air     purge     interval    cycle       purge_length state
//    --------  ------  --------  ----------  ----------  ------------ ----
 FOO( C1_WATER, C1_AIR, C1_PURGE, 15*60*1000, 0*3*5*1000, 0*4*1000,    WAIT ),
//  ...
};
票数 1
EN

Stack Overflow用户

发布于 2018-07-23 23:23:54

我唯一能想到的解决办法是:

代码语言:javascript
复制
const TYPE_OF_CxPURGE PURGE[] = {...};
const TYPE_OF_CxAIR AIR[] = {....};
const TYPE_OF_CxWATER WATER[] = {....};

在代码的某个地方

代码语言:javascript
复制
for(size_t index = 0; index < sizeof(nozzles) / sizeof(nozzles[0]); index ++)
{
    nozzles.water = WATER[index];
    nozzles.air = AIR[index]; 
    nozzles.purge = PURGE[index];
    nozzles.interval = 15*60*1000; 
    nozzles.cycle = 0*3*5*1000; 
    nozzles.purge_length = 0*4*1000,
    nozzles.state = WAIT
}

但我认为正常的初始化更好。只有16个元素。如果您有更多的内容,只需编写脚本来生成此初始化代码。

票数 1
EN

Stack Overflow用户

发布于 2018-07-24 02:08:29

你能给出*_WATER*_AIR*_PURGE的定义吗?

代码语言:javascript
复制
for (i = 0; i < nozzle_count; i++)
{
    nozzles[i] = (struct nozzle){WATER[i], AIR[i], PURGE[i], 15*60*1000, 0, 0, WAIT};
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51488245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档