2016-08-09 159 views
3

Ich habe eine Struktur „Register“ Passing erklärt wie folgt aus:ein Array einer Struktur zwischen den Funktionen

typedef struct { 
    int TypeID; 
    unsigned char InstrumentType[128]; 
    unsigned char RegTag[128]; 
    unsigned char Protocol[128]; 
    int RegNum; 
    unsigned char RW[128]; 
    unsigned char RegisterType[128]; 
    unsigned char Signed[128]; 
    unsigned char Inverted[128]; 
    unsigned char DataType[128]; 
    int Counts; 
} Register; 

Ich habe ein Array von Register namens „Reg [9]“ und wollen eine Funktion erstellen, genannt ' TransferValues ​​', um allen Feldern in der Struktur für jedes Element des Arrays Werte zuzuweisen. Sobald die Werte aktualisiert sind, werden sie einzeln in main() ausgegeben. Wie kann ich das Array zu und von dieser Funktion übergeben?

+0

'void yourFunc (Registrieren * param1) .... int main (void) {Registrieren Reg [9]; yourFunc (Reg);} ' – LPs

+0

würde das seine neuen Werte einmal an main zurückgegeben? Ich würde nichts am Ende von 'yourFunc' zurückgeben müssen? – Mst137

+1

Ja, die Daten, auf die der Zeiger zeigt, verschwinden nicht, wenn die Funktion zurückkehrt. –

Antwort

3

In Arrays Zerfall-pointer wenn funktionieren geben, so dass Sie einfach die Funktion, indem Sie Ihre Array aufrufen können, und das ist es.

Kleines Beispiel einen Zeiger mit:

#include <stdio.h> 
#include <string.h> 
#include <stdint.h> 
#include <inttypes.h> 

typedef struct { 
    int32_t TypeID; 
    char InstrumentType[128]; 
} Register; 


void func (Register *reg, size_t n_regs) 
{ 
    for (size_t i=0; i< n_regs; i++) 
    { 
     reg[i].TypeID = (int32_t)(i); 
     sprintf(reg[i].InstrumentType, "Instrument_%zu", i); 
    } 
} 

int main (void) 
{ 
    Register Reg[9] = {{0}}; 

    func(Reg, sizeof(Reg)/sizeof(Reg[0])); 

    for (size_t i=0; i<sizeof(Reg)/sizeof(Reg[0]); i++) 
    { 
     printf ("Reg[%zu].TypeID = %"PRId32"\n", i, Reg[i].TypeID); 
     printf ("Reg[%zu].InstrumentType = %s\n", i, Reg[i].InstrumentType); 
    } 
} 

Wie Sie Sie auch Sie gehen, um die Größe der übergebenen Array schreiben, um sicherzustellen, dass passieren sehen kann, sollte nicht außerhalb der Grenzen der übergebenen Array an die Funktion gehen .

4

Sie passieren Reg in dieser Funktion mit der Syntax TransferValues(Reg);

Die Funktion der Form

/*return type*/ TransferValues(Register* array)

(In der Funktionskörper sein wird, können Sie array[i] anstelle von *(array + i) verwenden, wo i ist ein gültiger Index des Arrays, der besser lesbar sein kann.)

In C, Arrays Zerfall zu Zeigern, wenn sie an Funktionen übergeben werden. Beachten Sie, dass Sie möglicherweise auch die Anzahl der Elemente im Array an die Funktion übergeben möchten.

+0

Nit: Ich finde, dass die Benennung des Zeigers 'array'" * 'array' *" irreführend ist, weil es kein Array, sondern ein Zeiger ist. – alk

3

Arrays verfallen auf natürliche Weise zu Zeigern auf ihr erstes Element. Wenn Sie ein Array verwenden, verwenden Sie tatsächlich einen Zeiger.

Die Lösung besteht also einfach darin, dass die Funktion einen Zeiger auf die Struktur als Argument akzeptiert. Es wäre auch hilfreich, der Funktion die Anzahl der Elemente zur Verfügung zu stellen, wenn sie nicht vorher festgelegt und bekannt ist.

Es ist wichtig zu wissen, dass für den Funktionstyp eine Array-ähnliche Erklärung mit, wie

void TransferValues(Register regs[9]) 

oder

void TransferValues(Register regs[]) 

ist eigentlich regs als Array nicht erklären, leise der Compiler konvertiert regs zu einem Zeiger (Register *regs). Dies hat Auswirkungen, wenn Sie versuchen, den sizeof Trick zu verwenden, um die Anzahl der Elemente im Array zu erhalten.

Für eine tatsächliche Anordnung, wie

Register regs[9] 

können Sie sizeof(regs)/sizeof(regs[0]) verwenden, um die Anzahl der Elemente im Array zu erhalten. Dies funktioniert nicht in einer Funktion als alles, was Sie haben, ist ein Zeiger, und sizeof auf einen Zeiger geben Sie die Größe des tatsächlichen Zeigers und nicht die Daten, auf die es zeigt.