mikrocontroller.net

Forum: Compiler & IDEs Variable, global, local oder glolocal?


Autor: Norbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo C-Experten,

mein Programm habe ich bisher in einer .c- und einer .h-Datei 
untergebracht.

Der Übersicht wegen habe ich das Ganze nun aufgeteilt. Es entstanden 
sechs .c-Dateien und sechs zugehörige .h-Dateien.

Mein Problem:

Z.B. die Datei nr_drei.c enthält mehrere Funkionen welche in nr_drei.h 
deklariert werden.
Die localen Variablen werden ja in den jeweiligen Funktionen deklariert.
Es gibt aber auch Variable die in mehreren Funktionen in nr_drei.c 
benutzt werden. Muss ich diese in nr_drei.h deklarien?
Sind dies die globalen Variablen der Datei nr_drei.c

Und dann gibt es Variable die in mehreren .c-Dateien des ganzen 
Projektes benutzt werden. Diese deklariere ich in main.h.
Sind dies denn die globalen Variablen des Projektes?


Vielen Dank für eine Antwort

Norbert

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Norbert,

also ich mache das immer so:

Die Datei x.c enthält die Funktionen fx0(), fx1() und die Variablen vx0, 
vx1, die auch von anderen Dateien benötigt werden.
Dann deklariere ich fx0(), fx1(), vx0, vx1 in der Datei x.h.

Und alle anderen Dateien, die es benötigen includieren dann die Datei 
x.h

Somit weiß ich immer, in welcher Datei die Funktionen / Variablen stehen 
und in welchen anderen sie benötigt werden.


Und in main.h stehen nur allgemeine Definitionen, z.B.:

#define XTAL 11.0592e6
#define BAUD 9600


Peter

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Norbert,

>>Es gibt aber auch Variable die in mehreren Funktionen in nr_drei.c benutzt 
werden.

Nur hier, sonst nicht? Dann nimm static, ist in ANSI C für sowas da. 
Damit schränkst Du den Sichtbarkeitsbereich ein und die Namen 
kollidieren nicht mit Variablen in anderen Quelldateien. Das kannst du 
auch für Hilfsfunktionen benutzen, die nur in der Datei selbst verwendet 
werden sollen.

Peter

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag: und in der Headerdatei ist das ganze dann natürlich NICHT 
deklariert.

Autor: Notker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
static bewirkt aber nur, dass der Speicherplatz der Variablen bestehen 
bleibt und nicht bei jedem Prozeduraufruf dynamisch wieder angelegt 
werden soll, wie der Name static ja schon sagt. Variable des Typs 
"static" sind nur innerhalb des Blocks, in dem sie deklariert sind, auch 
sichtbar!
Für Variable, die im gesamten Programm zugänlich sein sollen (globale 
Variable), gibt es den Spezifizierer "extern".

Notker

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entweder hast Du mich falsch verstanden oder Du kennst nicht den 
Unterschied zwischen "static in Funktionen" und "static außerhalb von 
Funktionen". Steht aber wohl in fast jeder Einführung in Ansi C(ok, in 
den knowware Dingern für 8DM evtl. nicht)

static innerhalb von Funktionen verändert die Lebensdauer, wie Du 
geschrieben hast.

static außerhalb von Funktionen schränkt die Sichtbarkeit der Variablen 
(und auch Funktionen) auf das modul (also die eine Quelldatei) ein.

Wenn Norbert also in nr_drei.c eine variable errnr benutzt die außerhalb 
einer funktion definiert ist weil er sie in mehreren Funktionen von 
nr_drei.c braucht und außerhalb von nr_drei.c braucht er errnr nicht, 
kann/sollte er diese static definieren.

Das Modul kann dann leichter wiederverwendet werden da er es auch mit 
anderen Modulen linken kann die vielleicht auch zufällig ein eigenes 
errnr benutzen.

Peter

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe eine etwas anderes Problem. Ich will mit der IAR-Software 2 
Variablen im ganzen C-Programm zugänglich machen. Bei einer Variablen 
ist das kein Problem aber bei 2 oder mehr steigt der debugger aus und es 
geht nichts mehr.
Was könnte man hier machen, oder ist das ein IAR-Problem.

Gruß
Sascha

Autor: Lourdes Nuñez (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hola necesito tu opinion sobre el tema ne version castellana , soy
peruana y trabajo en gestion de riesgos. Me ayudas

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dem kann ich nicht ganz zustimmen. Würdest du das bitte begründen?

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein beispiel sagt mehr als 1000 Worte...

Schreib' in deine .h Datei

/* Externene Variablen aus modul xyz.c */
extern int var1;
extern unsigned long langevar;


und in die .c Datei

/* Variable die über xyz.h exportiert werden */
int var1;
unsigned long langevar;

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Werner:
Ich zerstöre ungern Illusionen, aber schau dir mal das Datum der
letzten paar Beiträge an. ;-)

