Forum: Compiler & IDEs frage zur struct verwendung


von Markus (Gast)


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
1
 typedef struct
2
{
3
   uint8_t byte;
4
   uint8_t byte1;
5
   bool def;
6
7
} test1_t

dann habe ich die struct extern declariert
1
extern test1_t test1;

und in test.c nochmals erwähnt
1
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
1
#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
1
test1.byte = 0x0A;
2
   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
1
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

von Oliver (Gast)


Lesenswert?

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

So verstehe ich deinen Aufbau:

test.h:
1
 typedef struct
2
{
3
   uint8_t byte;
4
   uint8_t byte1;
5
   bool def;
6
7
} test1_t 
8
9
extern test1_t test1;

test.c:
1
test1_t test1;
2
3
void test(void)
4
{ 
5
    uint8_t temp = test1.byte;
6
}

main.c:
1
#include "test.h"
2
3
void main(void)
4
{
5
  test1.byte = 0x0A;
6
  test1.byte1 = 0xF0;
7
8
  test();
9
}

Wenn das bei dir so aussieht, sollte es funktionieren.

Oliver

von Oliver (Gast)


Lesenswert?

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

Oliver

von Markus (Gast)


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!

von Karl H. (kbuchegg)


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#Globale_Variablen_.C3.BCber_mehrere_Dateien

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.

von Alex (Gast)


Lesenswert?

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

von Grrrr (Gast)


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.

von Markus (Gast)


Lesenswert?

Ok, dann bin ich schon mal wieder einen Schritt weiter!

Vielen Dank für Euere Antworten!

Markus

von Karl H. (kbuchegg)


Lesenswert?

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

von hulu (Gast)


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

von Uwe H. (mistert)


Lesenswert?

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

also zum Beispiel:

get funktion
1
uint8_t test1_tGetByte(void)
2
{
3
   return test1.byte;
4
}

Set funktion
1
void test1_tGetByte(uint8_t byte)
2
{
3
   test1.byte = byte;
4
}

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.