我怎樣才能一次初始化一個陣列而不是一個一個地初始化,這很乏味,因為我需要用 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';
}
謝謝 ,
uj5u.com熱心網友回復:
您不能初始化任何動態分配的記憶體。您只能在變數定義期間對其進行初始化。如果weld是一個結構變數而不是一個指標,你可以這樣做:
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;
uj5u.com熱心網友回復:
我開始寫答案,但很快意識到這段代碼沒有多大意義。所以這里是一個代碼審查:
uint16_t *pointer;完全沒用,因為WELDx_Table無論何時在運算式中使用該陣列都會衰減為具有您想要的地址的指標。WELDx *weldx;需要在某處初始化,以指向分配的資料。目前尚不清楚您為什么將其宣告為開頭的指標。- 我們很快意識到所有這些都是不必要的膨脹,你可以用一個普通的陣列替換整個東西
uint16_t WELDx_Table[19];。const除非您打算在運行時更改它,否則應該宣告該陣列。
清理完上述內容后,您可以擔心初始化。
uj5u.com熱心網友回復:
謝謝@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 因為我實際上是用一個值減去每個元素。.現在我只是想把它翻譯成一個結構
中斷處理程式.c
if( (*(Softstart_1ms_Ptr)) == (*(Softstart_1ms_Ptr_Last_elem)) ) // checking for last element , debug point.
{
__NOP();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/487785.html
下一篇:如何使用prinf()列印函式?
