Das Elektor-Forum schließt seine Pforten (siehe auch http://www.elektormagazine.de/forum). Ab Freitag, den 15. März, ist es nicht mehr möglich, sich im Forum einzuloggen. Alle Inhalte des Forums bleiben jedoch bis Ende März noch sichtbar. Am 01. April wird das Forum schließlich komplett geschlossen.

Frage zu globalen Variablen und Unterprogrammen

Postby olivarius » Mon Mar 15, 2010 12:00 am

Verehrtes Forum, ich bitte um Hilfe,

beim Arbeiten mit ausgelagerten, selbstgeschriebenen Funktionen (ohne Übergabe- u. Rückgabewerten) ist mir folgendes aufgefallen:
Wenn ich eine globale Variable vor meinem Hauptprogramm definiere, kann ich diese nicht in meinen selbstgeschr. Funktionen nutzen; es erscheint eine Fehlermeldung. Erst, wenn ich diese globale Variable vor meinen selbstgeschr. Funktionen noch mal definiere (ohne Wertzuweisung), dann kann ich sie problemlos in allen Funktionen nutzen, sie bleibt dann auch beim Rücksprung ins Hauptprogramm erhalten. Ist es normal, dass ich die gleiche Variable zwei mal definieren muß?
(Ich arbeite mit dem JF-Editor und habe zwei Seiten, eine für das Hauptprogramm, die andere für die selbstgeschr. Funktionen.)

Gruß, Oliver
olivarius
 
Posts: 13
Joined: Fri Jan 03, 2014 2:13 pm

Postby rai » Mon Mar 15, 2010 12:00 am

Hallo Oliver,

denk mal über deinen Include Befehl nach:

Du hast in deiner einen Datei #include meine_funktionen.c drin stehen, d.h. alle ausgelagerten Funktionen kannst du erreichen.

Mit Include stellst du lediglich eine Verbindung in eine Richtung her.

Wenn das auch in die andere Richtung gehen soll, musst du in der Datei "meine_funktionen" die Datei die die main/die globale varia ble enthlät includieren.

mfg
Rai
rai
 
Posts: 45
Joined: Fri Jan 03, 2014 2:12 pm

Postby olivarius » Mon Mar 15, 2010 12:00 am

Hallo Rai,

danke für deine Antwort, aber ich benutze in diesem Fall keine (selbst-geschriebenen) include-Dateien (Header). (Das mit den Headern ist mir schon klar).
Ich benutze lediglich die Funktionsprototypen und muß die globalen Variablen vorm Haupt- sowie vorm Unterprogramm definieren. Warum?

Gruß Oliver
olivarius
 
Posts: 13
Joined: Fri Jan 03, 2014 2:13 pm

Postby μtronix » Tue Mar 16, 2010 12:00 am

Hallo Oliver,

wenn Du die globalen Variablen erst unmittelbar vor der main-Funktion definierst und die main ganz unten in der C-Datei bei Dir steht, ist das Problem klar: die darüber stehenden Funktionen kennen die Variable einfach (noch) nicht.
Dann bekommst Du die Fehlermeldung "undeclared identifier".

Definiere diese Variablen einfach am Anfang der Datei _vor_ den entsprechenden Funktionen - so bleibt es auch übersichtlicher.

Generell rate ich aber zu der Variante, in eigenen Funktionen nach Möglichkeit auch eigene (nach außen nicht sichtbare) Variablen zu definieren/zu verwenden oder ggf. auf Pointer zurückzugreifen, wenn große Datenmengen ausgetauscht werden sollen oder besondere Flexibilität nötig ist.


Bei weiteren Problemen schicke doch einfach mal ein paar Zeilen Code, mit dem Du getestet hast; dann ist es für alle Mitlesenden einfacher, sich des Problems anzunehmen.

Viele Grüße
Patrick
μtronix
 
Posts: 197
Joined: Fri Jan 03, 2014 2:12 pm

Postby olivarius » Tue Mar 16, 2010 12:00 am

Hallo Patrick,

die globalen Variablen habe ich ganz artig am Anfang definiert, trotzdem sagt der Compiler "undeclared identifier a". Ich habe den Code mal stark vereinfacht. Hier die "Registerkarte" 1 im JF-Editor:

#include
#include

unsigned char a; // Definition einer globalen Var.

extern void test (void);

/*** Start Hauptprogramm ***/

void main (void)
{
test();
a=a+3 // wird als globale Variable vom Comp. akzeptiert
}


und hier die "Registerkarte 2 im Editor mit dem Unterprogramm:


void test (void)
{
a=a+5; // Compiler sagt: undeclared identifier a (oder so ähnlich)
}



Vielen Dank für die Hilfe!
Gruß
Oliver
olivarius
 
Posts: 13
Joined: Fri Jan 03, 2014 2:13 pm

Postby olivarius » Tue Mar 16, 2010 12:00 am

Nachtrag:

die include-Anweisungen sind bei Kopieren z.T. verschütt gegangen:

#include stdio.h
#include at89c51cc03.h

scheinbar können die "größer/kleiner als" Zeichen nicht hier gepostet werden?
olivarius
 
Posts: 13
Joined: Fri Jan 03, 2014 2:13 pm

Postby μtronix » Tue Mar 16, 2010 12:00 am

Hallo Oliver,

nun verstehe ich erst, daß Du mit den "zwei Seiten" wohl die beiden Dateien meinst, die Du im JFE angezeigt bekommst. Dann ist das Problem natürlich klar:
Du machst zwar auf der einen Seite in der Datei mit der main-Funktion derselben die externe Funktion "test" bekannt. Andererseits weiß aber die Funktion "test" in Deiner zweiten Datei nicht, wo die Variable "a" zu finden ist, da sie weder lokal noch global dort definiert worden ist. Abhilfe schaffst Du ganz einfach, indem Du die Variable dort als extern vorhanden kenntlich machst(deklarierst).

Schau mal im Anhang in die Dateien, dann wird hoffentlich alles klar sein.
Attachments
extern.zip
(1.85 KiB) Downloaded 49 times
μtronix
 
Posts: 197
Joined: Fri Jan 03, 2014 2:12 pm

Postby olivarius » Tue Mar 16, 2010 12:00 am

Hallo Patrick,

ja prima, jetzt habe ich es verstanden. Also müssen die Variablen auf zweiten Seite einfach bekannt gemacht werden! Und "extern" heißt das Zauberwort.

Herzlichen Dank!

Schönen Gruß,
Oliver
olivarius
 
Posts: 13
Joined: Fri Jan 03, 2014 2:13 pm


Return to Mikrocontroller-Fernlehrgang (TFH)

Who is online

Users browsing this forum: No registered users and 1 guest