Forum: Compiler & IDEs Definition von Variablen...


von Techniker (Gast)


Lesenswert?

Hi!

Ich habe eine Funktionsroutine geschrieben, die ich zukünfig in versch.
"Projekten" wieder benötigen werde.

Um nun nicht immer den Code kopieren zu müssen und das ganze etwas
eleganter zu machen, will ich die Funktion als 2. C-File einbinden.

Da die Funktion später mittels 10ms-Interrupt vom Targetfile aus
aufgerufen wird und durch die Funktion 2 globale Chars geändert werden,
hatte ich die Variablen als "volatile unsigned char x,y;" definiert.

Nun habe ich meine Funktion in ein 2. C-File ausgelagert und kann vom
Targetfile aus die Variablen nicht mehr sehen... :-(

WinAVR bringt auch keinen Fehler..

Das ganze hört sich jetzt etwas durcheinander an.. Sorry... :o)

Aber ich hoffe ich könnt mir folgen, was ich meine...

WIE muß ich nun WO die Variablen definieren, dass ich Sie ÜBERALL und
JEDERZEIT bearbeiten kann? :-)

Schonmal im Vorraus danke für jeden Tipp!

von edvdoctor (Gast)


Lesenswert?

Verstehe ich auch nicht richtig. Du kannst sie nicht sehen, aber WinAVR
bringt kein Fehler?
Schreib sonst mal in die Datei, in der Du die Variablen nicht sehen
kannst, "extern variablenTyp variablenName;" oben hin. Oder erkläre
das Problem besser, vielleicht mit einem Beispiel.

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

das Zauberwort heißt extern. Du mußt deine globalen Variablen in einem
C-File definieren und in einem globalen Headerfile mittels extern
bekannt machen.

Matthias

von Techniker (Gast)


Lesenswert?

Hallo!

Danke für eure Tipps! :-)

Hab das Problem gelöst! War aber ganz was anderes!

Hab mit #ifndef in der Serviceroutine abgefragt, ob die Variablen schon
initialisiert wurden. Da die darauffolgende #define nur bis zum
Dateiende gilt wurde jedesmal, wenn die Routine aufgerufen wurde, die
Variabeln neu initialisiert!

;)

Trotzdem danke!

von Unbekannter (Gast)


Lesenswert?

???

Präprozessor-Anweisungen (#ifndef, #define, ...) werden aber während
des compilierens ausgewertet, und nicht während der Laufzeit...

von Techniker (Gast)


Lesenswert?

Das weiß ich auch! :-)

Aber irgendwie wollte WinAVR den Code nicht!?!?

Er lautete so:

void MATRIX (void)
{
 #ifndef INIT_MATRIX
 #define INIT_MATRIX
 COUNT_MATRIX = 0xAA;
 SELECT_MATRIX = 0x00;
 #endif

 ..Weiterer_Code..

}

Laut dem Buch "C für Microcontroller" gilt die #define-Anweisung nur
bis zum Dateiende. Daher nehme ich mal an, dass hier "der Hund
begraben liegt" ;-)

Jedenfalls hab ich jetzt für die Initialisierung eine eigene Funktion
erstellt, die ich hald beim Programmstart einmal aufrufe und nun
funktionierts!

Hab zum Debugging den Wert von COUNT_MATRIX auf die LEDs ausgegeben und
dabei festgestellt, dass sich der Wert nie geändert hat.. :-/

Ist trotzdem komisch.. 8-)

von Peter Dannegger (Gast)


Lesenswert?

> Laut dem Buch "C für Microcontroller" gilt die #define-Anweisung
nur
> bis zum Dateiende. Daher nehme ich mal an, dass hier "der Hund
> begraben liegt" ;-)

Das ist Mumpitz, denn dann dürfte ja kein Include mehr funktionieren.

