Globale Variable unbekannt

#2509396
Mit extern sagst du nur, dass es noch irgendwo eine Variable gibt. Der 
Speicher dafür wird aber nicht angelegt und somit existiert diese 
Variable noch nicht.

Also musst du noch in die entsprechende c-Datei, die die Variable 
bereitstellen soll ein
1
OS_EVENT *Semaphore
reinschreiben.

Gruß
Marius
#2509397
aaaaaa schrieb:
> Hallo
>
> ich habe in uCOS eine globale Variable in einer C-Datei mit
>
>
1
extern OS_EVENT *Semaphore
>
> deklariert. Aber komischer Weise ist die Variable in einer anderen Datei
> unbekannt.
>
> Sollte mit extern die Variable in den anderen Dateien nicht auch bekannt
> sein.

Nö.
Warum sollte es das?

Der COmpiler übersetzt jedes *.c File für sich getrennt und unabhängig 
von allen anderen. Was du in a.c reinschreibst hat für den Compiler 
keinerlei Auswirkungen oder Konsequenzen, wenn er b.c compiliert.

http://www.mikrocontroller.net/articles/FAQ#Globale_Variablen_.C3.BCber_mehrere_Dateien
Gast #2509411
>Warum sollte es das?

Da es eine globale Variable ist und davon ausgegangen bin dass mit 
extern diese Variable auch sichtbar ist.

Genügt es nur in einer Datei das extern zu schreiben oder muss dass in 
allen Dateien vorhanden sein.

Wenn ich aber in unterschiedlichen Dateien

[c]extern OS_EVENT *Semaphore[c]

und

[c]OS_EVENT *Semaphore[c]

schreibe greift es schon auf dieselbe Variable obwohl es 
unterschiedlicher Speicher ist.
Gast #2509448
Einmal im ganzen Programm muss das
1
OS_EVENT *Semaphore
 stehen.
Damit wird der Speicher für die Variable belegt.

Das
1
extern OS_EVENT *Semaphore
 kommt in jede andere Datei, aus der  auf die oben genannte Variable 
zugegriffen wird.
Gast #2509498
>Da es eine globale Variable ist und davon ausgegangen bin dass mit
>extern diese Variable auch sichtbar ist.

>Genügt es nur in einer Datei das extern zu schreiben oder muss dass in
>allen Dateien vorhanden sein.

>Wenn ich aber in unterschiedlichen Dateien
1
extern OS_EVENT *Semaphore

>und
1
OS_EVENT *Semaphore

>schreibe greift es schon auf dieselbe Variable obwohl es
>unterschiedlicher Speicher ist.

Hier kommen zwei resp. drei irrige Auffasssungen zusammen.

Wenn sich "es" in Deinem ersten Satz auf
1
extern OS_EVENT *Semaphore
bezieht so handelt es sich nicht um eine Variable.

Vielmehr ist das die Deklaration einer Variablen.
Diese sagt "es existiert an irgendeiner anderen Stelle im Projekt (also 
in einer anderen C-Datei) eine Variable dieses Namens. Bitte greife, 
wenn ich diesen Namen in dieser_ C-Datei verwende auf den _dort 
reservierten Speicher zu.
Die Lesart des Wortes "extern" als "mache diese Variable, von aussen 
sichtbar" ist falsch. Vielmehr muss dies, wie eben beschrieben, als 
"nimm an, das irgendwo anders eine Reservierung existiert", gelesen 
werden.

Im Gegensatz dazu ist
1
OS_EVENT *Semaphore
keine Deklaration sondern eine sog. "Definition". Hier wird tatsächlich 
Speicherplatz reserviert.

Demzufolge ist auch der Nachsatz

>...schreibe greift es schon auf dieselbe Variable obwohl es
>unterschiedlicher Speicher is
falsch. Denn der Speicher wird nie mehrfach reserviert obwohl dann alle 
Verweise doch auf die selbe Variable zugreifen. Das wäre garnicht 
sinnvoll, diesen Speicher mehrfach zu reservieren. Entweder dürfte dann 
doch nur einer benutzt werden, oder bei der Änderung einer der 
Speicherbereiche müssten alle anderen die für die selbe Variable 
reserviert sind mit geändert werden.

Ich empfehle Dir die intensive Lektüre eines guten C-Buches zu den 
Stichworten "Deklaration", "Definition" und den Schlüsselworten "extern" 
und "static".

Antwort schreiben

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