Forum: Mikrocontroller und Digitale Elektronik Unterschied Deklaration von struct in Atmel Sudio


von Tom (Gast)


Lesenswert?

Hi.

Ich möchte gerne eine Struktur für meine Werteaufname eines PCINT 
nutzen.
Jetzt frage ich mich, was genau "Data" und "Sensordata..." bei der 
Struktur macht.
Ich habe bisher mit Strukturen nie programmiert, möchte aber lernen ;)
1
struct Data
2
  {
3
    uint8_t samplenr;
4
    uint16_t temptime;
5
    uint16_t risetime[ANZ_DIG_SAMPLES];
6
    uint8_t old_pinstate;    
7
  }Sensordata[ANZ_DIG_SENSOREN];

Wenn ich die Struktur nun mit "data." anspreche bekomme ich die 
Einzelnen Elemente davon.
Ich kann das Ganze aber auch mit "Sensordata[0]->" ansprechen.

Ich finde im Internet aber irgendwie keine gute Erklärung für was der 
erste und letzte Ausdruck genau ist.

Kann ich auch einfach das "Sensordata[..." statt dem "Data" an den 
Anfang schreiben und gut ist?

Evtl. kann mir jemand verständlich einmal den Zusammenhang erklären :)

Danke Euch,
Tom

von Tom (Gast)


Lesenswert?

Mist.
Admin, bitte Thread ins GCC-Forum rüber schubsen.
Mein Fehler!

Danke!

von Juergen G. (jup)


Lesenswert?

Das ist die Definition der Struktur und einer Variablen in einem Rutsch.

Der erste Teil bis zum   }    definiert die Mitglieder der Struktur.
Wobei das Mitglied risetime ein Array ist.
danach wird die Variable  Sensordata[ANZ_DIG_SENSOREN];

also ein Array vom Typ der Strutur mit ANZ_DIG_SENSOREN  Elementen 
definiert.

Auf die einzelnen Mitglieder kan man dann mit

Sensordata[Index].samplenr
Sensordata[Index].temptime
Sensordata[Index].risetime[anderer_index]
...

zugreifen.

Ju

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Zwei Dinge in Kombination.

Statt
1
struct Data
2
  {
3
    uint8_t samplenr;
4
    uint16_t temptime;
5
    uint16_t risetime[ANZ_DIG_SAMPLES];
6
    uint8_t old_pinstate;    
7
  }Sensordata[ANZ_DIG_SENSOREN];

kannst Du auch
1
struct Data
2
  {
3
    uint8_t samplenr;
4
    uint16_t temptime;
5
    uint16_t risetime[ANZ_DIG_SAMPLES];
6
    uint8_t old_pinstate;    
7
  };
8
9
struct Data Sensordata[ANZ_DIG_SENSOREN];

schreiben.

Der erste Teil deklariert struct Data. Das kann fortan als 
Variablentyp verwendet werden. Nicht Data alleine, sondern immer in 
der Kombination mit struct davor.

Der zweite Teil nutzt diesen Variablentyp und definiert ein Array aus 
Variablen dieses Typs.


Die getrennte Schreibweise ist wichtig, wenn man beispielsweise mit 
Headerdateien arbeiten möchte, da gehört der erste, aber nicht der 
zweite Teil rein, da Variablendefinitionen nicht in Headerdateien 
stattzufinden haben.

von Oliver (Gast)


Lesenswert?

Tom schrieb:
> Wenn ich die Struktur nun mit "data." anspreche bekomme ich die
> Einzelnen Elemente davon.

Kannst du nicht. Auch nicht mit "Data." ;)

Tom schrieb:
> Ich kann das Ganze aber auch mit "Sensordata[0]->" ansprechen.

Kannst du zwar versuchen, das compiliert aber nicht.
In dem Fall einzig richtig ist "Sensordata[0]."

Das alles (und noch viel mehr) erklärt aber jedes gute C-Buch in den 
Kapiteln zu Array, Structs, und Pointern (da kommt dann auch dein 
Operator "->" zur Sprache).

Online gibt es sows z.B. hier:
http://openbook.galileocomputing.de/c_von_a_bis_z/

Oliver

von Tom (Gast)


Lesenswert?

@Juergen: Danke für die Erklärung! Dann wäre meine gewollte 
"Anspechbarkeit" der Struktur ja schon mal richtig gewesen, freut mich. 
Nur die interne Definition der Variable hat mich ganz schön verwirrt :)

@Rufus: Super Erklärung! Danke Dir auch! Jetzt habe ich es begriffen.
Da ich mit einigen Header-Files hier programmiert habe und die Struktur 
global volatile sein soll, macht ja auch nur die getrennte Schreibweise 
Sinn.
Ist mir aber auch lieber, ich hasse so extrem ineinander verschachtelte 
Argumenten-Klumpen bei denen man nach zwei Jahren selber nicht mehr 
durch blickt :)
Gewöhn ich mir direkt die getrennte Schreibweise an und fertig.

Euch noch nen schönen Arbeitstag!
Tom

von Tom (Gast)


Lesenswert?

Hi Oliver.

Atmel Studio gibt mir die internen Elemente der Struct halt als Popup 
zurück wenn ich "Data." oder "Sensordata[0]->" eingebe.
Compiliert hatte ich das Ganze noch nicht da ich mir ja an der Stelle 
mit der Handhabung noch nicht sicher war.

Danke Dir für den Link, ich schau mal in dem Kapitel was es mit dem -> 
so auf sich hat.

Cu.

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.