Ein #define gilt immer bis zum Ende des zu compilierenden Objects, wenn
es nicht vorher aufgehoben wurde (#undef).
Es lebt also immer über das Ende einer Include-Datei hinaus.


Und globale Variablen kannst Du natürlich initialisieren, eine extra
Funktion dazu ist nur Codeverschwendung. Du darfst es eben nur in einem
Object tun !

Nimm mal die anderen Tips ernst und schau Dir das Schlüsselwort
"extern" genauer an. Oder schaue einfach mal in andere h-Files.

Es wurde ja schon an anderer Stelle bemängelt, daß der GCC durch
Tolerieren des fehlenden "extern" mehr Verwirrung stiftet, als
nützt.


Peter

von Daniel B. (khani)


Lesenswert?

Also bitte !

Präprozessor-Direktiven leben definitiv nur bis zum Dateiende !
"#define" und Konsorten gehören dazu.

Jetzt zum Einbinden von Headern :

Diese besitzen meist das folgende Konstrukt um ihren Rumpf:
#ifndef HEADER_H
#define HEADER_H HEADER_H

...

#endif

Das dient dazu, Fehler zu vermeiden, wenn mehrere Header zu einer
Implementierungsdatei hinzugefügt werden. Dann kann es nämlich
passieren, dass Header-Datei 1 und Header-Datei 2 beide die
Header-Datei 3 "#include"en. Sichert man sich nicht ab, so führt dies
zu einem Fehler, wenn Header 1 und Header 2 zu einer
Implementierungsdatei hinzugefügt werden.

Die Lebenszeit der Konstanten HEADER_H aus obigem Beispiel geht genau
bis zum Dateiende (JETZT kommt's !) der Datei, in die der Header
eingebunden wird. Dieses Verhalten ist sher wichtig, wenn ein Projekt
nämlich mehrere Implementierungsdateien enthält, soll ein Header, der
beim Kompilieren dieser jeweils eingebunden wird auch jedes mal
eingebdunden werden !

Wenn das noch nicht klar ist, dann kann ich noch ein Bildchen malen.
Ich möchte Peter nicht komplett widersprechen - einem Anfänger, der
z.B. extern nicht kennt, ist aber unter Umständen der Begriff "zu
kompilierendes Object" nicht unbedingt klar und schon garnicht
abgegrenzt.

MfG, Daniel.

von Peter Dannegger (Gast)


Lesenswert?

> Die Lebenszeit der Konstanten HEADER_H aus obigem Beispiel geht genau
> bis zum Dateiende (JETZT kommt's !) der Datei, in die der Header
> eingebunden wird.

Ebern nicht !

Wenn diese Datei wieder irgendwo includiert wird, dann ist sie auch in
dieser Datei gültig.

Die Gültigkeit kann sich also über beliebig viele Includes erstrecken,
völlig unabhängig von deren Ende.

Sie besteht also bis zum Ende des zu compilierenden Objects.
Dieses ist natürlich in der Regel identisch mit dem Ende derjenigen
Datei, die dem Compiler als Source angegeben wird.

Es ist also das Ende nur einer ganz bestimmten Datei und nicht das Ende
von Dateien allgemein.

Ich denke, man sollte schon sprachlich präzise sein.


Peter

von Daniel B. (khani)


Lesenswert?

Hallo Peter,

ich denke, ich weiß genau was Du meinst - wir scheinen eh aneinander
vorbei. Weder Du (so meine ich) noch ich (da bin ich mir sicher) müssen
was die Konstantendefinition angeht noch etwas lernen - das habe wir
schon drauf.

Meine Absicht war es die Sache zu erläutern - sprachliche Spitzen sind
mir egal.

MfG, Daniel.
P.S.: Wenn sich noch jemand zu Thema Präprozessordirektiven unterhalten
mag, dann schlage ich im Sinne der Verbunheit mit dem eigentlichen Thema
einen neuen Thread vor.

von Daniel B. (khani)


Lesenswert?

Korrekturen : " wir scheinen aneinander vorbei zu reden" ;-)
Übrigens : Ich habe recht, wenn man's genau überdenkt - Du auch, wenn
man's ebenfalls überdenkt.

MfG, Daniel.

von Unbekannter (Gast)


Lesenswert?

> Laut dem Buch "C für Microcontroller" gilt die #define-Anweisung
> nur bis zum Dateiende.

Das ist natürlich in der Tat quatsch. Pre-Prozessor-Anweisungen gelten
für die Übersetzungseinheit, nicht für einzelne Dateien.


> Daher nehme ich mal an, dass hier "der Hund begraben liegt" ;-)

In der Tat. Allerdings beim Buch. Leider keine Ausnahme. Scheint ein
typisch deutsches Problem zu sein, dass jeder Huge-Dubel meint über ein
Thema schreiben zu müssen, obwohl er keinen Plan davon hat.

Also, ab in die Tonne damit.

von Rolf Magnus (Gast)


Lesenswert?

Ihr benutzt nur unterschiedliche Terminologien ("die Datei" vs. "das
zu compilierende Objekt") für das, was offiziell Übersetzungseinheit
(translation unit) heißt. Ansonsten meint ihr das gleiche.

> Scheint ein typisch deutsches Problem zu sein, dass jeder
> Huge-Dubel meint über ein Thema schreiben zu müssen, obwohl er
> keinen Plan davon hat

Ob's daran liegt, weiß ich nicht. Ich habe jedenfalls schon lange kein
deutschsprachiges Programmierbuch mehr gekauft.

von Unbekannter (Gast)


Lesenswert?

@Rolf Magnus:

> Ich habe jedenfalls schon lange kein
> deutschsprachiges Programmierbuch mehr gekauft.

Da hast Du nix verpasst.

Was an deutscher "Fach"literatur erhältlich ist, ist ein Trauerspiel
(bis auf sehr wenige Ausnahmen einiger handvoll Autoren).

Entweder sind die Bücher auf unterstem Niveau: "Klicken sie hier,
klicken sie dort, drücken sie nacheinander die Tasten 'v', 'o',
'i', 'd' gefolgt von der Leertaste", oder der Autor versucht durch
Beamtendeutsch möglichst inetelligent zu klingen.

Vor allem im Informatikbereich ist es schlimm, aber auch in den vielen
anderen Fachgebieten, wie z.B. auch Elektronik.

von pebisoft (Gast)


Lesenswert?

....Was an deutscher "Fach"literatur erhältlich ist, ist ein
Trauerspiel
(bis auf sehr wenige Ausnahmen einiger handvoll Autoren)....

von diesen o.g. nichtsnutzen(autoren) trollen sich bestimmt auch einige
hier im forum rum, um für die bücher zu ........
mfg pebisoft

von Übersetzerfeind (Gast)


Lesenswert?

Das Problem sind die Überstzungen!

Teilweise SACHLICH falsch = einfach nur falsch übersetzt.
Die Übersetzer nd die Lektoren haben vom "speziellen"-Fachlichen
üblicherweise keine Ahnung.

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.