Hi, eine Frage: Beispiel: int konto; main{ konto+1; konto+1; } wie geht das jetzt wenn ich die Funktion in einem anderen Sourcefile habe - wie kann ich erreichen, dass auch das die Variable Konto "überlebt". also so von der Idee: #include konto.h main{ konto(); konto(); } die Funktion ist in konto.h deklariert - aber wie erreiche ich, dass da die Variable auch quasi "global" liegt ? Gruß Sam
:
Verschoben durch Admin
Ist das keyword "extern" das, was du suchst? Beispiel: extern int konto;
Jedenfalls kann man nicht eine globale Variable konto und eine Funktion gleichen Namens nutzen. -> C-Grundlagen!
Vielleicht hast du so etwas vor:
1 | // hauptprogramm.c
|
2 | #include "konto.h" |
3 | |
4 | main() |
5 | {
|
6 | loesche_konto(); |
7 | // ...
|
8 | }
|
1 | // konto.h
|
2 | extern int konto; // Deklaration |
3 | |
4 | void erhoehe_Konto( int differenz ); |
5 | int kontostand(); |
6 | void loesche_konto(); |
1 | // konto.c
|
2 | |
3 | #include "konto.h" |
4 | |
5 | int konto = 0; // Definition |
6 | |
7 | void erhoehe_Konto( int differenz ) |
8 | {
|
9 | konto += differenz; |
10 | }
|
11 | |
12 | int kontostand() |
13 | {
|
14 | return konto; |
15 | }
|
16 | |
17 | void loesche_konto() |
18 | {
|
19 | konto = 0; |
20 | }
|
Damit könnte man in hauptprogramm.c auch direkt auf die Variable zugreifen. Das ist aber i.d.R. gar nicht sinnvoll. Besser wäre es meistens, das extern int konto aus konto.h zu entfernen und nur über die Funktionen indirekt auf den Wert zuzugreifen. Das erspart in größeren Programmen viel Ärger.
Wie wär es denn mal mit OOP anzufangen? class konto { int konto; public: void erhoehen(int add); ... };
Hey, danke für die Antworten: @Klaus, ok nur damit sicher bin das ich das richtig verstanden habe: --> ohne "extern" wird die lokale Variable konto beim Aufruf einer Funktion in konto.c angelegt und am Ende wieder freigegeben; wie geht das konkret jetzt beim linken mit "extern", wird die gleiche Funktion aufgerufen oder wird die auch in anderem Prozesskontext aufgerufen und die Variable als "global" deklariert ? "Das erspart in größeren Programmen viel Ärger" warum ? Ich mag die globalen Variablen bei main halt einfach nicht - daher habe ich gedacht, dass ich dadurch Übersichtlichkeit gewinne... @Samuel, ja daher komme ich ja - will meine AVR - Programme übersichtlicher machen ;) Gruß Sam
Das sind nun wirklich etwas komplexere Fragen über die man sich erstmal bei einem guten Glas Wasser und einem mindestens ebenso guten C-Buch Klarheit verschaffen sollte. Du bringst da einiges durcheinander: Was sind Deklarationen und Definition und wie unterscheiden sie sich? Was bewirkt im Detail das Schlüsselwort "extern" (was "static")? Was ist Scope (Sichtbarkarkeit) und wie wird das durch Deklaration resp. Definition beeinflusst? Was macht der Linker? Deine Frage und deren Formulierung vermittelt mir den Eindruck das Du wirklich nur eine sehr oberflächliche Idee von diesen Dingen hast, so das nicht einfach nur eine Unklarheit zu beseitigen ist, sondern eine komplette Einführung in das Thema nötig ist. Das aber solltest Du bitte selbst leisten.
Sam schrieb: > Hey, > > danke für die Antworten: > > @Klaus, > ok nur damit sicher bin das ich das richtig verstanden habe: > > --> ohne "extern" wird die lokale Variable konto beim Aufruf einer > Funktion in konto.c angelegt und am Ende wieder freigegeben; wie geht > das konkret jetzt beim linken mit "extern", wird die gleiche Funktion > aufgerufen oder wird die auch in anderem Prozesskontext aufgerufen und > die Variable als "global" deklariert ? Ohne extern, also mit einem "int konto;" außerhalb aller Funktionen wird eine globale Variable angelegt (das ist die Definition einer Variablen). Mit extern dagegen wird nur gesagt, daß sie in irgendeiner Übersetzungseinheit (also in irgendeinem der kompilierten C-Quelltexte) zu finden, aber nicht unbedingt in diesem. Das ist also die Deklaration einer Variablen. Stünde in der Headerdatei die Definition ohne extern, dann würde in jeder Übersetzungseinheit eine globale Variable angelegt werden (vom Compiler) und der Linker müsste sich dann aufregen, weil es mehrere globale Objekte mit demselben Namen gibt. Deshalb steht es mit extern in der .h und ohne in einer .c. Ähnlich ist es mit Funktionen:
1 | int fkt( int i ); // Deklaration, kann beliebig oft auftauchen |
2 | // geeignet für Headerdateien
|
3 | |
4 | int fkt( int i ) // Definition, darf nur einmal vorkommen |
5 | { // also in genau einer *.c einmal |
6 | // ...
|
7 | }
|
> > "Das erspart in größeren Programmen viel Ärger" warum ? Ich mag die > globalen Variablen bei main halt einfach nicht - daher habe ich > gedacht, dass ich dadurch Übersichtlichkeit gewinne... > > ... Ist ja auch richtig; dann brauchst du aber eben kein extern. Mach einfach alle Zugriffe über Funktionen in deiner konto.c (dort die Definitionen aller nötigen Funktionen und die Definition einer globalen Variablen). Die Deklarationen der Funktionen und ggf. der extern-Variablen kommen in die konto.h. Wenn du die globale Variable nicht brauchst (was ich empfehle), dann lass in der konto.h die Deklaration der Variablen weg. Zudem empfiehlt es sich dann, vor die Definition noch ein static zu schreiben, dann kann auch niemand mehr von einem anderen Quelltext aus darauf direkt zugreifen (ohne die Funktionen), weil die Variable dann nur noch in konto.c sichtbar ist. -> C-Grundlagen
.. mit C-Buch habt ihr ja alle Recht - aber bei mir ist eben die uC programmierung ein kleines Hobby, bei dem ich kleine Graben buddle ;-) Ich lesen 50% und rede die anderen 50% meiner Arbeitszeit in der Woche Zeug, dass ich in der Freizeit einfach mal was "machen" will :-))))
Wenn man sich nicht damit beschäftigen will, ist C die falsche Wahl. Wir haben auch noch etwas besseres zu tun, als jedem wieder neu die Grundlagen vorzukauen, nur damit keiner die Bücher lesen muss - die mal geschrieben wurden, um nicht jedem einzeln alles vorkauen zu müssen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.