www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit Struct


Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich möchte gern ein Struct erzeugen:
in meiner main.c:
volatile struct
{
  uint16_t ist;
  uint16_t soll;
  uint16_t max;
} U_Bat;  
und in meiner main.h:
extern volatile struct U_Bat_t;

ich bekomme aber die Warnung:

../main.h:9: warning: useless storage class specifier in empty 
declaration


aber es funktioniert.

Jetzt wüsste ich gern warum die Warnung auftaucht.


Danke
Jens

Autor: jemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du kannst ein struct nicht volatile machen.
struct
{
  uint16_t ist;
  uint16_t soll;
  uint16_t max;
} U_Bat;

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
U_Bat
U_Bat_t

Preisfrage: Wo ist der Unterschied?

Oliver

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver schrieb:
> U_Bat
> U_Bat_t
>
> Preisfrage: Wo ist der Unterschied?
>
> Oliver

Ich weiss es leider nicht und mein C-Buch schweigt sich darüber auch aus 
:-(

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier:

Jens schrieb:
> } U_Bat;

und hier:

Jens schrieb:
> extern volatile struct U_Bat_t;

!

Autor: ikarus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver schrieb:
> U_Bat
> U_Bat_t
>
> Preisfrage: Wo ist der Unterschied?
Das er (Jens) falsch abgetippt hat?

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab ich leider falsh abgetippt, richtig.

So habe ich leider immer noch die fehlermeldung:

in main.c
struct
{
  uint16_t ist;
  uint16_t soll;
  uint16_t max;
}U_Bat;  

in main.h
extern volatile struct U_Bat;

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry, ich habe eine Warnung, siehe oben

Autor: ikarus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> sorry, ich habe eine Warnung, siehe oben
Siehe Beitrag "Re: Probleme mit Struct"

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne Volatile bleibt die Warnung trotzdem

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:

> So habe ich leider immer noch die fehlermeldung:

Du bist auf etwas herein gefallen.
Nämlich das es in C erlaubt ist einen namenlosen struct zu erzeugen.

Das hier

>
> extern volatile struct U_Bat;
> 

geht so nicht.
Denn das U_Bat steht hier syntaktisch an einer Stelle an der der Name 
der struct erwartet wird und nicht der Name einer Variablen.

Hier aber
struct
{
  uint16_t ist;
  uint16_t soll;
  uint16_t max;
} U_Bat;

steht das U_Bat syntaktisch an der Stelle an der der Name eines 
Variablen vergeben werden kann, die vom vorangegangenen Datentyp ist.

Das ist also so zu lesen
struct                   // so sieht die Struktur aus
{                        // das ist die Beschreibung
  uint16_t ist;          // ihres Aufbaus
  uint16_t soll;
  uint16_t max;
}

   U_Bat;                // und hier wird eine Variable definiert
                         // die genau diese Aufbau hat

Aber: Die struct selber, also die Beschreibung des Aufbaus hat bei dir 
keinen Namen. Und da sie keinen Namen hat, kannst du dich klarerweise an 
anderer Stelle auch nicht darauf beziehen. Es gibt einfach nichts worauf 
du dich beziehen könntest.
struct U_Bat_t
{
  uint16_t ist;
  uint16_t soll;
  uint16_t max;
} U_Bat;

Jetzt hat die Strukturbeschreibung selber einen Namen. Und zusätzlich 
wird auch gleich noch eine Variable davon definiert. Vorstehends ist 
bedeutungsmässig identisch zu
struct U_Bat_t               // so soll eine Variable aussehen
{                            // die vom Datentyp struct U_BAt_t ist
  uint16_t ist;
  uint16_t soll;
  uint16_t max;
};


struct U_Bat_t U_Bat;       // und hier ist so eine Varable

und dann kann ich mich klarerweise auch von woanders auf diese Variable 
mittels extern beziehen, weil ich den Datentyp davon benennen kann:
extern struct U_Bat_t U_Bat;

ob du die Variablen selbst dann auch noch volatile machst oder nicht, 
ist ein Detail, welches die Variablen betrifft, aber nicht die 
Strukturbeschreibung an sich.
struct U_Bat_t               // so soll eine Variable aussehen
{                            // die vom Datentyp struct U_BAt_t ist
  uint16_t ist;
  uint16_t soll;
  uint16_t max;
};


volatile struct U_Bat_t U_Bat;       // und hier ist so eine Varable
extern volatile struct U_Bat_t U_Bat;

Solange dir hier die syntaktischen Feinheiten noch nicht klar sind, rate 
ich dir, die Kurzfassung 'Strukturbeschriebung und Variablendefinition 
in einem Aufwasch' zu meiden und lieber die explizite Form zu 
bevorzugen:

Also nicht so
struct U_Bat_t
{
  uint16_t ist;
  uint16_t soll;
  uint16_t max;
} U_Bat;

sondern so
struct U_Bat_t               // so soll eine Variable aussehen
{                            // die vom Datentyp struct U_BAt_t ist
  uint16_t ist;
  uint16_t soll;
  uint16_t max;
};


