frage zur struct verwendung

Gast #1629167
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
Gast #1629182
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
Gast #1629198
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!
#1629217
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.
Gast #1629225
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.
Gast #1630449
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren