[英]C Initialize Struct with a loop
下面有我正在編寫的程序中的結構代碼。 我希望能夠在某種循環中初始化這些參數,但似乎無法弄清楚如何配置.water
/ .air
/ .purge
屬性以通過循環進行更新。 nozzle_count
是16,所以我想找到一種方法來實現下面的代碼,而不必將其復制和粘貼16次。 我將不勝感激。 謝謝!
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
}
};
我能想到的唯一解決方法是:
const TYPE_OF_CxPURGE PURGE[] = {...};
const TYPE_OF_CxAIR AIR[] = {....};
const TYPE_OF_CxWATER WATER[] = {....};
在代碼中的某處
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個元素。 如果您還有更多內容,請編寫腳本以生成此初始化代碼
我認為即使數組的長度從5增加到16,您的代碼也可以正常顯示。兩種可能的建議。
如果刪除C99初始化絨毛,那么所有內容都可以放在一行中:
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:
#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 ),
// ...
};
您可以顯示*_WATER
, *_AIR
, *_PURGE
嗎?
for (i = 0; i < nozzle_count; i++)
{
nozzles[i] = (struct nozzle){WATER[i], AIR[i], PURGE[i], 15*60*1000, 0, 0, WAIT};
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.