2017-09-05 2 views
1

Ich liebe das nicht, aber ich habe eine Struktur mit fast 45 Mitgliedern darin; Alle sind Zeichen oder Zeichenfelder. Das heißt, ich muss die Art optimieren, wie ich jede Struktur initialisiere. Normalerweise würde ich das gesamte Objekt in meine init_struct() -Funktion übergeben, aber ich denke, das ist nicht der beste Weg, dies zu tun.Pointer von Structs an eine Funktion in C senden

Wie würde ich einen Zeiger auf die Struktur erstellen und verwenden, um dies zu erreichen?

alte Methode wie folgt aussehen würde:

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

int main(){ 
    struct general[10]; 

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

} 

Da diese Struktur so groß ist, wie gesagt fast 45 Mitglieder im Inneren, ich denke, ein Punkt auf die Struktur einen langen Weg bei der Optimierung dieser gehen würde verarbeiten. Wie würde ich das erreichen?


Für den Fall, Sie brauchen, hier ist die typedef für meine struct

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

lesen fast jede [gute Anfänger Buch] (http://stackoverflow.com/ Fragen/562303/the-definitive-c-Buch-Leitfaden-und-Liste). Sie sollten Kapitel zur Verwendung von Zeigern haben, einschließlich Zeigern zu Strukturen. –

+0

Siehe Antwort von SPlatten und notiere die Verwendung von Zeigern ('*') und die Adresse von ('&') Operatoren. Und lies das Buch. –

+1

Ihre alte Funktion, d. H. 'Void init_struct (struct general) {' ist falsch und kann nicht verwendet werden – 4386427

Antwort

0

einen Zeiger auf das Array-Element zu übergeben, Sie Präfix nur den Parameter mit &, stellen Sie sicher, dass Sie die Funktion deklarieren richtig:

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]); 
     } 
    } 

ich bin mir nicht sicher, warum Sie nicht die typedef verwendet haben ‚Hudl‘ Leben ein einfacher und Code leichter zu lesen verloren macht.

+0

Scheint mir, dass es eine 'typedef ' – 4386427

+0

Ja, gibt es, aber es wird nicht verwendet. – SPlatten

0

Ein etwas sauberer und besser Ansatz wäre eine Konstruktor- und Destruktor-Funktion, um Speicher dynamisch zu strukturieren und nach Gebrauch freizugeben.

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); 

} 

Möglicherweise benötigen Sie in Ihrem Fall eine Reihe von Zeigern. Also modifiziere deine main() entsprechend.

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

Sie können die nicht konstante lokale Variable num in der Array-Deklaration nicht verwenden. – SPlatten

+0

Das Beispiel wäre besser umgeschrieben mit einer Klasse anstelle einer Struktur. – SPlatten

+0

Ich wette, es wäre ... aber nur wenn wir Klasse in C haben. Danke für das Hinweis auf das andere Problem ... Ich habe die Variable geändert, um ein vordefinierter Wert zu sein. –

1

Es gibt ein paar Dinge, die mit Ihrem Code nicht in Ordnung sind. Erstens, Ihre Funktionsdefinition ist falsch, weil Sie den Parameternamen weglassen. Ihre Funktionsdefinition sollte wie folgt aussehen:

void init_struct(struct general mygeneralstruct){} 

Alternativ können Sie einen Aliasnamen für Ihre Struktur verwenden mit typedef, etwa so:

typedef struct { 
    int a; 
} general; 

In diesem Fall Ihre Funktionsdeklaration könnte wie folgt aussehen:

void init_struct(general mygeneralstruct){} 

Sie haben das gleiche Problem, wenn Sie Ihr Array von Strukturen deklarieren. Sie lassen den Namen Ihrer Variablen weg. Statt

struct general[10]; 

sollte es

struct general mygeneralstruct[10] 

oder general mygeneralstruct[10] (typedef)

Schließlich, können Sie nicht Ihre Array von Strukturen ändern, indem jeder Struktur der Wert an die Funktion übergeben. Sie müssen stattdessen die Adresse jeder Struktur übergeben. Ihre Funktionsdeklaration sollte dann (unter Verwendung von typedef):

void init_struct(general* mygeneralstruct){} 

und den Code in der Schleife:

init_struct(&mygeneralstruct[i]);