2017-09-05 113 views
1

我不喜歡這個,但是我有一個結構裏面有近45個成員;全部是字符或字符數組。這就是說,我將需要優化我初始化每個結構的方式。通常,我會將整個對象傳遞到我的init_struct()函數中,但是我覺得這不是實現此目的的最佳方式。發送結構指針到函數C

我將如何創建並使用指向結構體的指針來完成此操作?

舊方法會是這個樣子:

void init_struct(struct general){ 
...initialize members... 
} 

int main(){ 
    struct general[10]; 

    for(int i = 0 ; i < 10 ; ++i){ 
    init_struct(general[i]; 
    } 

} 

由於這個結構是如此之大,就像我說的裏面將近45個成員,我認爲一個指向結構會很長的路要走優化這個處理。我將如何實現這一目標?


只需在您需要的情況下,這裏是我的結構typedef的

typedef struct 
{ 
    //Basically, everything we want to read from HUDL should be here... 
    int play_num; 
    char down; 
    char dist[3]; 
    char ydln[4]; 
    char gnls[3]; 
    char hash[3]; 
    char home[20]; 
    char away[20]; 
    char odk[2]; 
    char qtr[2]; 
    char series[3]; 
    char result[20]; 
    char penalty[20]; 

    char act_cb[20]; //How do they act post-snap 
    char act_dl[20]; 
    char act_lb[20]; 
    char act_ol[20]; 
    char act_qb[20]; 
    char act_rb[20]; 
    char act_saf[20]; 

    char aln_cb[20]; //How do they align pre-snap 
    char aln_dl[20]; 
    char aln_lb[20]; 
    char aln_ol[20]; 
    char aln_qb[20]; 
    char aln_rb[20]; 
    char aln_saf[20]; 
    char aln_wr[20]; 

    char blitz[20]; 
    char box_cnt[3]; 
    char saf_count[20]; 
    char coverage[20]; 
    char cvr_basic[20]; 
    char def_front[20]; 
    char mtn_def[20]; 
    char num_rush[3]; 

    char off_form[20]; 
    char form_var[20]; 
    char motion[20]; 
    char off_pro[20]; 
    char off_play[20]; 
    char play_var[20]; 
    char personnel[20]; 
    char play_type[20]; 


    char time[2]; 
    char score_diff[4]; 
    char field_zone[2]; 
    char dd_type[2]; 
    char form_strength[2]; 

} HUDL; // MAXIMUM of 63 Members 
+2

閱讀幾乎任何[好初學者的書(http://stackoverflow.com/問題/ 562303 /對,最終-C-書指南和列表)。他們應該有關於如何使用指針的章節,包括指向結構的指針。 –

+0

請參閱SPlatten的答案,並注意(&)運算符的指針('*')和地址的用法。並閱讀本書。 –

+1

您的舊函數,即'void init_struct(struct general){'是錯誤的,不能是使用的那個 – 4386427

回答

0

要傳遞的一個指針數組元素,你只是前綴&參數,請確保您聲明函數正確:

void init_struct(HUDL* pGeneral){ 
     if (pGeneral != NULL) { 
    //This will ensure the entire structure contains '0' 
      memset(pGeneral, 0, sizeof(HUDL)); 
    ...initialize members... 
     } 
    } 

    int main(){ 
     HUDL general[10]; 

     for(int i=0; i<(sizeof(general)/sizeof(general[0])); i++) { 
      init_struct(&general[i]); 
     } 
    } 

我不知道爲什麼你還沒有使用的typedef「HUDL」讓生活更容易丟失和代碼更易於閱讀。

+0

在我看來,有'typedef' – 4386427

+0

是的,有,但它沒有被使用。 – SPlatten

0

稍微更清潔和更好的方法是使用構造函數和析構函數來動態分配內存以在使用之後對其進行構造和釋放。

static void HUDL_destroy(HUDL* ptr) 
{ 
    if(ptr) 
    { 
    //...any other clean up that needs to be done goes here.. 
    free(ptr); 
    } 
} 

static HUDL* HUDL_create() 
{ 
    HUDL* ptr = malloc(sizeof(HUDL)); 

    if(!ptr) 
    return NULL; 

    //do initialization bits... 
    init_struct(ptr); 

    return ptr; 
} 

int main() 
{ 
    //allocate and initialise structure 
    HUDL *general = HUDL_create(); 

    //do stuff... 

    //free structure after use 
    HUDL_destroy(general); 

} 

你可能需要一個指針數組。所以相應地修改你的main()。

int main() 
{ 
    //we need an array of structure pointers 
    HUDL* general[SIZE]; 

    //allocate and initialize structure 
    for(int i=0; i<SIZE; i++) 
    general[i] = HUDL_create(); 

    //do stuff... 

    //free structure after use 
    for(i=0; i<SIZE; i++) 
    HUDL_destroy(general[i]); 
} 
+0

您不能在數組聲明中使用非const局部變量num。 – SPlatten

+0

使用類而不是結構可以更好地重寫該示例。 – SPlatten

+0

我敢打賭,這將是......但只有當我們在C班上課。感謝您指出另一個問題......我已將變量更改爲預定義值。 –

1

你的代碼有一些錯誤。 首先,你的函數定義是錯誤的,因爲你省略了參數名稱。你的函數定義應該是這樣的:

void init_struct(struct general mygeneralstruct){} 

或者,你可以使用的typedef使用你的結構的別名,就像這樣:

typedef struct { 
    int a; 
} general; 

在這種情況下,你的函數聲明看起來是這樣的:

void init_struct(general mygeneralstruct){} 

當你聲明你的結構數組時,你有同樣的問題。您省略了變量的名稱。取而代之的

struct general[10]; 

應該

struct general mygeneralstruct[10] 

general mygeneralstruct[10](類型定義)

最後,你不能每個結構的值傳遞給函數更改結構的陣列。您需要傳遞每個結構的地址。 你的函數聲明應該是,然後(使用類型定義):

void init_struct(general* mygeneralstruct){} 

,並在循環的代碼:

init_struct(&mygeneralstruct[i]);