考虑以下语句
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语言中的这个问题?
答案 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和声)来完成。