mikrocontroller.net

Forum: Compiler & IDEs frage zur struct verwendung


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen!

Befasse mich seit kurzem mit C und einem Mega88 und bin nun auf die 
Möglichkeit gestossen struct zu verwenden.

Folgendes habe ich ausprobiert.

Ich habe eine struct angelegt, in test.h
 typedef struct
{
   uint8_t byte;
   uint8_t byte1;
   bool def;

} test1_t 

dann habe ich die struct extern declariert
extern test1_t test1;

und in test.c nochmals erwähnt
test1_t test1;

nun müsste ich doch  auf die struct von allen anderen .c Files zugreifen 
können, in die ich test.h über
#include
 einbinde, oder?

in main.c habe ich #include test.h eingefügt, sowie in test.c.

in main.c möchte ich nun die variablen test1.byte und test1.byte1 mit 
werten beschreiben und in test.c möchte ich diese variablen verändern 
und auf ein display ausgeben.
Zum Beispiel so
test1.byte = 0x0A;
   test1.byte1 = 0xF0;

ich habe nun das problem, dass wenn ich in test.c den wert von 
test1.byte einer zwischenvariable z. B. temp übergeben möchte, mit der 
ich dann "weiterrechnen" kann, kein wert in die zwischenvariable temp 
geschrieben wird. die zwischenvariable wird immer mit 0 beschrieben.
Wollte es so machen
temp = test1.byte

Verstoße ich damit gegen etwas, weil es nicht funktioniert?
Habe ich etwas grundsätzliches nicht verstanden?
Der Compiler gibt keine Fehlermeldung aus.

Vielen Dank für Eure Mühen!

Gruß

Markus

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, zwar etwas wirr, aber wenn ich alles richtig verstehe, sollte es so 
funktionieren.

So verstehe ich deinen Aufbau:

test.h:
 typedef struct
{
   uint8_t byte;
   uint8_t byte1;
   bool def;

} test1_t 

extern test1_t test1;

test.c:
test1_t test1;

void test(void)
{ 
    uint8_t temp = test1.byte;
}

main.c:
#include "test.h"

void main(void)
{
  test1.byte = 0x0A;
  test1.byte1 = 0xF0;

  test();
}

Wenn das bei dir so aussieht, sollte es funktionieren.

Oliver

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In test.c gehört noch das #include "test.h" hinein, das habe ich 
vergessen.

Oliver

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Oliver!

Vielen Dank für Deine Antwort!

Genau so habe ich das gemeint.

Also, liege ich richtig damit, dass ich aus jeder belieben .c auf meine 
struct lesend und schreibend zugreifen kann, so lange ich test.h in 
diese einbinde?

Bin noch nicht so sicher im "C Denken"...
Danke nochmals!

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

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:

> Also, liege ich richtig damit, dass ich aus jeder belieben .c auf meine
> struct lesend und schreibend zugreifen kann, so lange ich test.h in
> diese einbinde?

Absolut.

Allerdings musst du 2 Dinge auseinanderhalten, die eigentlich nichts 
miteinander zu tun haben
Das eine ist der Mechanismus, wie man sich globale Variablen schafft. 
Das ist die Sache mit dem 'extern' und der eine 'Erwähnung'. (Das was du 
Erwähnung nennst, heißt in der Literatur 'Definition'). Der Mechanismus 
ist unabhängig vom Datentyp und funktioniert immer gleich.
http://www.mikrocontroller.net/articles/FAQ#Global...

Das andere sind Strukturen, die dazu dienen, sich einen Datentyp zu 
schaffen, der mehrere Bestandteile zu einem Ganzen zusammenzufassen.

Übrigens: Gratuliere, das du das alleine rausgefunden hast. Oft dauert 
es viele Postings, bis man einen Fragesteller soweit hat, dass er über 
dein Verständnis der Zusammenhänge verfügt.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann es sein dass das Auslesen der Struktur wegoptimiert wird? Einfach 
mal mit volatile versuchen.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alex schrieb:
> Kann es sein dass das Auslesen der Struktur wegoptimiert wird?

Wieso sollte es das Deiner Meinung nach?

Alex schrieb:
> Einfach
> mal mit volatile versuchen.

Nicht versuchen. Dann anwenden wenn eine Variable im Interrupt verwendet 
wird.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, dann bin ich schon mal wieder einen Schritt weiter!

Vielen Dank für Euere Antworten!

Markus

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

Bewertung
0 lesenswert
nicht lesenswert
Wie gesagt:
An den Ausschnitten, die du gezeigt hast, liegts nicht.
Wenn du das Problem nicht in den Griff kriegst: Zeig alles

Autor: hulu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Grrrr schrieb:
>> Einfach
>> mal mit volatile versuchen.
>
> Nicht versuchen. Dann anwenden wenn eine Variable im Interrupt verwendet
> wird.

Dann anwenden wenn nicht optimiert werden soll oder/weil sich ein Wert 
ohne Programmeinfluss ändern kann

Autor: Uwe H. (mistert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schöner/sauberer wäre es abstrakte datentpen abzubilden und set/get 
funktionen dafür zu schreiben :)

also zum Beispiel:

get funktion
uint8_t test1_tGetByte(void)
{
   return test1.byte;
}

Set funktion
void test1_tGetByte(uint8_t byte)
{
   test1.byte = byte;
}

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.