2017-09-05 115 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]);