我怎么能一次初始化一个数组,而不是一个接一个地做,这是乏味的,因为我需要初始化许多具有PWM占空比值的数组?
typedef struct
{
uint16_t *pointer;
uint16_t WELDx_Table[19];
} WELDx;
WELDx *weldx ;
int main(void )
{
weldx->pointer= &weldx->WELDx_Table[0];
weldx->pointer[0]=9;
weldx->pointer[1]=1;
"" "" "" ""
"" "" "" ""
weldx->pointer[17]=9;
weldx->pointer[18]='F';
}
谢谢,
不能初始化任何动态分配的内存。您只能在变量定义期间初始化它们。如果weld
是struct变量而不是指针,可以这样做:
WELDx weldx =
{
.WELDx_Table = {9, 1, 8, 2, ..., 9, 'F'},
.pointer = &weldx.Weldx_Table;
};
这种语法只适用于初始化,而不适用于之后给变量赋值。
你可以做的是创建一个复合文字并复制到合适的位置:
WELDx *weldx = malloc(sizeof (*weldx));
memcpy(weldx->WELDx_Table, &(uint16_t[19]){9, 1, 8, 2, ..., 9, 'F'}, sizeof(uint16_t[19]));
weldx->pointer = weldx->WELDx_Table;
我开始写答案,但很快意识到这些代码都没有多大意义。下面是代码回顾:
uint16_t *pointer;
是完全无用的,因为数组WELDx_Table
衰减成一个指针的地址,你想在表达式中使用时。WELDx *weldx;
需要在某处初始化,以指向已分配的数据。这是不清楚为什么你声明它作为一个指针开始。 我们很快意识到所有这些都是不必要的膨胀,你可以用一个普通数组
uint16_t WELDx_Table[19];
替换整个东西。该数组应该声明为const
,除非你计划在运行时更改它。一旦你清理了上面的代码,你就可以担心初始化了。
谢谢@Lundin,@Gerhardh的回答。首先,我还没有定义我为什么要使用结构体,我会详细说明,但请注意我的c,因为我是新手,肯定在努力学习更多。
Weld_Softstart.h
/*Sofstart variable*/
extern volatile uint16_t Softstart_1ms_Table[PULSE_NO];
extern volatile uint16_t *Softstart_1ms_Ptr_Last_elem;
extern volatile uint16_t *Softstart_1ms_Ptr;
extern volatile bool Welding_Proc_Init;
extern volatile u16 uS_cnt ;
/*MainPulse variable*/
extern volatile uint16_t MainPules_9ms_Table[];
我已经在我的Weld_Softstart.c中声明了这些文件,我想使用结构体,使它看起来更干净,我使用volatile,因为所有这些变量都在中断服务例程中使用,也声明了extern,因为我在多个。c文件中使用它们,我需要相同的实例。然后在一个函数中,我不断增加Softstart_1ms_Ptr,直到它达到Softstart_1ms_Ptr_Last_elem,这是我终止字符之前的一个元素,这就是使用指针的原因。最后,我没有将数组声明为const,因为我实际上减去了每个带有值的元素。现在我只是试图将其转换为struct
Interruptx_Handler.c
if( (*(Softstart_1ms_Ptr)) == (*(Softstart_1ms_Ptr_Last_elem)) ) // checking for last element , debug point.
{
__NOP();
}