www.mikrocontroller.net

Forum: Compiler & IDEs Probleme bein deklarieren


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich habe eine main.c und eine test.c

in der main.c wird eine globale variable definiert mit:

volatile uint8_t Variable = 0;

in der test.c habe ich sie wie folgt deklariert:

extern uint8_t Variable;

Ich bekomme den Fehler:

../main.c:35: error: conflicting type qualifiers for 'Variable'
../test.h:17: error: previous declaration of 'Variable' was here

Die Variable muss in der main stehen bleiben.

Was genau habe ich falsch gemacht??

:-(

Autor: weene (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nimm mit das volatile.....

gehört zum Variablentyp...

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Außerdem hast du unterschlagen, daß du die Variable auch noch in
test.h deklariert hast.

Wie denn?

Autor: Guckst Du (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei "extern..." muss meiner Ansicht nach, auch das volatile stehen.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja

Aber ob es unter dem Strich auch funktioniert (inkl.
Linken) hängt davon ab, wie es in test.h steht.

test.h ist aber leider geheim.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
natürlich wird die variabe in test.h deklariert. :-)

Jetzt klappts. Dank euch

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt ist mir doch noch ein Problem bzw. eine Frage in dem Zusammenhang 
gekommen.

gibt es eine Möglichkeit eine Art externen "define" zu machen??

so:
extern #define X

???

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian schrieb:
> Jetzt ist mir doch noch ein Problem bzw. eine Frage in dem Zusammenhang
> gekommen.
>
> gibt es eine Möglichkeit eine Art externen "define" zu machen??
>
> so:
> extern #define X

Wie sollte das denn gehen? extern ist eine Linker-Angelegenheit, und 
alle #defines werden schon vom Präprozessor, praktisch noch vor dem 
Compiler, aufgelöst, lange bevor der Linker an die Reihe kommt.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm... Macht Sinn.

Gibt es denn einen workaround?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, ein #define ohne extern.
Oder den Compiler entsprechend aufrufen, z.B. -DX

Oder was hast du vor?

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> Oder den Compiler entsprechend aufrufen, z.B. -DX

Das verstehe ich nicht.

Ich habe eine Variable "X" die ich in mehrern .c verwende. Sie sollte 
veränderbar sein. Sprich ich lege die Variable per #define in der main.c 
fest und sie wird entsprechend in allen anderen .c, welche sie ebenfalls 
verwenden, genutzt.

Muß ich mir denn statt eines #define eine globale Variable hierfür 
anlegen, auf die ich dann von den externen .c mit extern zugreife?

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

Bewertung
0 lesenswert
nicht lesenswert
Sebastian schrieb:

> Muß ich mir denn statt eines #define eine globale Variable hierfür
> anlegen, auf die ich dann von den externen .c mit extern zugreife?

http://www.mikrocontroller.net/articles/FAQ#Prakti...

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das hab ich gelesen und auch verstanden denke ich.

Mein Problem ist aber, dass ich 3 Variablen habe "sekunde" ,"minute" und 
"stunde". Sie sollen der Zeitgeber für eine Funktion Sein.

Da ich EINE dieser Variablen in MEHREREN .c verwende, möchte ich jetzt 
nicht jedes mal in jeden header der jeweiligen .c gehen und per define 
meine Zeitgeber Variable festlegen, sondern würde dies gerne von EINEM 
Punkt aus tun.

Vielleicht drücke ich mich falsch aus:
a.h
#define zeit sekunde

b.h
#define zeit sekunde

c.h
#define zeit sekunde

main.c
#define zeit sekunde // <-- die möchte ich umlegen und alle anderen sollen mitmachen


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

Bewertung
0 lesenswert
nicht lesenswert
Sebastian schrieb:
> das hab ich gelesen und auch verstanden denke ich.

Hast du auch den Teil mit dem

#define EXTERN extern

gelesen und verstanden?


> Da ich EINE dieser Variablen in MEHREREN .c verwende, möchte ich jetzt
> nicht jedes mal in jeden header der jeweiligen .c gehen und per define
> meine Zeitgeber Variable festlegen, sondern würde dies gerne von EINEM
> Punkt aus tun.

Dann mach dir doch EIN Header File, in dem deine Variablen und Makros 
enthalten sind und das includierst du dann wo du es brauchst.

time.h
******
#ifndef EXTERN extern

EXTERN uint8_t minuten;
EXTERN uint8_t sekunden;
EXTERN uint8_t stunden;

#define SEC_PER_MINUTE 60


main.c
******
#define EXTERN

#include "time.h"

int main()
{
  verwende minuten, sekunden, stunden
  und SEC_PER_MINUTE
}

time.c
******
#include "time.h"

int foo()
{
  verwende minuten, sekunden, stunden
  und SEC_PER_MINUTE
}

a.c
***
#include "time.h"

int bar()
{
  verwende minuten, sekunden, stunden
  und SEC_PER_MINUTE
}

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.