C

时间:2018-07-09 08:37:59

标签: c

考虑以下语句

typedef struct {
    int member1;
    int member2;
}Custom_t;

void ISR(void) 
{
    static Custom_t struct1[SOME_CONSTANT];
    ......
    ......
}

如何在C编程中将所有member2变量初始化为单个值?

如果我使用如下所示的结构,那么有人可能会更改头文件中的“ SOME_CONSTANT”而忘记更新列表。

另一种解决方案是为结构提供当前文件的全局作用域。但是使用该结构的唯一函数是ISR()。

void ISR(void) 
{
    static Custom_t struct1[SOME_CONSTANT] = {
        {0, 3},
        {0, 3},
        ......
        ......
    };
    ......
    ......
}

有什么方法可以解决C语言中的这个问题?

4 个答案:

答案 0 :(得分:1)

如何在.c文件中(例如,在初始化程序之前)添加针对webpack.config.js的硬编码编译时间检查?

SOME_CONSTANT

使用这种“硬代码”的理由是,每当更改#if SOME_CONSTANT != <some_hard_code_value> #error "SOME_CONSTANT is not equal to <some_hard_code_value>" #endif 时,都需要更新初始化程序以及检查编译时间。

答案 1 :(得分:1)

您无需预先指定数组大小,以后可以进行计算:


static Custom_t struct1[] = {
        {0, 3},
        {0, 3},
        {13,3},
    };
#define SOME_CONSTANT (sizeof struct1 /sizeof struct1[0])

或:使用__LINE__计算元素数。

答案 2 :(得分:1)

您可以使用指定的初始化器并以此方式进行操作:

#include <stdio.h>

#define SOME_CONSTANT 30

typedef struct {
    int member1;
    int member2;
} Custom_t;

int main(void)
{
    static Custom_t struct1[SOME_CONSTANT] = 
    {
        [0 ... SOME_CONSTANT - 1].member2 = 30
    };


    printf("%d\n", struct1[25].member2);
    printf("%d\n", struct1[19].member2);
    printf("%d\n", struct1[0].member2);

    return 0;
}

答案 3 :(得分:0)

我必须对具有可配置数量的传感器的项目执行类似的操作:

[custom_t.h]

typedef struct {
    int member1;
    int member2;
}Custom_t;

#define MAX_CUSTOM_T 4

Custom_t *new_Custom_t (int member1, int member2);

[custom_t.c]

#include "custom_t.h"

static Custom_t g_Customt[MAX_CUSTOM_T];
static uint8 g_numCustom_t = 0;

Custom_t *new_Custom_t (int member1, int member2)
{
    if ( g_numCustom_t < MAX_CUSTOM_T )
    {
       Custom_t *new_obj = &g_Customt[g_numCustom_t++];
       new_obj->member1 = member1;
       new_obj->member1 = member2;

       return new_obj;
    }
    else
    {
        // throw exception?
        // or go into while(1)?
        // or software breakpoint if debug?
        // or just...
        return NULL;
    }
}

[main.c]

#include "custom_t.h"

Custom_t *myCustom1; 
Custom_t *myCustom2; 
Custom_t *myCustom3; 

somefunc()
{
    myCustom1 = new_Custom_t (0,3);
    myCustom2 = new_Custom_t (1,3);
    myCustom3 = new_Custom_t (2,3);

   // do stuff
}

这意味着如果要创建一个新的,则可能已经或可能不需要根据其大小更新MAX_CUSTOM_T,而只需要向new_Custom_t(int,int)添加一个新的行调用即可。缺点是,它对于您可能需要的内容来说有点复杂,并且如果您想添加更多的成员进行初始化,则需要更新传递给new_函数的参数以适应需要。可以通过发送一个单独的参数结构而不是多个参数(有点像MPLAB和声)来完成。