frage zur struct verwendung

Gast #1629167
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
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
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!
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
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
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
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
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.