Forum: Mikrocontroller und Digitale Elektronik Welchen Sinn hat "typedef struct"


von Dirk F. (dirkf)


Lesenswert?

Hallo,
aus einem Beispielcode wird folgender code verwendet:
1
---------------------------------
2
typedef struct
3
{
4
    CLK_STATES clkstate;   // the current state
5
    int idlecnt;   // counts the number of times in the CLKS_STATE_IDLE
6
    unsigned int cpucycles;  // records the CPU cycles every second
7
    unsigned int last_CP0;  // the last core timer count
8
    int idlecntpersec;      // the idle count at the end of every second
9
} CLKDATA;
10
------------------------------------
11
CLKDATA clkData;
12
-----------------------------------
13
void CLKS_Initialize ( void )
14
{    
15
    clkData.cpucycles = 0;
16
    clkData.last_CP0 = 0;
17
    clkData.idlecnt = 0;
18
    clkData.idlecntpersec = 0;
19
    clkData.clkstate = CLKS_STATE_INIT;     
20
}
21
-------------------------------------

Frage: Welchen Vorteil bietet so etwas ?
Warum nicht einfach normale Varriablennamen verwenden ?
z.B.:
cpucycles = 0;
last_CP0 = 0;

[Mod: C-Code nachträglich formatiert]

: Bearbeitet durch Moderator
von Harald K. (kirnbichler)


Lesenswert?

Eine Struktur dient dazu, mehrere funktional zusammengehörende Variablen 
zusammenzufassen.

Das ist schon dann sinnvoll, wenn man diese Variablen einer Funktion 
übergeben möchte:

1
typedef struct
2
{
3
    CLK_STATES clkstate;
4
    int idlecnt;
5
    unsigned int cpucycles; 
6
    unsigned int last_CP0; 
7
    int idlecntpersec;  
8
} CLKDATA;
9
10
// a: 
11
12
void meine_funktion_a(CLK_STATES clkstate, int idlecnt, unsigned int cpucycles, unsigned int last_CP0, int idlecntpersec);
13
14
// b:
15
16
void meine_funktion_b(CLKDATA clkdata);

Du siehst, daß die Parameterliste von meine_funktion_a unanständig lang 
wird.


Das ganze geht übrigend auch ohne typedef:
1
struct CLKDATA
2
{
3
    CLK_STATES clkstate;
4
    int idlecnt;
5
    unsigned int cpucycles; 
6
    unsigned int last_CP0; 
7
    int idlecntpersec;  
8
};
9
10
// a: 
11
12
void meine_funktion_a(CLK_STATES clkstate, int idlecnt, unsigned int cpucycles, unsigned int last_CP0, int idlecntpersec);
13
14
// b:
15
16
void meine_funktion_b(struct CLKDATA clkdata);

Durch das typedef spart man sich das Hinschreiben des Schlüsselworts 
"struct" und man kann die Typdefinition syntaktisch genauso verwenden, 
wie einen anderen Datentyp.


Du plenkst.

von (prx) A. K. (prx)


Lesenswert?

Dirk F. schrieb:
> Welchen Vorteil bietet so etwas ?

Stell dir vor, die Kiste hätte 2 CPUs:
CLKDATA clkData[2];

: Bearbeitet durch User
von Markus F. (mfro)


Lesenswert?

1
typedef struct { 
2
...
3
} struct_typ;
4
struct_typ s;
5
s x;

Ist die Verbandelung einer Strukturdeklaration mit einem typedef und hat 
erst mal keinen Vorteil (ausser dass man sich u.U. ein wenig Tipparbeit 
spart, wenn man diesen Typ oft benutzt), weil man genauso gut auch
1
struct s
2
{
3
...
4
};
5
struct s x;
schreiben kann. Ich persönlich sehe keinen wirklich sinnvollen Grund, 
warum man für jede struct ein "typedef" erfinden müsste.

von Harald K. (kirnbichler)


Lesenswert?

Markus F. schrieb:
> Ich persönlich sehe keinen wirklich sinnvollen Grund,
> warum man für jede struct ein "typedef" erfinden müsste.

Man spart sich das Schlüsselwort "struct" beim Gebrauch, und syntaktisch 
sieht das ganze so aus wie jeder beliebige andere Typ. Das ist also im 
wesentlichen eine Kombination aus Bequemlichkeit und Kosmetik.

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

Dirk F. schrieb:
> Frage: Welchen Vorteil bietet so etwas ?

Stell dir vor du hast 2 Sätze solcher Variablen. Oder du willst eine 
solche Struktur an eine Funktion übergeben (bzw. ein Pointer darauf).

von Markus F. (mfro)


Lesenswert?

Harald K. schrieb:
> syntaktisch
> sieht das ganze so aus wie jeder beliebige andere Typ

Genau. Und warum sollte das so aussehen? Ich finde es gut, wenn man 
einer Struktur sofort ansieht, dass sie eine Struktur ist. Genauso mache 
ich das auch mit unions und enums.

Aber das ist zum grossen Teil natürlich Geschmackssache.

von Dirk F. (dirkf)


Lesenswert?

OK  Danke euch.
Also ich brauchs in meinem Fall nicht....

von Benedikt M. (bmuessig)


Lesenswert?

Die Verwendung eines Structs eröffnet darüber hinaus einen neuen 
Namensraum für die enthaltenen Felder.

So werden die Felder, die zu CLKDATA gehören sauber abgekapselt und 
überschneiden sich global nicht namentlich.
1
struct CLKDATA
2
{
3
    CLK_STATES clkstate;
4
    int idlecnt;
5
    unsigned int cpucycles;
6
    unsigned int last_CP0;
7
    int idlecntpersec;
8
};
9
10
uint8_t clkstate;

von Xanthippos (xanthippos)


Lesenswert?

> Also ich brauchs in meinem Fall nicht....

Du wirst es erst brauchen, wenn du mit einem dutzend Kollegen größere 
Programme entwickelst. Bei 100 Quelltexten, willst du nicht mehr die 
100000 einzelnen Variablen kennen. Das wird viel zu aufwendig.

Der eine Kollege schreibt das CLKS_Initialize(), der andere den 
Hardware-Abstraction-Layer. Und du willst das einfach nur benutzen, 
willst dich nicht mehr um die 1000 internen Details kümmern.

von Dirk F. (dirkf)


Lesenswert?

Ja stimmt.

von Oliver S. (oliverso)


Lesenswert?

Xanthippos schrieb:
>> Also ich brauchs in meinem Fall nicht....
>
> Du wirst es erst brauchen, wenn du mit einem dutzend Kollegen größere
> Programme entwickelst

Oder auch andere, oder überhaupt welche, bei denen man das einfach sehr 
sinnvoll nutzen kann.

Auf einem kleinen Mikrocontroller mag es auch ohne gehen, im richtigen 
Leben nicht.

Oliver

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.