struct U_Bat_t U_Bat;       // und hier ist so eine Varable

Dann hast du hier eine klarere Trennung zwischen der 
Sturkturbeschreibung an sich (dem Bauplan) und den Variablen (dem Haus, 
welches nach diesem Plan gebaut wird)

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Erklärung, ich werd es morgen gleich ausprobieren!

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles klar, jetzt hab ich begriffen.

Kann mir jemand ein guten C-Buch das sich auch mit AVRs Beschäftigt?
Ich habe z.Zt.:
"Mikrocomputertechnik mit Controllern der Atmel AVR RISC Familie"
und bin nur bedingt zufrieden.



Jens

Autor: Rainer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich mache das so:

struct {
    volatile unsigned int Stunde;
    volatile unsigned int Minute;
    volatile unsigned int Sekunde;
}Clock


dann:

extern struct {
    volatile unsigned int Stunde;
    volatile unsigned int Minute;
    volatile unsigned int Sekunde;
}Clock

Hab noch nie Probleme damit gehabt.

Viele Grüße
Rainer

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, wie gesagt, DAS hat bei mir nicht funktioniert.
Ich verwende das AVR-Studio.



Jens

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rainer schrieb:
> Also ich mache das so:
>
> struct {
>     volatile unsigned int Stunde;
>     volatile unsigned int Minute;
>     volatile unsigned int Sekunde;
> }Clock
>
>
> dann:
>
> extern struct {
>     volatile unsigned int Stunde;
>     volatile unsigned int Minute;
>     volatile unsigned int Sekunde;
> }Clock
>
> Hab noch nie Probleme damit gehabt.

Solange du immer 100% perfekt arbeitest und bei einer Strukturänderung 
immer alle Stellen veränderst, kannst du das natürlich machen.
Für alle, die so wie ich, gelegentlich auch schon mal Dinge vergessen, 
ist es aber deutlich einfacher, wenn es im kompletten System nur 1 
Strukturbeschreibung gibt, die überall benutzt wird. Damit kann es dann 
den Fall "Inkonsitente Änderungen" gar nicht geben. Ein Fehler den ich 
aufgrund des Programmaufbaus gar nicht machen kann, ist mir immer noch 
lieber als mich auf mein Gedächtnis verlassen zu müssen. Vor allen 
Dingen, wenn der Preis dafür ein Name im globalen Namensraum ist und 
sonst nichts.


Und schliesslich möchte man dann ja auch mal Struktur-Objekte an 
Funktionen als Argumente übergeben und sei es nur in Form eines Pointers 
darauf.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um nochmal auf meine Frage zu kommen:
Kann mir jemand ein guten C-Buch das sich auch mit AVRs Beschäftigt?
Ich habe z.Zt.:
"Mikrocomputertechnik mit Controllern der Atmel AVR RISC Familie"
und bin nur bedingt zufrieden.


Jemand n Tip für Mich?


Jens

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was hat das eine mit dem anderen zu tun? C ist C, und das ist es, ob auf 
irgendwelchen µCs oder einem PC.

Es sind allenfalls zusätzlich Spezialitäten zu betrachten, die manche 
µCs so mit sich bringen (wie der Harvard-Krampf "pgmspace.h" bei den 
AVRs), aber das ändert an der Funktionsweise von C selbst nichts.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK,
dann formuliere ich meine Frage für dich um:

Kenn jemand ne Alternative zu dem oben genannten Buch, bei dem auch C 
behandelt wird?



Jens

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> Um nochmal auf meine Frage zu kommen:
> Kann mir jemand ein guten C-Buch das sich auch mit AVRs Beschäftigt?
> Ich habe z.Zt.:
> "Mikrocomputertechnik mit Controllern der Atmel AVR RISC Familie"
> und bin nur bedingt zufrieden.


Wo liegt das Problem?

Die Sache ist die:
Ich kann mir schon vorstellen, dass dieses Buch sich auf die Anwendung 
von C auf AVR konzentriert. So ähnlich wie es auch das Tutorium macht.

Das heißt: allgemeine C-Themen werden stiefmütterlich behandelt, wenn 
überhaupt.

In diesem Fall wäre ein C-Buch angebracht, also ein Machwerk in dem es 
um C geht und um nichts anderes. Der "Kernighan&Ritchie Programmieren in 
C" ist ein immer wieder gern gegebener Buchtip. Arbeitet man von dem das 
erste Drittel/Hälfte auf dem PC durch, hat man einen C-Unterbau auf dem 
dann der µC-spezifische Teil aufsetzen kann ohne dass man ins Schwimmen 
kommt.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe hier noch die C-Kompaktreferenz Stand 2005 liegen, sollte ich 
mir den Schinken ma antun ;-) ?


Jens

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> Ich habe hier noch die C-Kompaktreferenz Stand 2005 liegen, sollte ich
> mir den Schinken ma antun ;-) ?

Besser als nichts.
Die Rezessionen auf Amazon sind nicht so schlecht.

Ob du damit klar kommst, kannst nur du wissen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.