typedef struct

Gast #1151086
Hallo Leute,
ich habe folgendes Problem mit einer Struktur und sehe nicht warum ich 
einen Wert nicht aendern kann.

Folgendes Szenario.

project.c (Main Funktion)
1
project_info project_struct;
2

3
int main( void )
4
{
5
project_struct.state = state_wait;
6
project_struct.id = 0,
7

8
while(project_struct.state == state_wait){
9

10
irgentwann wird project_struct.state = state_control
11
und dann gehts weiter...funktioniert einwandfrei.
12

13
}
14
....
15

16
}


project.h
1
diverse includes 
2
unter anderem: 
3

4
#include "project_function.h"
5

6
typedef struct {
7
  BYTE id;                    // ID is used for delaying the response to broadcasts
8
  BYTE state;                 // State variable
9
} project_info;
10

11
extern project_info project_struct;

Jetzt moechte ich diese Struktur (genauer gesagt die id) in 
project_function.c (set_ID(BYTE *data)) veraendern.

project_struct.id = data;

Der Compiler gibt keine Fehlermeldungen raus, egal ob ich die project.h 
Datei in der project_function.c Datei einbinde oder nicht (habe diverse 
Optionen versucht, natuerlich auch die Struktur in project_function.c zu 
deklarieren). Der Wert project_struct.id bleibt aber immer 0;

Irgentwie habe ich gerade ein totales Blackout...
Vieleicht kann mir ja jemand auf die Spruenge helfen.
Gast #1151106
Ich sollte noch anmerken das ich die project_struct.id in 
project_output.c in einer For-Schleife verwende. Die For-Schleife wird 
immer so oft ausgefuehrt wie momentan in project.c am Anfang definiert 
wurde. Sollte aber durch die Funktion set_ID veraendert werden koennen.
Das Projekt funktioniert in der momentan Version, ich muss einfach 
einige "kleinere" Veraenderungen vornehmen. Habe das Projekt vor ein 
paar Tagen uebernommen.
Gast #1151121
Könnte das altbekannte volatile-Problem sein. Wenn der Compiler 
project.c übersetzt, sieht er nicht, das die ID an ganz anderer Stelle 
(in project_function.c) verändert wird.

Was konstant aussieht, darf als konstant behandelt und entsprechend 
optimiert werden.

Ausweg:
In project.c:
1
volatile project_info project_struct;

In project h:
1
extern volatile project_info project_struct;

Das zwingt den Compiler, jeden Zugriff so auszuführen wie er notiert 
ist.
Gast #1151146
@tuppes: Danke fuer die Antwort. Leider besteht das Problem weiterhin.

@Johann L.: im state_wait Zustand ist das RF Modul aktiv und sobald ein 
Befehl kommt zb: 'S' 'C' wird die set_CLOCK(BYTE *data) Funktion in 
project_function.c ausgefuehrt und der uC aktuallisiert seine Zeit 
entsprechen der gesendeten Daten. Mit 'S' 'I' (Befehl fuer set_ID) 
moechte ich den verschieden uC verschiedene ID zuordnen. Um deine Frage 
schlussendlich zu beantworten, mit dem Befehl 'S' 'R' gehts weiter zu 
state_control...
Gast #1152282
@Johann L.: Ich entschuldige mich, dass ich mich nicht klar ausgedrueckt 
habe. Ja, ID und STATE koennen bzw muessen sich auch durch Interrupts 
aendern (es wird aber nur geschaut ob ein IRQ Flag gesetzt wurde oder 
nicht). Mit STATE klappt das bis jetzt auch 
wunderbar(project_struct.state=sleep -> project_struct.state=control 
wenn das Alarm Flag gesetzt wurde)! aber eben nicht mit ID. STATE wird 
immer in project.c veraendert. ID sollte aber in project_function.c 
veraendert werden.
PS: Sorry fuer meine spaete Antwort
#1152309
Das du irrtümlich in der Setzfunktion eine lokale Variable gleichen 
Namens "project_struct" hast, kannst du 100% ausschliessen?

ANsonsten poste doch mal mehr Kontext. Aus den paar Sschnipseln kann man 
nicht wirklich was entnehmen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 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.