Autor: Stefan Sczekalla (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

da ich da auch aktuell ein Thema hab möchte ich da doch gerne
einhaken.

ich hab eine funktion deklariert:

void blah ( uint8_t Key )
{
   static uint8_t state;
   (...)

    switch (state)
       case 0:
       /* machwas */
       if ( Key == irgendwas )
             state++
       break;
       case 1:
        /* machwasanderes */

       (... )
}

ich hatte das mit dem static jetzt so verstanden das "state" nur
innerhalb der funktion "sichtbar" ist und seinen wert "behält"

Oder mus ich dafür eine Globale variable nehmen ?

Grüße,

Stefan

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nee...
Schau dir bitte das dritte Posting Peter K. in diesem Thread an, da ist
das erklärt.

static innerhalb einer Funktion bedeutet etwas völlig anderes als
static vor globalen Variablen.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
p.s.: Variablen, die innerhalb einer Funktion deklariert werden, sind
immer nur innerhalb dieser Funktion sichtbar. Völlig egal, welchen
Modifizierer oder Speicherklasse du zuweist.

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Stefan

aber im Prinzip hast Du recht !
Du hast ja nicht behauptet es wäre nicht sichtbar weil es innerhalb der
funktion static deklariert worden ist.

;)
Werner

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das neudeutsche Stichwort hier heißt "Scope"

A) Global scope - Im gesamten Programm sichtbar; "extern" deklariert.
Anwendbar auf Variable und Funtionen.
B) File local scope  - nur innerhalb der Datei sicht- und verwendbar.
Verwendung des Schlüsselwortes "static" auf Dateiebene. Funtionen und
Variable.
C) Local scope - nur innerhalb des Blocks sicht- und verwendbar. Ein
Block wird durch "{" und "}" geklammert. In "C" können nur
(unsichersei - meine Compilertheorietage sind schon ein wenig her)
Variable einen lokalen scope haben, in "C++" auch Methoden. Nicht
static deklarierte Variable werden beim Betreten des Scope
(Programmfluss tritt in den Block ein) erzeugt und beim verslassen
wieder zerstört. Variablen des lokalen (lokaleren) Scope überschreiben
den Sichtbarkeitsbereich von Varibalen eines äußeren Scope.
z.B. ein "int i;" in einer Funktion hat innerhalb dieses
Funktions-Scope Vorrang vor einem globalen "double i;"
und ein "long i; innerhalb einer while() Schleife in dieser Funktion
hat wiederum innerhalb dieser while Schleife vorrang vor dem int i;.
(Bei C++ wird's noch etwas komplizierter - abhänging welcher Standard
unterstützt wird.)
Als static deklarierte Variablen werden beim Programmstart erzeugt und
behalten ihren Wert bis dieser exlizit geändert wird (ebenso wie global
Variable).
D) ??? mir fällt jetzt auf die schnelle kein weiterer ein.

Zu beachten bei globalen Variablen ebenso wie bei static Variablen ist
die "Reentranz" bzgl. der Interruptverarbeitung. Falls ein
Vordergrundprogramm (überlicherweise main()) auf eine globale Variable
zureifen will die von einer Interruptroutine geädert werden kann, so
muss dieser Zugriff bzw. die Änderung "atomar" erfolgen. In diesem
Zusammenhang ist auch das vielfach missverstandene Schlüsselwort
"volatile" einzuordnen.
Aber Reentranz und volatile sind eigentlich einen eigenen Thread Wert
(oder ein Buch?)

(schwitz-fertig)

Werner

Autor: Stefan Sczekalla (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

mir geht es eigentlich auch weniger um die "Sichtbarkeit" - ich
möchte eigentlich, das wenn immer die Funktion aufgerufen wird, die
Variable "state" noch mit dem gleichen Inhalt existiert, den sie am
ende der letztmaligen Ausführung der funktion hatte.

oder denke ich da jetzt um die Ecke ?

Grüße,

Stefan

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist immer dann gegeben, wenn sie statischen Speicher besitzt.  Das
Gegenteil zu statischem Speicher wäre automatischer Speicher.

Automatischen Speicher besitzen alle nicht näher spezifizierten
Variablen, die innerhalb einer Funktion deklariert sind.  Alles andere
ist mithin statisch, egal ob es in Werners Scope-Einteilung nach A, B
oder C zu sortieren wäre.

Deklaration als "static" innerhalb einer Funktion ist die
sinnvollste
Variante für diesen Zweck (weil dann der Scope auch noch auf den für
die notwendige Wirkung kleinsten Bereich eingeengt wird).

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.